Блог did5.ru

Про АйТи и около айтишные темы

[WSUS] Как добавить ПК, которых нет в списке WSUS

Комментариев нет

Вторая часть скрипта из статьи Сравнение списка ПК во WSUS и в AD, который позволяет удаленно выполняет рекомендации из Delete Duplicate WSUS Client IDs и перезапускает службу обновлений. До этого я использовал Group Policy с Logon скриптом, но это занимает больше времени, т.к. нужно ждать пока пользователь перезагрузит ПК. Этот скрипт на Power Shell позволяет сразу выполнить все действия незаметно для пользователей, которые работают на компьютерах.

Список ПК берется из файла NoWSUS.txt, который создает скрипт из статьи: Сравнение списка ПК во WSUS и в AD.

Скачать WSUSClientRemoteReset.7z

############################################################################
#  WSUSClientRemoteReset.ps1 PowerShell shs 20100218
#
#  Скрипт, дистаннционно выполняющий действия, описанные в kb903262, над  компьютерами, согласно заданного списка
#  Список компьютеров, который скрипт загружает из файла .\NoWSUS.txt, может быть сформирован при помощи скрипта WSUSAD-Compare.ps1,
#  и представляет из себя список FQDN-имен компьютеров (одна строка - одно имя)
############################################################################
cls
############################################################################
### Объявляем вспомогательные функции
############################################################################
#
#Функция возращает true, если заданный хост пингуется и false  - в противном случае (спасибо Xaerg'у)
function Test-Host ($Name)
{
$ping = new-object System.Net.NetworkInformation.Ping
trap {Write-Verbose "Ошибка пинга"; $False; continue}
if ($ping.send($Name).Status -eq "Success" ) { $True }
else { $False }
}
############################################################################
#
# Начало скрипта
#
############################################################################
### Загружаем в переменную список компьютеров из файла .\NoWSUS.txt,
### попутно получая короткое имя компьютера из его FQDN###
$noInWSUS = gc .\NoWSUS.txt| foreach{($_ -replace " ") -replace "\..+$"}
#Обработаем полученный список
$noInWSUS| where{Test-Host $_}|foreach{`
$CompName = $_
Write-Host "`n`n$CompName"
#Подлкючаемся к службе Автоматического обновления (wuauserv) (далее по тексту - служба) на удаленной машине
###см. http://thepowershellguy.com/blogs/posh/archive/2007/01/03/powershell-using-net-to-manage-remote-services.aspx
[System.Reflection.Assembly]::LoadWithPartialName('system.serviceprocess')
$wuauserv=new-Object System.ServiceProcess.ServiceController('wuauserv',$CompName)
#Инициализация флага успешной остановки службы
$Stopped=$true
#Если служба не остановлена, то остановливаем ее
if ($wuauserv.Status -ne "Stopped") {
try {
#Останавливаем службу
$wuauserv.Stop()
#Ожидаем остановки службы в течении заданного таймаута
$wuauserv.WaitForStatus('Stopped',(new-timespan -seconds 10))
}
catch {
# если в течение отведенного таймаута служба не остановилась, то сообщим об этом...
"На $CompName службу wuauserv остановить не удалось...`n"
# ...и установим флаг успешной остановки службы в состояние $false
$Stopped=$false
}
}
# если служба была успешно остановлена, то
# выполняем действия, указанные в kb903262
if ($Stopped) {
#
#Удаляем ключи реестра, согласно http://support.microsoft.com/kb/903262
###О том, как работать с реестром на удаленной машине, читаем здесь:
###http://thepowershellguy.com/blogs/posh/archive/2007/06/20/remote-registry-access-and-creating-new-registry-values-with-powershell.aspx
$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $CompName)
$regKey= $reg.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate",$true)
$regKey.DeleteValue("SusClientId")
$regKey.DeleteValue("SusClientIdValidation")
$regKey.DeleteValue("PingID")
$regKey.DeleteValue("AccountDomainSid")
#Инициализация флага успешного запуска службы Автоматического обновления (wuauserv)
$Started=$true
#
try {
#Запускаем службу Автообновления
$wuauserv.Start()
#Ожидаем запуска службы в течении заданного таймаута
$wuauserv.WaitForStatus('Running',(new-timespan -seconds 10))
}
catch {
# если в течение отведенного таймаута служба не стартовала, то сообщим об этом...
"На $CompName службу wuauserv запустить не удалось...`n"
# ...и установим флаг успешного запуска службы в состояние $false
$Started=$false
}
# если служба Автоматического обновления была успешно запущенна, то
# выполняем действия, указанные в kb903262
if ($Started) {
#Ждем 5 секунд
Start-Sleep -Seconds 5
#принудительное применение политики (на всякий случай, лучше перебдеть)
"Запускаем принудительное обновление политики..."
$RemoteProcess=([wmiclass]"\\$CompName\root\cimv2:Win32_Process").create("cmd /c gpupdate /force")
"...код возврата запуска - $($RemoteProcess.ReturnValue), ID запущеного процесса - $($RemoteProcess.ProcessId)`n"
#Ждем 30 секунд
Start-Sleep -Seconds 30
"Выполняем wuauclt /resetauthorization /detectnow"
#выполняем wuauclt /resetauthorization /detectnow, согласно http://support.microsoft.com/kb/903262
$RemoteProcess=([wmiclass]"\\$CompName\root\cimv2:Win32_Process").create("cmd /c wuauclt /resetauthorization /detectnow")
"...код возврата запуска - $($RemoteProcess.ReturnValue), ID запущеного процесса - $($RemoteProcess.ProcessId)`n"
}
}
}

Нашли опечатку в тексте? Пожалуйста, выделите ее и нажмите Ctrl+Enter! Спасибо!


Хотите поблагодарить автора за эту заметку? Вы можете это сделать!


Автор: did5

28 Июн 2011 в 12:34

Рубрика: PowerShell,WSUS

Метки:

Ваш отзыв