Описание скрипта очистки WSUS
Скрипт очистки подчиненного WSUS сервера предназначен для автоматизации процесса удаления с сервера обновлений отклоненных, просроченных и не примененных обновлений. Не смотря на то, что управление подчиненным сервером обновлений WSUS происходит через сервер верхнего уровня, т.е. процедура отзыва и одобрения обновлений делается исключительно на вышестоящем сервере, в процессе работы не происходит автоматической очистки, что приводит к переполнению базы данных и файлового хранилища сервера. Для решения этой задачи можно использовать приведенный ниже скрипт.
Скрипт для автоматизации очистки подчиненного WSUS сервера
Write-Host «Скрипт очистки WSUS»
Write-Host «Stada CIS»
$help = »WsusCleanup.ps1 [Server] [Port] [/SSL] [/SkipGroups [group1][, group2]…]
Server Имя WSUS. По умолчанию localhost
Port Порт WSUS. По умолчанию 80 (443, если указан ключ /SSL)
/SSL Использовать защищённое (SSL) соединение
/SkipGroups [group1][, group2]…
Имена групп компьютеров на WSUS, состояние установки которых
не влияет на выбор заменённых обновленийЕсли имена содержат пробелы или запятые, заключайте имена в кавычки
Регистр букв в имени сервера или группы не учитываетсяПримеры:
WsusCleanup.ps1
WsusCleanup.ps1 Server01
WsusCleanup.ps1 Server01 1000 /SSL
WsusCleanup.ps1 Server01 /SkipGroups `»Unassigned Computers`», Deprecated
»
$commandLineHelp = «Наберите WsusCleanup.ps1 /? для помощи.»# =================================================================
# Список аргументов и ключей командной строки$knownSwitches = «ssl,skipGroups»
$argumentsList = «serverName,port»# =================================================================
# Конвертирование аргументов и ключей командной строки в переменные$knownSwitchesLower = $knownSwitches.ToLower().Split(‘,’)
$knownSwitches = $knownSwitches.Split(‘,’)
$argumentsList = $argumentsList.Split(‘,’)
$unknownSwitch = $null
$warningCode = 0$key = $null
$argumentsCount = 0
foreach($arg in $args) {
if(($arg.GetType() -eq [string]) -and ($arg.StartsWith(«/») -or $arg.StartsWith(«-«))) {
$key = $arg.Substring(1)
$index = [Array]::IndexOf($knownSwitchesLower, $key.ToLower())
if($index -eq -1) {
$unknownSwitch = $key
}
else {
$key = $knownSwitches[$index]
Invoke-Expression «`$$key = `$true»
}
}
else {
if($key) {
Invoke-Expression «`$$key = `$arg»
$key = $null
}
else {
$argument = $argumentsList[$argumentsCount]
$argumentsCount++
Invoke-Expression «`$$argument = `$arg»
}
}
}# =================================================================
# Проверка аргументов и ключейif(($serverName -eq «?») -or ($unknownSwitch -eq «?»)) {
$help
exit
}
function CriticalError([int]$exitCode, $message) {
Write-Host «»
Write-Host «ОШИБКА : $message»
exit $exitCode
}
function ShowWarning($message) {
Write-Host «»
Write-Host «ПРЕДУПРЕЖДЕНИЕ : $message»
}if($unknownSwitch) {
CriticalError 11 «Ключ командной строки ‘$unknownSwitch’ не поддерживается.
$commandLineHelp»
}if($skipGroups -and $skipGroups.GetType() -eq [bool]) {
ShowWarning «После ключа /SkipGroups нужно указать одну или несколько групп оборудования на WSUS»
$skipGroups = $null
}# =================================================================
# Инициализация параметров по умолчаниюif(-not $serverName) {
$serverName = «localhost»
}
if(-not $port) {
if($ssl) {
$port = 443
}
else {
$port = 80
}
}# =================================================================
# Соединение с WSUSWrite-Host «Загрузка WSUS API … » -noNewLine
$wsusApi = [System.Reflection.Assembly]::Load(«Microsoft.UpdateServices.Administration, Version=3.1.6001.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35»)
if(-not $wsusApi) {
CriticalError 1 «На данный ПК нужно установить консоль администрирования WSUS»
}
Write-Host ОКWrite-Host «Попытка связаться с WSUS $serverName … » -noNewLine
$server = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($serverName, $ssl, $port)
if(-not $server) {
CriticalError 2 «Невозможно соединиться с сервером обновлений $serverName»
}
Write-Host ОК
Write-Host «»# =================================================================
# Составление списка групп компьютеров, состояние установки которых
# нужно учитывать при работе$skipGroupsLower = New-Object System.Collections.ArrayList
$allSkipGroups = New-Object System.Collections.ArrayList
$unknownGroups = New-Object System.Collections.ArrayList
$skipGroupsArray = @()if($skipGroups) {
foreach($group in $skipGroups) {
$ttt = $skipGroupsLower.Add($group.ToLower())
$ttt = $unknownGroups.Add($group)
$skipGroupsArray += $group
}
}function CollectRecursive($computerGroup, [System.Collections.IList]$list) {
if($list.Contains($computerGroup.Name)) {
return
}
$ttt = $list.Add($computerGroup.Name)
foreach($childGroup in $computerGroup.GetChildTargetGroups()) {
CollectRecursive $childGroup ($list)
}
}$supportedComputers = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope
if($skipGroups) {
$supportedComputers.IncludeSubgroups = $false
$allGroups = $server.GetComputerTargetGroups()
foreach($computerGroup in $allGroups) {
$skipIndex = $skipGroupsLower.IndexOf($computerGroup.Name.ToLower())
if($skipIndex -ne -1) {
$unknownGroups.Remove($skipGroupsArray[$skipIndex])
CollectRecursive $computerGroup ($allSkipGroups)
}
}
foreach($computerGroup in $allGroups) {
if(($computerGroup.Name -ne «All Computers») -and (-not $allSkipGroups.Contains($computerGroup.Name))) {
$ttt = $supportedComputers.ComputerTargetGroups.Add($computerGroup)
}
}
if($unknownGroups) {
$unknownGroupsString = [string]::Join(«, «, $unknownGroups.ToArray())
if($unknownGroups.Count -gt 1) {
$caption = «групп»
}
else {
$caption = «группы»
}
ShowWarning «На сервере нет $caption оборудования $unknownGroupsString»
}
}# =================================================================
# Выполнение очисткиWrite-Host «Запуск мастера очистки сервера»
$cleanupManager = $server.GetCleanupManager()
$cleanupScope = New-Object Microsoft.UpdateServices.Administration.CleanupScope $true, $true, $true, $true, $false, $true
$results =$cleanupManager.PerformCleanup($cleanupScope)
$diskSpaceFreedString = [String]::Format(«{0:n0}», $results.DiskSpaceFreed / 1024 / 1024)
Write-Host «Мастер завершил очистку»Write-Host «Освобождено $diskSpaceFreedString Мб дискового пространства»
Применение скрипта
Для автоматизации процесса очистки необходимо создать в планировщике заданий задачу запуска скрипта очистки. Для этого откроем планировщик и выберем создать простую задачу.
Далее укажем имя задачи и ее описание.
Укажем как часто мы хотим запускать задачу автоматической очистки подчиненного сервера WSUS.
Укажем время.
Далее необходимо указать путь к PowerShell скрипту.
Поставим галку открыть окно Свойства после нажатия готово.
Укажем под какой учетной записью запускать скрипт очистки. Так же отметим вариант запуска с наивысшими правами.
Сохраняем нашу задачу и ждем ее запуска для проверки работоспособности. Затем забываем о еще одной рутинной задаче.