Статус установки обновлений для рабочих станций через WSUS на Powershell

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

Мне был нужен скрипт, который покажет, что на каких-то компьютерах есть не установленные одобренные обновления. Такой отчет есть в консоли WSUS, он называется Computer Tabular Status for Approved Updates

Но это достаточно трудоемкая задача, когда у вас 5-10-15 серверов.

 

 

Я написал скрипт в среде Powershell, который автоматизирует задачу получения отчетов из WSUS.

Скрипт лучше всего запускать на центральном управляющем сервере WSUS, т.к. он содержит все сведения обо всех компьютерах всех серверов обновлений WSUS. Однако можно запустить и на рядовом сервере. Отчет, естественно, вы получите только для компьютеров, подключенных к этому серверу.

Скрипт принимает только один параметр - имя домена Active Directory, для которого проводится аудит. Если у вас только один домен, можете прописать его имя напрямую в коде, чтобы не вводить его каждый раз. Это можно сделать в строке №3.

Еще важно - имя сервера для подключения. Его надо поменять в строке №8.

После выполнения, скрипт запишет результаты работы в csv-файл, в путь, который устанавливается в строке №5.

#cls
$datetime = Get-Date -Format "yyyy.MM.dd_HH-mm-ss";
$domain = $args[0];
$file_name = "wsus_audit_result_" + $domain + "_" + $datetime + ".csv";
$xl_filename = "c:\audit\" + $file_name;

[void][reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer('wsus10.domain.local',$False)

$computerscope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope
$computerscope.IncludeSubgroups = $true;
$computerscope.IncludeDownstreamComputerTargets = $true;
$computerscope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates] "Failed, NotInstalled, Downloaded";

$updates = $wsus.GetUpdates() | where {$_.IsApproved -eq $true};

$array = @{};
foreach ($update in $updates) {
	$temp = $update.GetUpdateInstallationInfoPerComputerTarget($ComputerScope) | where {$_.UpdateApprovalAction -eq "Install"}
		
	if ($temp -ne $null) {
		foreach ($item in $temp) {
			$array.($wsus.GetComputerTarget([guid]$item.ComputerTargetId).FulldomainName)++;
		}
	}
}

$export_array = @();
$export_array += ,@("");$export_array += ,@("");

$i = 1;
foreach ($key in $array.Keys) {
	if ($key.split(".")[1] -eq $domain.split(".")[0]) {
		$export_array += ,@($key.Split(".")[0], $key.Split(".")[1], $array.$key);
	}
}

echo "Сохранение результатов в файл ...";
foreach($item1 in $export_array)  
{  
	$csv_string = "";
	foreach($item in $item1)
	{
		$csv_string = $csv_string + $item + ";";
	}
	Add-Content $xl_filename $csv_string;
}  

 

Отработка команд занимает достаточно продолжительное время, т.к. для каждого компьютера, зарегистрированного в WSUS, делается запрос на сервер по HTTP-протоколу. Это достаточно медленная процедура. Поэтому придется подождать. 

 

И еще...

Не пытайтесь запустить скрипт на обычном сервере или компьютере. Корректно работать он будет только на сервере, где установлена консоль управления WSUS.

Метки: powershell (ru), скрипт, wsus

ПечатьE-mail

Добавить комментарий


Защитный код
Обновить