Windows Server Update Services(WSUS)を運用していると、GUI操作だけでは対応しきれない場面に遭遇する。
更新プログラムの配信が止まった、クライアントが同期しない、データベースが肥大化した。
こうしたトラブルを解決するには、コマンドラインからの操作が不可欠だ。
この記事では、WSUS管理で実際に使うコマンドを、シーン別に解説する。
WSUSのトラブルシューティングでは、まずサービスの再起動を試す。
net stop WsusService
net start WsusService
サービスが停止しない場合は、強制終了も検討する。
taskkill /F /IM WsusService.exe
ただし、強制終了はデータベースに影響を与える可能性があるため、最終手段として使う。
WSUSはIIS上で動作しているため、アプリケーションプールの再起動が必要な場合がある。
C:\Windows\System32\inetsrv\appcmd stop apppool /apppool.name:"WsusPool"
C:\Windows\System32\inetsrv\appcmd start apppool /apppool.name:"WsusPool"
WSUSコンソールが応答しない場合、このコマンドで解決することが多い。
WSUSを長期間運用していると、データベースが肥大化してパフォーマンスが低下する。
定期的なメンテナンスが必須だ。
データベースのインデックスを再構築することで、クエリ速度が改善される。
sqlcmd -S np:\\.\pipe\MICROSOFT##WID\tsql\query -E -Q "USE SUSDB; EXEC sp_MSforeachtable 'DBCC DBREINDEX (''?'')'"
Windows Internal Database(WID)を使用している場合のコマンドだ。
SQL Serverを使っている場合は、接続先を変更する必要がある。
期限切れや不要な更新プログラムを削除することで、データベースサイズを削減できる。
WSUSコンソールから「サーバークリーンアップウィザード」を実行するのが一般的だが、コマンドでも実行可能だ。
PowerShellを使う。
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer("localhost", $false, 8530)
$cleanupManager = $wsus.GetCleanupManager()
$cleanupScope = New-Object Microsoft.UpdateServices.Administration.CleanupScope
$cleanupScope.DeclineSupersededUpdates = $true
$cleanupScope.DeclineExpiredUpdates = $true
$cleanupManager.PerformCleanup($cleanupScope)
このスクリプトは、置き換えられた更新プログラムと期限切れの更新プログラムを拒否する。
実行には数時間かかる場合があるため、業務時間外に実行することを推奨する。
クライアントがWSUSサーバーと同期しない場合、クライアント側のコマンドで強制同期を試す。
wuauclt /detectnow /reportnow
Windows 10以降では、以下のコマンドを使う。
UsoClient StartScan
UsoClient StartDownload
UsoClient StartInstall
クライアントが正しくWSUSに登録されているか確認する。
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
このコマンドで、クライアントが参照しているWSUSサーバーのURLが表示される。
表示されない場合は、グループポリシーが適用されていない可能性がある。
WSUSサーバー自体がMicrosoft Updateと同期しない場合のコマンド。
PowerShellから同期を開始する。
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer("localhost", $false, 8530)
$subscription = $wsus.GetSubscription()
$subscription.StartSynchronization()
同期状況を確認するには、以下のコマンドを使う。
$subscription.GetSynchronizationStatus()
過去の同期履歴を確認する。
$subscription.GetSynchronizationHistory()
エラーが記録されている場合、その内容から原因を特定できる。
トラブルシューティングでは、ログの確認が不可欠だ。
WSUSのログは以下の場所に保存されている。
C:\Program Files\Update Services\LogFiles\
最新のログを確認するには、PowerShellで以下のコマンドを実行する。
Get-Content "C:\Program Files\Update Services\LogFiles\SoftwareDistribution.log" -Tail 50
Windows Server側のイベントログも重要だ。
wevtutil qe Application /f:text /c:20 /rd:true /q:"*[System[Provider[@Name='Windows Server Update Services']]]"
このコマンドで、WSUSに関連する最新20件のイベントログが表示される。
WSUSのパフォーマンスを改善するためのコマンド。
データベースを圧縮して、ディスク使用量を削減する。
sqlcmd -S np:\\.\pipe\MICROSOFT##WID\tsql\query -E -Q "USE SUSDB; DBCC SHRINKDATABASE(SUSDB, 10)"
圧縮後は、インデックスの再構築も実行する。
90日以上接続がないクライアントを削除する。
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer("localhost", $false, 8530)
$computerScope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope
$computers = $wsus.GetComputerTargets($computerScope)
$cutoffDate = (Get-Date).AddDays(-90)
foreach ($computer in $computers) {
if ($computer.LastReportedStatusTime -lt $cutoffDate) {
$wsus.GetComputerTarget($computer.Id).Delete()
}
}
このスクリプトは、大量のクライアントを削除するため、実行前にバックアップを取ることを推奨する。
WSUSが完全に応答しなくなった場合の対処法。
最終手段として、WSUSの設定をリセットする。
C:\Program Files\Update Services\Tools\wsusutil.exe reset
このコマンドは、WSUS構成をリセットするが、承認した更新プログラムの情報は維持される。
ただし、実行前に必ずバックアップを取る。
データベースが破損した場合の修復コマンド。
sqlcmd -S np:\\.\pipe\MICROSOFT##WID\tsql\query -E -Q "USE SUSDB; DBCC CHECKDB(SUSDB, REPAIR_ALLOW_DATA_LOSS)"
REPAIR_ALLOW_DATA_LOSSオプションは、データの損失を許容する。
重要なデータが失われる可能性があるため、慎重に実行する。
WSUSの定期メンテナンスをタスクスケジューラで自動化すると、運用負荷が軽減される。
以下のPowerShellスクリプトを作成し、タスクスケジューラに登録する。
# インデックス再構築
sqlcmd -S np:\\.\pipe\MICROSOFT##WID\tsql\query -E -Q "USE SUSDB; EXEC sp_MSforeachtable 'DBCC DBREINDEX (''?'')'"
# クリーンアップ
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer("localhost", $false, 8530)
$cleanupManager = $wsus.GetCleanupManager()
$cleanupScope = New-Object Microsoft.UpdateServices.Administration.CleanupScope
$cleanupScope.DeclineSupersededUpdates = $true
$cleanupScope.DeclineExpiredUpdates = $true
$cleanupManager.PerformCleanup($cleanupScope)
# データベース圧縮
sqlcmd -S np:\\.\pipe\MICROSOFT##WID\tsql\query -E -Q "USE SUSDB; DBCC SHRINKDATABASE(SUSDB, 10)"
このスクリプトを週次で実行するだけで、WSUSのパフォーマンスが維持される。
WSUSのコマンドライン操作を習得すると、トラブルシューティングの時間が大幅に短縮される。
特に、以下のコマンドは頻繁に使う。
net stop/start WsusServicesqlcmdでのDBCC DBREINDEX実行wuauclt /detectnow(Windows 10以降はUsoClient)WSUSの運用では、GUIだけでなくコマンドラインも活用することで、効率的な管理が可能になる。
定期メンテナンスを自動化し、トラブル時には適切なコマンドで迅速に対処する。
これが、安定したWSUS運用の鍵だ。