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} } }
Добавить комментарий