четверг, 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 сервера для отправки отчёта, адреса отправителя и получателей, тема письма.

вторник, 13 мая 2014 г.

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

Данный скрипт поможет автоматически отклонять приходящие обновления на сервер WSUS, содержащие определённые словосочетания в названии. Так в нижеприведённом примере будут отклоняться обновления, содержащие слова: "itanium", "ia64", "lync", "publisher".

$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 :: Declining Updates"

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);
$itanium = $WsusServerAdminProxy.SearchUpdates('itanium') | ?{-not $_.IsDeclined -and -not $_.IsApproved}
$itanium += $WsusServerAdminProxy.SearchUpdates('ia64') | ?{-not $_.IsDeclined -and -not $_.IsApproved}
$itanium += $WsusServerAdminProxy.SearchUpdates('lync') | ?{-not $_.IsDeclined -and -not $_.IsApproved}
$itanium += $WsusServerAdminProxy.SearchUpdates('publisher') | ?{-not $_.IsDeclined -and -not $_.IsApproved}
If ($TrialRun)
{$MessageSubject += " Trial Run"}
Else
{$itanium | %{$_.Decline()}}
If ($itanium.Count -gt 0)
{
$MessageBody = $itanium | 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 declining"
}

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

понедельник, 12 мая 2014 г.

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

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

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

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

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
}

[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($WsusServer,$UseSSL,$PortNumber);
$cleanupScope = new-object Microsoft.UpdateServices.Administration.CleanupScope;
$cleanupScope.DeclineSupersededUpdates = $true
$cleanupScope.DeclineExpiredUpdates = $true
$cleanupScope.CleanupObsoleteUpdates = $true
$cleanupScope.CompressUpdates = $true
$cleanupScope.CleanupObsoleteComputers = $true
$cleanupScope.CleanupUnneededContentFiles = $true 
$cleanupManager = $wsus.GetCleanupManager();
$MessageBody = $cleanupManager.PerformCleanup($cleanupScope) | ConvertTo-HTML
SendEmailStatus $MessageSubject $MessageBody

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