Скрипт очистки подчиненного WSUS сервера

Описание скрипта очистки 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
}
}

# =================================================================
# Соединение с WSUS

Write-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 сервера

Далее укажем имя задачи и ее описание.

Создание задачи очистки WSUS

Укажем как часто мы хотим запускать задачу автоматической очистки подчиненного сервера WSUS.

Создание задачи очистки WSUS

Укажем время.

Создание задачи очистки WSUS

Создание задачи очистки WSUS

Далее необходимо указать путь к PowerShell скрипту.

Создание задачи очистки WSUS

Поставим галку открыть окно Свойства после нажатия готово.

Создание задачи очистки WSUS

Укажем под какой учетной записью запускать скрипт очистки. Так же отметим вариант запуска с наивысшими правами.

Скрипт очистки WSUS сервера

Сохраняем нашу задачу и ждем ее запуска для проверки работоспособности. Затем забываем о еще одной рутинной задаче.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *