ITCooky Recetas

Vamos a cocinar it cositas

¡Script de Powershell para actualizar el cliente 1C Enterprise en varias PC a través de la red!

дата marzo 1, 2020

Powershell también resulta útil … si crees en él … ¡si lo obligas! Hay mil PC y un especialista en TI (también es administrador de sistemas, especialista en infraestructura, «o sos el de compus», cargador, contador), y hay que actualización 1C 8.3 anteayer!
¡1C en sí también es algo maravilloso, la base de datos está vinculada a una versión específica del cliente que busca y ejecuta en la PC del usuario! Y las versiones de este cliente se actualizan varias vecrs al año y funcionan solo con una versión específica de la base de datos, no es una chatarra como SAP GUI con actualizaciones menores solo cada 5 años – 1C es un sistema vivo, siempre necesita corregir algnos bugs y patearlo con trapos meados para que trabaje!

Pero, volviendo a Powershell, para que funcione en las computadoras, deben estar en el dominio AD, ¡Y los permisos para ejecutar Powershell Remote deben estar aestablecidos de alguna manera a través de AD GP!

El script de Powershell no se puede iniciar haciendo doble clic o a través del icono (si no lo crea, intentelo). Primero, ejecute ISE como administrador, y usted mismo debe ser un administrador de AD; de todos modos, tendrá que jugar con los derechos, ¡pero tuve suerte y los administradores que se fugaron de este trabajo antes que yo ya solucianoron el probelma de derecho! No hay comandos para verificar si Powershell se puede ejecutar en una PC remota, pero puede iniciar una sesión remota de Powershell en ISE (debe esperar un minuto, no responde de inmediato) e intentar ejecutar algo, ¡si funciona pues funciona!

Actualizaremos en tres etapas.
1. Interrogar PCs disponibles en la red para la presencia de 1C y su versión
2. Envíeles un comando para instalar una nueva versión de 1C
3. Una vez más, interrogamos y descubriremos si ha aparecido una nueva versión de 1C en la PC

Script de Powershell para obtener la versión del software en una PC remota
Necesito un archivo con hosts, lo saco de AD de los grupos de computadoras. Primero borramos hosts.txt y luego cargamos las listas de OU y hacenis nuevi archivo.

rm $PSScriptRoot\hosts.txt
Get-ADComputer -Filter * -SearchBase “OU=DESKTOPS,OU=NIZHNEWARTOVSK,OU=Russia,OU=All,DC=com,DC=tesla,DC=local” | select -exp Name | ForEach-Object { Add-Content $PSScriptRoot\hosts.txt "$_"}
Get-ADComputer -Filter * -SearchBase “OU=NOTEBOOKS,OU=NIZHNEWARTOVSK,OU=Russia,OU=All,DC=com,DC=tesla,DC=local” | select -exp Name | ForEach-Object { Add-Content $PSScriptRoot\hosts.txt "$_"}

Ahora estamos interrogando a estos hosts, ya sea que estén accesibles a través de la red, si no, escribimos lo que no está en el archivo result_down.txt. Estamos buscando el nombre del fabricante del software. Puede estar en inglés (1C-Soft, por alguna razón), en ruso (1C-Soft, claramente), y posiblemente en algún otro.

A la misma vez estamos buscando la versión que necesitamos instalar 8.3.16.1148, ¡por si a caso ya está instalada!



rm $PSScriptRoot\hosts_to_add.txt
rm $PSScriptRoot\hosts_down.txt
rm $PSScriptRoot\allready_installed.txt
Get-Content $PSScriptRoot\hosts.txt | ForEach-Object {
if(!(Test-Connection -Cn $_ -BufferSize 16 -Count 1 -ea 0 -quiet))
{ 
Add-Content $PSScriptRoot\hosts_down.txt "$_"
} else {
$1cversion = Get-WmiObject -Class Win32_Product -ComputerName $_ | where{$_.Vendor -like "1C-Soft" -or $_.Vendor -like "1С-Софт"} | select -exp Version
if($1cversion -like "8.3.16.1148"){ 
Write-Host "$_ - Allready installed 8.3.16.1148"  -ForegroundColor Cyan
Add-Content $PSScriptRoot\allready_installed.txt "$_"
} else { 
Write-Host "$_ - Not present 8.3.16.1148"  -ForegroundColor Cyan
Add-Content $PSScriptRoot\hosts_to_add.txt "$_"
Get-Service remoteregistry -ComputerName "$_" | start-service
}
}
}

¡Por cierto, esta encuesta, dependiendo del horrible estado de PCs, tomará un día hábil de 8 horas para aproximadamente 1000 PC (viejo-nuevo)! ¡Bueno, debe hacerlo durante el horario comercial cuando la PC está en línea!

Script de Powershell para instalar software en múltiples computadoras a través de la red
Ahora resulta que no puedes simplemente iniciar sesión en PC remotas usando Powershell y ejecutar una instalación silenciosa allí (para 1C con argumento /quiet) desde el kit de distribución en un recurso compartido de red. Solo puede ejecutar desde carpetas locales, así que primero copie los archivos de instalación en la PC remota y luego ejecútelos.



Get-Content $PSScriptRoot\hosts_to_add.txt | ForEach-Object {
Get-Service remoteregistry -ComputerName "$_" | start-service
Write-Host "$_ - Copying files to host wait"  -ForegroundColor Red
Copy-item -Path "\\RUNVFS1002937446777\soft\1C83\8_3_16_1148" -Destination "\\$_\c$\windows\temp\" -Recurse -force
Write-Host "$_ - Starting quiet installation porcess"  -ForegroundColor Cyan
$InstallString = "C:\windows\temp\8_3_16_1148\setup.exe /quiet"
([WMICLASS]"\\$_\ROOT\CIMV2:Win32_Process").Create($InstallString)

Esto también lleva un día de trabajo para 100 PC, para las viejas mucho más tiempo que para las nuevas, ¡a veces el proceso se para por media hora así como así!

Script de Powershell para verificar la versión del software en varias computadoras en una red
Aquí, por un lado, lo hago a lo tonto, solo estamos buscando una versión en toda la salida de los programas instalados, ¡creemos que es única!
Y, por otro lado, esta es la forma más segura de encontrarlo: si lo hace de manera inteligente, primero busque por el fabricante 1C, ¡entonces no siempre encuentra una nueva versión, incluso si la instalación es exitosa!



rm $PSScriptRoot\result_installed.txt
rm $PSScriptRoot\result_not_installed.txt
Get-Content $PSScriptRoot\hosts_to_add.txt | ForEach-Object {
if(!(Test-Connection -Cn $_ -BufferSize 16 -Count 1 -ea 0 -quiet))
  { 
Write-Host "$_ is down"  -ForegroundColor Red
  } else {
$1cversion = Get-WmiObject -Class Win32_Product -ComputerName $_ | where{$_.Version -like "8.3.16.1148"} | select -exp Version
if($1cversion -like "8.3.16.1148"){ 
Add-Content $PSScriptRoot\result_installed.txt "$_"
Write-Host "Yes for $_"  -ForegroundColor Cyan
} else {
Add-Content $PSScriptRoot\result_not_installed.txt "$_"
Write-Host "No for $_"  -ForegroundColor Red}
}
}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *