Categories: WSUS

WSUSコマンド完全ガイド

Windows Server Update Services(WSUS)を運用していると、GUI操作だけでは対応しきれない場面に遭遇する。

更新プログラムの配信が止まった、クライアントが同期しない、データベースが肥大化した。

こうしたトラブルを解決するには、コマンドラインからの操作が不可欠だ。

この記事では、WSUS管理で実際に使うコマンドを、シーン別に解説する。

WSUSの基本コマンド

WSUSサービスの起動・停止

WSUSのトラブルシューティングでは、まずサービスの再起動を試す。

net stop WsusService
net start WsusService

サービスが停止しない場合は、強制終了も検討する。

taskkill /F /IM WsusService.exe

ただし、強制終了はデータベースに影響を与える可能性があるため、最終手段として使う。

IISアプリケーションプールの管理

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登録状況確認

クライアントが正しくWSUSに登録されているか確認する。

reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v WUServer

このコマンドで、クライアントが参照しているWSUSサーバーのURLが表示される。

表示されない場合は、グループポリシーが適用されていない可能性がある。

WSUSサーバーの同期コマンド

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のログファイル

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の完全リセット

最終手段として、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 WsusService
  • データベースのインデックス再構築: sqlcmdでのDBCC DBREINDEX実行
  • クリーンアップの自動化: PowerShellスクリプト
  • クライアントの強制同期: wuauclt /detectnow(Windows 10以降はUsoClient

WSUSの運用では、GUIだけでなくコマンドラインも活用することで、効率的な管理が可能になる。

定期メンテナンスを自動化し、トラブル時には適切なコマンドで迅速に対処する。

これが、安定したWSUS運用の鍵だ。

openclaw-editor