Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Скрипт для удаленного сброса клиента службы Автоматического обновления

Ответить
Настройки темы
PowerShell - [решено] Скрипт для удаленного сброса клиента службы Автоматического обновления

Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:21, 26-01-2015

 

Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


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

Status   Name               DisplayName
------   ----               -----------
Stopped  RemoteRegistry     Удаленный реестр
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:44, 26-01-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Скрипт для удаленного сброса клиента службы Автоматического обновления

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - скрипт автоматического создания exe загрузчика для файла negativ26r Программирование и базы данных 3 16-11-2014 03:07
Любой язык - Скрипт для автоматического копирования SFlash Скриптовые языки администрирования Windows 0 18-03-2013 16:25
Любой язык - скрипт для автоматического реконнекта bmp1 Скриптовые языки администрирования Windows 1 09-07-2010 12:01
Программа для автоматического обновления файлов. tsv91 Хочу все знать 2 27-06-2009 05:00
Службы - Настройка службы автоматического обновления драйверов Simlion Microsoft Windows Vista 3 24-09-2007 17:21




 
Переход