Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скрипт для удаленного сброса клиента службы Автоматического обновления (http://forum.oszone.net/showthread.php?t=294473)

TheSt1tch 26-01-2015 10:21 2461433

Скрипт для удаленного сброса клиента службы Автоматического обновления
 
Добрый день, пишется скрипт для удаленного сброса клиентов. Пишется на 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 2461442

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

PS > Get-Service RemoteRegistry

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



Время: 21:13.

Время: 21:13.
© OSzone.net 2001-