Войти

Показать полную графическую версию : [решено] Скрипт для удаленного сброса клиента службы Автоматического обновления


TheSt1tch
26-01-2015, 10:21
Добрый день, пишется скрипт для удаленного сброса клиентов. Пишется на powershell, в данный момент возникла проблема с тем, что выходят ошибки при доступе к удаленному реестру для сброса ключей. Служба останавливается и запускается успешно.
Привожу код самого скрипта:
#################################################################################################### #####################
# WSUSClientRemoteReset.ps1 PowerShell shs 20100218
#
# Скрипт, дистаннционно выполняющий действия, описанные в kb903262, над компьютерами, согласно заданного списка
# Список компьютеров, который скрипт загружает из файла .\NoWSUS.txt, может быть сформирован при помощи скрипта WSUSAD-Compare.ps1,
# и представляет из себя список FQDN-имен компьютеров (одна строка - одно имя)
#################################################################################################### #####################
cls
#################################################################################################### #####################
### Объявляем вспомогательные функции
#################################################################################################### #####################
#
#Функция возращает true, если заданный хост пингуется и false - в противном случае
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) (далее по тексту - служба) на удаленной машине
[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 {
# если в течение отведенного таймаута служба не остановилась, то сообщим об этом...
"On $CompName wuauserv service failed to stop...`n"
# ...и установим флаг успешной остановки службы в состояние $false
$Stopped=$false
}
}
# если служба была успешно остановлена, то
# выполняем действия, указанные в kb903262
if ($Stopped) {
#
#Удаляем ключи реестра, согласно http://support.microsoft.com/kb/903262
$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"
}
}
}

на выходе работы имеем ошибку:
Исключение при вызове "OpenRemoteBaseKey" с "2" аргументами: "Не найден сетевой путь.
"
E:\WSUSClientRemoteReset.ps1:61 знак:3
+ $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $CompN ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : IOException

Невозможно вызвать метод для выражения со значением NULL.
E:\WSUSClientRemoteReset.ps1:62 знак:3
+ $regKey= $reg.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpd ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Невозможно вызвать метод для выражения со значением NULL.
E:\WSUSClientRemoteReset.ps1:63 знак:3
+ $regKey.DeleteValue("SusClientId")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Невозможно вызвать метод для выражения со значением NULL.
E:\WSUSClientRemoteReset.ps1:64 знак:3
+ $regKey.DeleteValue("SusClientIdValidation")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Невозможно вызвать метод для выражения со значением NULL.
E:\WSUSClientRemoteReset.ps1:65 знак:3
+ $regKey.DeleteValue("PingID")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Невозможно вызвать метод для выражения со значением NULL.
E:\WSUSClientRemoteReset.ps1:66 знак:3
+ $regKey.DeleteValue("AccountDomainSid")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Kazun
26-01-2015, 10:44
Начиная с Windows Vista на клиентских ОС служба удаленный реестр отключена по умолчанию. Для выполнения скрипта, данная служба должна быть запущена. Статус службы можно посмотреть через Get-Service:

PS > Get-Service RemoteRegistry

Status Name DisplayName
------ ---- -----------
Stopped RemoteRegistry Удаленный реестр




© OSzone.net 2001-2012