「なんでWSUSがまた止まってるんだ…」
月曜の朝、出社したら上司から呼び出し。
「先週の更新プログラムが配信されてないぞ!」
確認すると、WSUSの同期が3週間前から失敗していた…
気づかなかった自分が悪いのか、それともWSUSの仕様が悪いのか…
こんな経験、ありませんか?
【この記事で分かること】
読了時間:約12分 | 筆者:WSUS運用歴7年、過去30社のWSUS移行を支援
Windows Server Update Services(WSUS)は、社内クライアントの更新管理において非常に有効なツールです。
しかし、運用の落とし穴が多すぎるのも事実。
Microsoftも公式ドキュメント(WSUS Best Practices)で注意喚起していますが、それでも現場では同じミスが繰り返されています。
正直に言います:
私自身、WSUS運用を始めた当初、この記事で紹介する5つのミスを全部やらかしました。
特にひどかったのは、3ヶ月間も同期が止まっていたのに気づかなかったこと。
セキュリティ監査で指摘されて、始末書を書く羽目に…
この記事では、そんな痛い経験から学んだ「あるある」ミスとその対策を、現場で今すぐ使える形で紹介します。
症状:
原因:
対策:
【即座に確認すべきポイント】
“`powershell
# 1. 最後の同期日時を確認
Get-WsusServer | Get-WsusSubscription | Select LastSynchronizationTime
# 2. IIS Application Poolの状態確認
Get-WebAppPoolState -Name “WsusPool”
# 3. ディスク容量確認(WSUSデータベースドライブ)
Get-PSDrive C | Select Used,Free
# 4. 手動同期を実行してエラー確認
(Get-WsusServer).GetSubscription().StartSynchronization()
“`
【自動監視スクリプト】
毎日自動でチェックして、異常があればメール通知するスクリプトを作成しましょう:
“`powershell
# WSUS同期監視スクリプト(毎日実行)
$wsus = Get-WsusServer
$sub = $wsus.GetSubscription()
$lastSync = $sub.LastSynchronizationTime
# 24時間以上同期されていなければアラート
$threshold = (Get-Date).AddHours(-24)
if ($lastSync -lt $threshold) {
Send-MailMessage `
-To “admin@company.com” `
-From “wsus-alert@company.com” `
-Subject “【警告】WSUS同期が24時間以上停止” `
-Body “最終同期: $lastSync” `
-SmtpServer “smtp.company.com”
}
“`
【私の失敗談】
❌ やらかした:3ヶ月間、同期が止まっていたのに気づかず
タスクスケジューラの実行アカウントが「パスワード期限切れ」で動いていませんでした。
セキュリティ監査で指摘され、全社にセキュリティパッチが3ヶ月未適用だったことが発覚…
教訓:監視スクリプトは必須。手動確認に頼ってはダメ。
症状:
原因:
WSUSは同期されただけでは配信されません。
管理者が手動で「承認」しないと、クライアントには届きません。
これ、WSUSの仕様として分かりにくすぎると思いませんか?
私も最初、「同期したら自動で配信されるもの」だと勘違いしていました。
対策:
【自動承認ルールの設定】
【PowerShellで一括承認】
“`powershell
# 過去30日の未承認の「重要な更新」を一括承認
$wsus = Get-WsusServer
$group = $wsus.GetComputerTargetGroups() | Where {$_.Name -eq “All Computers”}
$wsus.GetUpdates() |
Where {$_.UpdateClassificationTitle -match “重要|セキュリティ” -and
$_.IsApproved -eq $false -and
$_.CreationDate -gt (Get-Date).AddDays(-30)} |
ForEach {
$_.Approve(“Install”, $group)
Write-Host “承認: $($_.Title)”
}
“`
注意:本番環境でいきなり全承認は危険です。
必ずテストグループで検証してから、本番グループに展開してください。
症状:
原因:
WSUSのデータベース(SUSDB)は、放置すると数十GB〜100GB以上に肥大化します。
特に:
対策:
【定期メンテナンス(月1回実施)】
“`powershell
# 1. サーバークリーンアップウィザードの実行
# WSUSコンソール → オプション → サーバークリーンアップウィザード
# 全項目にチェックを入れて実行
# 2. PowerShellで実行する場合
Invoke-WsusServerCleanup -CleanupObsoleteUpdates -CleanupUnneededContentFiles `
-CompressUpdates -DeclineExpiredUpdates `
-DeclineSupersededUpdates
# 3. データベースの再インデックス(パフォーマンス改善)
sqlcmd -S localhost -E -d SUSDB -Q ”
EXEC sp_MSforeachtable ‘ALTER INDEX ALL ON ? REBUILD’
”
“`
【ディスク容量監視】
“`powershell
# WSUSドライブの空き容量が20GB以下ならアラート
$drive = Get-PSDrive C
$freeGB = [math]::Round($drive.Free / 1GB, 2)
if ($freeGB -lt 20) {
Send-MailMessage `
-To “admin@company.com” `
-Subject “【緊急】WSUSサーバーのディスク容量不足” `
-Body “空き容量: $freeGB GB” `
-SmtpServer “smtp.company.com”
}
“`
💡 こんな運用、本当に続けられますか?
WSUS運用は「やることリスト」が多すぎて、本来のインフラ業務に集中できない…
そんな悩み、ありませんか?
最近は、Intune(Microsoft Endpoint Manager)への移行を検討する企業が増えています。
クラウドベースなので、こういった面倒な運用から解放されます。
症状:
原因:
対策:
【クライアント側の診断コマンド】
“`cmd
REM 1. WSUS設定の確認
reg query “HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate” /s
REM 2. WSUSサーバーへの接続確認
wuauclt /detectnow /reportnow
REM 3. Windows Updateのリセット(最終手段)
net stop wuauserv
rd /s /q C:\Windows\SoftwareDistribution
net start wuauserv
wuauclt /resetauthorization /detectnow
“`
【グループポリシーの確認】
症状:
原因:
Microsoftの更新プログラムは、稀に不具合を含むことがあります。
有名な例:
対策:
【段階的展開の設定】
【不具合が見つかった場合の対処】
“`powershell
# 特定の更新プログラムを拒否
$wsus = Get-WsusServer
$update = $wsus.GetUpdates() | Where {$_.KnowledgebaseArticles -contains “KB5000802”}
$update.Decline()
“`
以下のチェックリストを週1回実行することをおすすめします:
| 項目 | 確認方法 | 異常時の対処 |
|---|---|---|
| 同期状態 | 最終同期が24時間以内か | 手動同期 → エラーログ確認 |
| ディスク容量 | 空き容量が20GB以上か | サーバークリーンアップ実行 |
| IIS状態 | WsusPool が Started か | Application Pool再起動 |
| 未承認の更新 | 30日以内の未承認があるか | 承認 or 拒否の判断 |
| クライアント接続 | 全PCの90%以上が7日以内に接続しているか | 未接続PCの原因調査 |
【自動チェックスクリプト(完全版)】
このスクリプトをタスクスケジューラで毎週月曜9時に実行してください:
“`powershell
# WSUS週次チェックスクリプト
$results = @()
# 1. 同期チェック
$wsus = Get-WsusServer
$lastSync = $wsus.GetSubscription().LastSynchronizationTime
$syncOK = $lastSync -gt (Get-Date).AddHours(-24)
$results += “同期: $(if($syncOK){‘OK’}else{‘NG – 最終同期: $lastSync’})”
# 2. ディスク容量チェック
$freeGB = [math]::Round((Get-PSDrive C).Free / 1GB, 2)
$diskOK = $freeGB -gt 20
$results += “ディスク: $(if($diskOK){‘OK’}else{‘NG – 空き: $freeGB GB’})”
# 3. IISチェック
$poolState = (Get-WebAppPoolState -Name “WsusPool”).Value
$iisOK = $poolState -eq “Started”
$results += “IIS: $(if($iisOK){‘OK’}else{‘NG – State: $poolState’})”
# 4. 未承認チェック
$unapproved = $wsus.GetUpdates() | Where {
$_.IsApproved -eq $false -and
$_.CreationDate -gt (Get-Date).AddDays(-30)
}
$results += “未承認: $($unapproved.Count)件”
# 5. レポート送信
$body = $results -join “`n”
Send-MailMessage `
-To “admin@company.com” `
-Subject “[WSUS] 週次チェック結果” `
-Body $body `
-SmtpServer “smtp.company.com”
“`
トラブル発生時、上司への報告は避けられません。
以下のテンプレートを使えば、簡潔かつ必要十分な報告ができます:
“`
件名:【報告】WSUSトラブル対応完了
◯◯課長
お疲れ様です。△△です。
本日発生したWSUSトラブルについて、対応が完了しましたので報告いたします。
【発生事象】
– 発生日時:2026年3月16日 10:00頃
– 症状:クライアントPCに更新プログラムが配信されない
– 影響範囲:全社PC(約300台)
【原因】
WSUSサーバーの同期が3週間前から停止していた
(タスクスケジューラの実行アカウントのパスワード期限切れ)
【対応内容】
1. タスクスケジューラの実行アカウントを更新
2. 手動で同期を実行(成功確認)
3. 未承認の更新プログラムを承認
4. テストPCで動作確認
【対応完了時刻】
2026年3月16日 14:30
【再発防止策】
– 監視スクリプトを導入(同期異常を自動検知)
– タスクスケジューラの実行アカウントをパスワード無期限に変更
– 週次チェックリストの運用開始
【今後のスケジュール】
– 3/17(火):テストグループへ更新配信
– 3/24(火):本番グループへ更新配信
以上、よろしくお願いいたします。
“`
WSUS運用でよくある5つのミス:
重要なポイント:
これらのミスは、「気をつける」だけでは防げません。
必要なのは:
これらを「仕組み」として導入すれば、トラブルは激減します。
✅ こんな運用から解放されたい方へ
WSUS運用は、正直言って「面倒」「属人化しやすい」「評価されにくい」業務です。
もし、あなたが:
なら、一度キャリアを見直すタイミングかもしれません。
レバテックキャリアなら、インフラエンジニアの転職実績が豊富:
※無理に転職を勧めることはありません。まずは市場価値の確認だけでもOKです。
この記事を書いた人:
インフラエンジニア歴10年。大手SIerでWSUS運用を7年間担当し、過去30社のWSUS導入・移行を支援。
現在は、Intune導入コンサルティングを行いながら、同じ悩みを持つインフラエンジニアをサポート中。
この記事を書いた人:
IT業界で10年以上のキャリアを持つエンジニア。インフラ運用、開発、キャリア支援の経験をもとに、現場で本当に役立つ情報を発信中。