ITСooky

IT-рецепты съедобные и не очень!

Скрипт Powershell для обновления клиента 1С Предприятие на нескольких доменных ПК по сети!

дата 01.03.2020

Powershell оказывается тоже может быть полезным… если в него поверить… если его заставить! Есть тысяча ПК и один IT-специалист(он же системный администратор, специалист инфраструктуры, тыжайтишник, грузчик, бухгалтер), обновить 1С 8.3 Предприятие надо вчера! 1С сам по себе тоже замечательная штуковина, запускаешь базу и она привязана к определенной версии клиента, которую ищет и запускает на ПК пользователя! А версии этого клиента обновляются по цать раз в год и работают только с конкретной версией базы, это вам не SAP-GUI какой-нибудь — минорные обновления каждые 5 лет — 1С это живая система постоянно надо что-то допиливать, и пинать ссаными тряпками чтобы работала!

Но, вернуемся к Powershell, чтобы он работал на компутерах они должны быть в домене AD, для них должны быть включена разрешения на исполнение Powershell Remote как-нибудь через AD GP!

Powershell скрипт нельзя запустить двойным щелчком или через иконку(не верите попробуйте). Сначала запускаем ISE как админ, при этом самому надо быть AD админом — с правами придется в любом случае повозиться, но мне повезло и админы сбежавшие до меня уже об этом подумали! Команды чтобы проверить есть ли возможность на удаленном ПК исполнять Powershell нет, но можно в ISE стартануть удаленную сессию Powershell зайти(надо подождать минуту не сразу отвечает) и попытаться что-то исполнить — это будет занчит что то что нужно работает!

Обновлять будем в три этапа
1. Опросим доступные по сети ПК на предмет наличия 1С и его версии
2. Отправим на них команду установить новую версию 1С
3. Еще раз опросим и узнаем появилась ли новая версия 1С на пк

Powershell скрипт для получения версии ПО на удаленном ПК
Мне нужен файл с хостами, вытащим его из AD из компьютерных групп.
Сначала удоляем hosts.txt потом туда закачиваем списки из OU.

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 "$_"}

Теперь опрашиваем эти хосты, узнаем доступны ли они по сети, если нет пишем что нет в файл result_down.txt. Ищем имя производителя ПО оно может быть на английском(1C-Soft -непонятно почему), на русском(1С-Софт -понятно) и возможно еще на каком-то.

Там же ищем версию которую нам надо установить 8.3.16.1148, а вдруг уже установлена!



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
}
}
}

Кстати этот опрос, в зависимости от паршивости ПК займет один рабочий день 8-часов для примерно 1000 ПК(старых-новых)! Ну и надо его делать в рабочее время когда ПК онлайн!

Powershell скрипт для установки ПО на несколько компьютеров по сети
Теперь выясняется что — нельзя просто так зайти на удаленных ПК по Powershell и запустить там тихую установку (для 1С аргумент /quiet) из дистрибутива на сетевой шаре. Запускать можно только с локальных папок — поэтому сначала копируем на удаленный ПК файлы установки а потом запускаем!



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)

Это тоже занимает рабочий день для 100 ПК, для старых гораздо дольше чем для новых, еще и встает иногда на пол часа просто так!!!

Powershell скрипт для проверки версии ПО на нескольких компьютерах по сети
Тут с одной стороны немного тупо, ищем просто версию во всем выводе установленных программ, считаем что она уникальна!
А с другой стороны это самый верный способ найти — если делать по умному искать сначала по производителю 1С то не всегда находит новую версию даже при успешной установке!



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}
}
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *