WSUSの自動承認規則をPowerShellで制御する方法【配信の分散化】

みなさんこんにちは。ますのです。

WSUS配信により、社内ネットワークが逼迫しインターネットに繋がらない自体が発生した時の恒久対策として、お題をいただきました。

一斉に許可せず、500台ずつ区切って配信とか出来ないかねぇ…。
答えはMicrosoftのブログ内にありましたので、対応内容を書いていきます。
https://blogs.technet.microsoft.com/jpwsus/2016/11/01/rollup-scripting/

WSUSサーバ:自動承認規則の「規則の実行」を行うPowerShellを作成

以下の引用元のPowerShellコードをコピーし、メモ帳アプリ等で「Apply-InstallApprovalRules.ps1」と保存します。

# 引数の指定
Param(
# 承認規則の名前
[Parameter(Mandatory=$True)]
[string]$TargetApprovalRule
)

# WSUS サーバーに接続
[void][reflection.assembly]::LoadWithPartialName(“Microsoft.UpdateServices.Administration”)
$wsus=[Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer()

# 承認規則の取得
$Rule = $wsus.GetInstallApprovalRules() | where { $_.Name -eq $TargetApprovalRule}

# 承認規則の有効化
$Rule.Enabled = $True
$Rule.Save()

# “規則の実行” を行う
$Rule.ApplyRule()

# 承認規則の無効化
$Rule.Enabled = $False
$Rule.Save()

https://msdnshared.blob.core.windows.net/media/2016/11/Apply-InstallApprovalRules.txt

WSUS:コンピュータグループを作成し、配信対象のPCを振り分ける

振り分けの方法は2パターンあります。

  • WSUSサーバ上で手動でコンピュータグループを移動する
  • ADサーバ上でグループポリシーによる自動振り分け設定をする

いずれの方法でやる際も、WSUSサーバ上のコンピュータ>すべてのコンピュータ>コンピュータグループの追加から、任意のコンピュータグループを追加する必要があります。

ADサーバ:グループポリシーでは「クライアント側のターゲットを有効にする」へWSUSに設定したコンピュータグループ名を設定する。
PCをOU毎に配置してあげないと反映してくれないのがネック。どなたかお知恵があればご教示くださいm(_ _)m

2019/9/28追記
GPOのフィルタについて「WMIフィルター」があるよ!とコメントを頂きました!
クエリを作ってフィルタ条件を作るようで、OUがいっぱい増えてしまう運用から変更出来ないか勉強してみます。

WSUS:対象の自動承認規則のチェックを外す

Update Services>オプション>自動承認より、先程のGroup1を自動承認する規則を作成します。規則名はPowerShell実行時に指定するため、分かりやすくしていると良いです!
規則のプロパティは、コンピュータグループ以外はそれぞれの環境に応じて設定します。


※チェックが入っていると、WSUSが同期されたタイミングに自動承認され、指定したタイミングで承認されなくなってしまうため注意!

タスクスケジューラでPowerShellを実行する

手順は以下の内容となります。

  1. 最初に作成した「Apply-InstallApprovalRules.ps1」のps1ファイルを任意のフォルダに保存
  2. WSUSサーバ上でPowerShellを実行するタスクスケジューラを登録する

先ずは作成した「Apply-InstallApprovalRules.ps1」を適当なフォルダに放り込みます。
わたしはWSUSサーバ内の「c:\task」フォルダ内に格納しました。

続いてWSUSサーバ上で、先ほどのPowerShell「Apply-InstallApprovalRules.ps1」を実行するタスク登録します。
実行コマンドのサンプルは以下の通り。

Apply-InstallApprovalRules.ps1 -TargetApprovalRule <承認をスクリプトから実行する自動承認規則名 (例 : “既定の自動承認規則” )>

実際のタスクスケジューラへの登録は以下の通りです。
わたしは実行時のログデータも取りたいと思い、タスクスケジューラで「Out-File -FilePath」をくっつけてログデータ取得を設定しています。ログの日付設定とかは脳死受け売りなのでもっとわかりやすい書き方あると思います。
タスクスケジューラの「操作」に設定をしていきます。

【プログラム/スクリプト】
 %Systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe

【引数の追加】
-ExecutionPolicy Unrestricted "C:\task\Apply-InstallApprovalRules.ps1 -TargetApprovalRule Group1 | Out-File -FilePath C:\task\logs\wsusApproval_Group1_%date:~0,4%%date:~5,2%%date:~-2%.txt

タスクスケジューラでPowerShellを実行する際は、少し工夫が必要となります。
やり方が分からない方は以下記事も良ければ参考にどうぞです。
PowerShellをタスクスケジューラーに登録して実行する方法

あとはタスクスケジューラ上の「トリガー」で日時を指定します。
このトリガーの設定で任意のタイミングで承認を行うことが出来ます!
つまり、「コンピュータグループを分けて」「タスクスケジューラのトリガーをずらす」ことで配信の分散化が出来るわけです!

約500〜700台/日を目安にGroup1-5を作成し、月〜金の間隔で分けています。
IISの帯域制御も行っているので遅延は発生しなくなりました。

これからWindows10に切り替わっていくため、様子見ではありますが一旦はこちらでしのいでいければいいなと楽観視していきたい気分であります。

最新情報をチェックしよう!