IT記事、時々ぼのぼの

ぼのぼのに毎日癒されつつ仕事しているエンジニアのブログです。


WSUS 4.0の自動承認スクリプト

WSUS4.0から、PowerShellで操作できることが格段に増えたので、手動で運用しているようなものをバッチ回して自動的に処理させる。

1. Itanium系のパッチ拒否
2. 数日経過してから承認する(WSUSの基本機能だと適用期限しか設定できないため)
3. 先行適用グループと全体適用グループで承認間隔を分ける
4. クリーンナップ

注意点

先行適用グループと全体適用グループ用に承認スケジュールを分けると、「未承認」、「承認済み」で検索条件を分ける必要がある。
未承認と承認済みは、以下のパラメータとなる。

未承認

IsApproved = False
IsDeclined = False

承認済み

IsApproved = True
IsDeclined = False

スクリプト

#
# WSUS4.0サーバ用 自動承認スクリプト
#

# パラメータ設定
$day = get-date -format "yyyyMMdd"
$log_dir = "C:\Tools\wsus_maintenance\log"

# WSUSのポートをデフォルトから80へ変更している場合(WSUSサーバ上で実行)
$wsus = Get-WsusServer -name localhost -PortNumber 80

# 日付設定
$5daysago = Get-Date (Get-Date).AddDays(-5) -format "yyyy/MM/dd 0:00:00"
$6daysago = Get-Date (Get-Date).AddDays(-6) -format "yyyy/MM/dd 0:00:00"
$7daysago = Get-Date (Get-Date).AddDays(-7) -format "yyyy/MM/dd 0:00:00"
$8daysago = Get-Date (Get-Date).AddDays(-8) -format "yyyy/MM/dd 0:00:00"


# Itaniumの拒否: Itaniumのクライアントがいない場合はこれらは不必要

$ia64 = $wsus.GetUpdates() | Where-Object {$_.title.indexof("Itanium") -gt 1 -and $_.title.indexof("x64") -eq -1 -and $_.ArrivalDate -gt [datetime]::Now.AddDays(-7)}
foreach($patch in $ia64) {
  $wsus | Get-WsusUpdate -UpdateId $patch.id.updateid | Deny-WsusUpdate
}

#
# 自動承認(先行適用グループ用)
# 6日前にダウンロードされたものを承認
#

$ahead = $wsus.GetUpdates() | Where-Object {$_.ArrivalDate -gt $6daysago -and $_.ArrivalDate -lt $5daysago -and $_.IsApproved -eq $False -and $_.IsDeclined -eq $False}
foreach($patch in $ahead) {
  $wsus | Get-WsusUpdate -UpdateId $patch.id.updateid | Approve-WsusUpdate -TargetGroupName "先行適用G" -Action Install
}

#
# 自動承認(その他すべて)
# 8日前にダウンロードされたものを承認
#

$allgroup = $wsus.GetUpdates() | Where-Object {$_.ArrivalDate -gt $8daysago -and $_.ArrivalDate -lt $7daysago -and $_.IsApproved -eq $True -and $_.IsDeclined -eq $False}
foreach($patch in $allgroup) {
  $wsus | Get-WsusUpdate -UpdateId $patch.id.updateid | Approve-WsusUpdate -TargetGroupName "すべてのコンピューター" -Action Install
}

# クリーンアップ:置き換えられたパッチや拒否済みのものを削除する
$wsus | Invoke-WsusServerCleanup -CleanupObsoleteUpdates -CleanupUnneededContentFiles -CompressUpdates -DeclineExpiredUpdates > C:\Tools\wsus_maintenance\log\$day.log

# ログローテーション
forfiles /P $log_dir /M * /C "cmd /c if @isdir==FALSE del /s @path" /D -30