четверг, 15 мая 2014 г.

PowerShell: скрипты для автоматизации одобрения обновлений на сервере WSUS

Скрипты служат для автоматического одобрения обновлений. Выполняются с помощью планировщика задач на сервере WSUS:

$WsusServer = "wsus.mycompany.corp"
$UseSSL = $false
$PortNumber = 80
$TrialRun = $false

#E-mail Configuration
$SMTPServer = "smtp.mycompany.corp"
$FromAddress = "WSUS@mycompany.corp"
[string[]] $Recipients = "admin1@mycompany.corp", "admin2@mycompany.corp", "admin3@mycompany.corp"
$MessageSubject = "WSUS :: Approving Updates to TEST domain"

Function SendEmailStatus($MessageSubject, $MessageBody)
{
$SMTPMessage = New-Object System.Net.Mail.MailMessage
$SMTPMessage.from = $FromAddress
foreach($recipient in $Recipients)
{
$SMTPMessage.to.Add($recipient)
}
$SMTPMessage.Subject = $MessageSubject
$SMTPMessage.Body = $MessageBody
$SMTPMessage.IsBodyHTML = $true
#Send the message via the local SMTP Server
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SMTPServer
$SMTPClient.Send($SMTPMessage)
$SMTPMessage.Dispose()
rv SMTPClient
rv SMTPMessage
}

#Connect to the WSUS 3.0 interface.
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null
$WsusServerAdminProxy = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($WsusServer,$UseSSL,$PortNumber);
$updates = $WsusServerAdminProxy.SearchUpdates('kb') | ?{-not $_.IsDeclined -and -not $_.IsApproved}
$groups = $WsusServerAdminProxy.GetComputerTargetGroups()
foreach ($group in $groups) {
if ($group.name -eq "domain test.corp" )
{
$sourcegroup = $group
}
}
If ($TrialRun)
{$MessageSubject += " Trial Run"}
Else
{$updates | %{$_.Approve('Install',$sourcegroup)}}
If ($updates.Count -gt 0)
{
$MessageBody = $updates | Select `
@{Name="Title";Expression={[string]$_.Title}},`
@{Name="KB Article";Expression={[string]::join(' | ',$_.KnowledgebaseArticles)}},`
@{Name="Classification";Expression={[string]$_.UpdateClassificationTitle}},`
@{Name="Product Title";Expression={[string]::join(' | ',$_.ProductTitles)}},`
@{Name="Product Family";Expression={[string]::join(' | ',$_.ProductFamilyTitles)}},`
@{Name="Uninstallation Supported";Expression={[string]$_.UninstallationBehavior.IsSupported}} | ConvertTo-HTML
SendEmailStatus $MessageSubject $MessageBody
}
Else
{
SendEmailStatus $MessageSubject "No new updates for approving to TEST domain"
}

В приведённом выше скрипте происходит автоматическое одобрение всех ещё не имеющих одобрение и при этом не отклоненных обновлений для указанной группы компьютеров (группа "domain test.corp").

$WsusServer = "wsus.mycompany.corp"
$UseSSL = $false
$PortNumber = 80
$TrialRun = $false

#E-mail Configuration
$SMTPServer = "smtp.mycompany.corp"
$FromAddress = "WSUS@mycompany.corp"
[string[]] $Recipients = "admin1@mycompany.corp", "admin2@mycompany.corp", "admin3@mycompany.corp"
$MessageSubject = "WSUS :: Approving Updates to All computers"

Function SendEmailStatus($MessageSubject, $MessageBody)
{
$SMTPMessage = New-Object System.Net.Mail.MailMessage
$SMTPMessage.from = $FromAddress
foreach($recipient in $Recipients)
{
$SMTPMessage.to.Add($recipient)
}
$SMTPMessage.Subject = $MessageSubject
$SMTPMessage.Body = $MessageBody
$SMTPMessage.IsBodyHTML = $true
#Send the message via the local SMTP Server
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SMTPServer
$SMTPClient.Send($SMTPMessage)
$SMTPMessage.Dispose()
rv SMTPClient
rv SMTPMessage
}

#Connect to the WSUS 3.0 interface.
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null
$WsusServerAdminProxy = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($WsusServer,$UseSSL,$PortNumber);
$updates = $WsusServerAdminProxy.SearchUpdates('kb') | ?{-not $_.IsDeclined} | ?{$_.ArrivalDate -gt (Get-Date).adddays(-22) -and $_.ArrivalDate -le (Get-Date).adddays(-14)}
$groups = $WsusServerAdminProxy.GetComputerTargetGroups()
foreach ($group in $groups) {
if ($group.name -eq "All Computers")
{
$targetgroup = $group
}
}
If ($TrialRun)
{$MessageSubject += " Trial Run"}
Else
{$updates | %{$_.Approve('Install',$targetgroup)}}
If ($updates.Count -gt 0)
{
$MessageBody = $updates | Select `
@{Name="Title";Expression={[string]$_.Title}},`
@{Name="KB Article";Expression={[string]::join(' | ',$_.KnowledgebaseArticles)}},`
@{Name="Classification";Expression={[string]$_.UpdateClassificationTitle}},`
@{Name="Product Title";Expression={[string]::join(' | ',$_.ProductTitles)}},`
@{Name="Product Family";Expression={[string]::join(' | ',$_.ProductFamilyTitles)}},`
@{Name="Uninstallation Supported";Expression={[string]$_.UninstallationBehavior.IsSupported}} | ConvertTo-HTML
SendEmailStatus $MessageSubject $MessageBody
}
Else
{
SendEmailStatus $MessageSubject "No new updates for approving to all"
}

Тут происходит выборка обновлений, которые не были отклонены во временном интервале начиная с трех недель назад, заканчивая двумя неделями назад. Затем данные обновления повторно одобряются уже для всех компьютеров.
Такой вариант работы с обновлениями Windows удобен, если у вас в организации существует тестовый домен для обкатки свежего софта и т.п. Новые обновления всегда удобнее проверять там, до того как они попадут в основную рабочую среду.
Перед началом использования необходимо установить константы в соответствии с вашей инфраструктурой. А конкретнее это: имя сервера, порт, флаг использования протокола SSL, флаг использования пробного режима, имя SMTP сервера для отправки отчёта, адреса отправителя и получателей, тема письма.

Комментариев нет:

Отправить комментарий