「誰がいつPCのロックを解除(アンロック)したかを正確に知りたい」。情報漏えい対策や勤務実態の把握、内部統制の観点で、このニーズは小規模から大規模まで共通です。本記事では、Windowsのセキュリティイベントログ(イベントID 4801)を使って、アンロック時刻・ユーザーを確実に記録・確認するための設定と運用のベストプラクティスを、ローカルPC/ドメイン環境の両面から詳しく解説します。
結論とポイント:アンロック操作はイベントID 4801 で監査可能
Windowsでは、ワークステーションがロック解除された際にセキュリティログへ イベントID 4801(The workstation was unlocked) が記録されます。これを有効にする監査サブカテゴリは 「その他のログオン/ログオフ イベント(Other Logon/Logoff Events)」 です。あわせてロック操作の ID 4800、ログオン成功 ID 4624、ログオン失敗 ID 4625 を監査すれば、ユーザーの利用開始・中断・再開のタイミングを時系列に把握できます。
対象バージョンと前提
- 対象OS:Windows 10 / Windows 11 / Windows Server(いずれもサポート世代)
- 要件:詳細監査ポリシー(Advanced Audit Policy)で「その他のログオン/ログオフ イベント」を 成功/失敗ともに有効化
- ローカルPCでは
gpedit.msc(Homeエディションは代替としてauditpol.exeを使用) - ドメイン環境ではGPMC(グループ ポリシー管理コンソール)でOU単位に配布可能
設定手順(ローカルPCの例)
- ローカル グループ ポリシー エディター(
Win+R→gpedit.msc)を起動。 - [コンピューターの構成] → [Windows の設定] → [セキュリティの設定] → [詳細監査ポリシーの構成] → [システム監査ポリシー] → [ログオン/ログオフ] を開く。
- [その他のログオン/ログオフ イベント] を 成功 および 失敗 ともに 有効 に設定。
- 設定を反映(
gpupdate /forceでも可)。 - イベント ビューアーを開き、[Windows ログ] → [セキュリティ] で ID 4801 をフィルターして解除時刻・ユーザーを確認。
PowerShell/コマンドラインで一括設定
GUIが使えない環境やHomeエディションでは auditpol.exe が便利です(管理者権限)。
AuditPol /set /subcategory:"Other Logon/Logoff Events" /success:enable /failure:enable
AuditPol /get /subcategory:"Other Logon/Logoff Events"
有効化後にテストとしてPCをロック(Win+L)→解除すると、セキュリティログへ 4800(ロック)と 4801(解除)が出力されます。
イベントの見方:何が分かるのか
イベントID 4801 には、解除したユーザー情報(アカウント名、ドメイン)、時刻、ログオンIDが記録されます。典型的な内容は次の通りです。
Log Name: Security
Event ID: 4801
Task Category: Logon
Level: Information
Keywords: Audit Success
User: <SYSTEM>
Description:
The workstation was unlocked.
Subject:
Security ID: <S-1-5-...>
Account Name: <UserName>
Account Domain:<DOMAIN or COMPUTERNAME>
Logon ID: 0xXXXXXXXX
イベント ビューアーでのフィルター方法
- イベント ビューアー → [Windows ログ] → [セキュリティ] を開く。
- 右ペインの [現在のログをフィルター] を選び、[イベントID] に
4801と入力。 - 必要に応じて期間やユーザーで絞り込み、一覧から該当イベントをダブルクリックして詳細を確認。
カスタムビュー(XMLクエリ)で再利用を効率化
頻繁に確認する場合はXMLクエリでカスタムビューを作ると便利です。
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[(EventID=4801)]]</Select>
</Query>
</QueryList>
関連イベントの対応表(ロック・ログオン・解除の全体像)
| イベントID | 名称(英語) | 主な用途 | 補足 |
|---|---|---|---|
| 4800 | The workstation was locked | ユーザーがロックした時刻を記録 | 休憩開始や離席の把握に有用 |
| 4801 | The workstation was unlocked | ユーザーがロック解除した時刻を記録 | 利用再開のタイミングを特定 |
| 4624 | An account was successfully logged on | ログオン成功 | ログオンタイプ 2(対話)、7(アンロック) 等の区別が可能 |
| 4625 | An account failed to log on | ログオン失敗 | ブルートフォースや誤入力の検知に |
| 4634 | An account was logged off | ログオフ | 明示的なサインアウトの有無を把握 |
| 4647 | User initiated logoff | ユーザー起因のログオフ | 自発的な終了操作の証跡 |
| 4778/4779 | RDP セッションの再接続/切断 | リモート利用の把握 | ターミナルサービス系の指標 |
クイック検証:PowerShellで直近の解除履歴を出力
# 直近7日間のアンロック(ID 4801)を一覧化
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4801; StartTime=(Get-Date).AddDays(-7)} |
Select-Object TimeCreated,
@{Name='User';Expression={$_.Properties[1].Value}},
@{Name='Domain';Expression={$_.Properties[2].Value}},
@{Name='LogonId';Expression={$_.Properties[3].Value}} |
Sort-Object TimeCreated |
Format-Table -Auto
# CSVエクスポート
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4801; StartTime=(Get-Date).AddDays(-30)} |
Select-Object TimeCreated,
@{Name='User';Expression={$*.Properties[1].Value}},
@{Name='Domain';Expression={$*.Properties[2].Value}},
@{Name='LogonId';Expression={$_.Properties[3].Value}} |
Export-Csv "$env:USERPROFILE\Desktop\UnlockHistory.csv" -NoTypeInformation -Encoding UTF8
※プロパティの添字(Properties[1] 等)はOSビルドで異なる場合があるため、必要に応じて $_.Properties | Format-Table で項目の並びを確認してください。
ドメイン環境での一括配布(GPMC)
- グループ ポリシー管理コンソール(GPMC) を起動し、新規GPOを作成。
- [コンピューターの構成] → [ポリシー] → [Windows の設定] → [セキュリティの設定] → [詳細監査ポリシーの構成] → [システム監査ポリシー] → [ログオン/ログオフ] を開く。
- [その他のログオン/ログオフ イベント] を 成功/失敗ともに有効 に設定。
- 必要に応じて、[ローカル ポリシー] → [セキュリティ オプション] の 「監査: 監査ポリシーのサブカテゴリ設定を(Windows Vista以降)監査ポリシーの設定に上書きして使用する」 を 有効 に設定(Advanced Audit Policyの適用を確実にする推奨設定)。
- 対象OUにリンクし、クライアントで
gpupdate /forceを実行して反映。
大量PCからの集約と可視化
Windows Event Forwarding(WEF)
- スケールメリット:エージェント不要でWindows標準機能のみで集約可能。
- 方式:コレクター開始(Collector-initiated) または ソース開始(Source-initiated) のサブスクリプションを設計。
- フィルタ:セキュリティログの
EventID=4800 OR 4801を転送対象とし、ネットワーク負荷を最小化。
SIEM連携(例:KQLや一般的な検索構文)
// Microsoft Sentinel(KQLの例)
SecurityEvent
| where EventID in (4800, 4801)
| project TimeGenerated, Computer, Account, EventID, Activity
| order by TimeGenerated desc
# Splunkの例
index=winsec (EventCode=4800 OR EventCode=4801)
| stats earliest(_time) as first, latest(_time) as last by host, user, EventCode
運用のヒント:解除時刻のビジネス活用
- 内部統制・監査対応: 機密端末での離席対策運用(ロック必須)と合わせて
4800/4801のギャップをチェック。 - 働き方の可視化: ログオン(
4624)直後に頻繁なロック/アンロックが続く端末を特定し、業務フローや自動ロック時間の適正化を検討。 - セキュリティ監視: 未明の異常な解除(
4801)が続く端末をアラート対象に。
よくある落とし穴と対処
| 症状 | 原因仮説 | 対処 |
|---|---|---|
4801 が出ない | 詳細監査が未有効/GPO未適用/HomeエディションでGUI未設定 | auditpol /get /category:* で状態を確認し、必要なら auditpol /set ... で有効化 |
| ユーザー名が期待と違う | 資格情報の委任/ドメインとローカルの区別/サービスアカウント | イベントの Account Domain と Logon ID を突合し、4624 と併読 |
| 大量環境でログが流れる | セキュリティログ最大サイズが小さい/上書き設定が短い | セキュリティログの最大サイズを拡張し、アーカイブポリシーを確立 |
| RDPと物理コンソールの区別がつかない | 解除は 4801 だけでは端末形態を示さない | 4624 のログオンタイプ、4778/4779 と突合して種別を判別 |
アンロックとログオンの相関を見る(実務例)
# アンロック(4801)直前のログオン(4624 Type 7)を突き合わせる例
$unlock = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4801; StartTime=(Get-Date).AddDays(-3)}
$logon = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624; StartTime=(Get-Date).AddDays(-3)}
$join = foreach ($u in $unlock) {
$t = $u.TimeCreated
$candidate = $logon | Where-Object {
$*.TimeCreated -le $t.AddSeconds(5) -and $*.TimeCreated -ge $t.AddMinutes(-5)
} | Select-Object -First 1
[pscustomobject]@{
UnlockTime = $t
UnlockUser = $u.Properties[1].Value
Domain = $u.Properties[2].Value
NearLogon = if ($candidate) { $candidate.TimeCreated } else { $null }
}
}
$join | Sort-Object UnlockTime | Format-Table -Auto
このように近接時間の 4624(ログオンタイプ7のことが多い)とペアで読むと、解除の妥当性や端末操作の連続性を評価できます。
スクリーンセーバー連動の補助ログ
- 4802:スクリーンセーバー開始(The screen saver was invoked)
- 4803:スクリーンセーバー解除(The screen saver was dismissed)
自動ロックまでの猶予や運用ルールの遵守状況を、4800/4801 と合わせて確認できます。
ログ容量と保持戦略(運用設計)
- セキュリティログ最大サイズ: 利用規模に応じて拡張(例:中規模~大規模では数百MB以上を目安)。
- 上書きポリシー: 「必要に応じて上書き」か「手動でログをアーカイブ後に上書き」など、監査要件に合わせて選定。
- アーカイブ: 定期エクスポート(WEFやSIEMでの長期保存が理想)。
RDP・仮想デスクトップ・共有端末での考慮点
- RDP再接続: 端末側の
4801だけでなく、接続元/先の4778/4779(ターミナルサービス)も追跡。 - 共有端末: アカウント切替の頻度が高いため、
4624/4634/4647とペアで時系列グラフ化すると可視化が容易。 - VDI: マスターイメージで監査設定を組み込んでおき、プール展開後もGPOで強制。
セキュリティ/プライバシーに関する注意
- アンロック履歴は個人の勤務実態と結び付く可能性があるため、就業規則・プライバシーポリシーを整備し、目的・保管期間・閲覧権限を明確化。
- 監査ログは改ざん耐性が重要。管理者権限の厳格運用と転送・保全で証跡の信頼性を担保。
テンプレート:監査要件の定義例(社内向け)
| 項目 | 推奨値/記載例 |
|---|---|
| 収集対象 | イベントID 4800, 4801, 4624, 4625, 4634, 4647 |
| 保持期間 | 90~180日(法令/契約に応じて調整) |
| 監視ルール | 深夜帯の4801、短時間の4800↔4801ループ、連続4625の後の4801など |
| 権限 | SIEM閲覧は最小権限、検索・エクスポートは監査チームのみ |
| 報告頻度 | 月次レビュー+異常時アラート即時通知 |
運用チェックリスト(配布前後)
- 有効化確認:
auditpol /get /subcategory:"Other Logon/Logoff Events"が Success/Failure: Enabled。 - GPO継承: 対象OUでGPOの適用順とWMIフィルターを確認。
- テストケース: ロック→解除、失敗解除(誤パスワード)、RDP再接続、スクリーンセーバー。
- ログ容量: セキュリティログの最大サイズ・上書きポリシーを定義済み。
- 可視化: ダッシュボードまたはカスタムビューのテンプレート化。
トラブルシューティング深掘り
ケース1:Homeエディションでgpeditがない
auditpol.exe による有効化で代替可能です。必要に応じてスクリプト化して配布します。
AuditPol /set /subcategory:"Other Logon/Logoff Events" /success:enable /failure:enable
wevtutil qe Security "/q:*[System[EventID=4801]]" /f:text /c:5
ケース2:イベントは出るがユーザーが空欄/期待と違う
アカウント種別(ローカル vs ドメイン)やサービスアカウント、UACの影響を確認。4624 とログオンタイプの整合を見て原因を切り分けます。
ケース3:時間がずれる
クライアントとサーバーのNTP同期(ドメインならDC、スタンドアロンなら信頼できるNTP)を見直します。監査では時刻の一貫性が品質の鍵です。
自動レポート用スクリプト(管理者向けサンプル)
# 1か月のロック/アンロックを端末単位・ユーザー単位で集計
$start = (Get-Date).AddMonths(-1)
$events = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=@(4800,4801); StartTime=$start}
$rows = foreach ($e in $events) {
[pscustomobject]@{
TimeCreated = $e.TimeCreated
EventID = $e.Id
User = $e.Properties[1].Value
Domain = $e.Properties[2].Value
Computer = $e.MachineName
}
}
$summaryUser = $rows | Group-Object Domain,User,EventID | Select-Object Name, Count
$summaryHost = $rows | Group-Object Computer,EventID | Select-Object Name, Count
$reportDir = "$env:USERPROFILE\Desktop\UnlockReport"
New-Item -ItemType Directory -Force -Path $reportDir | Out-Null
$rows | Export-Csv "$reportDir\raw_4800_4801.csv" -NoTypeInformation -Encoding UTF8
$summaryUser | Export-Csv "$reportDir\summary_by_user.csv" -NoTypeInformation -Encoding UTF8
$summaryHost | Export-Csv "$reportDir\summary_by_host.csv" -NoTypeInformation -Encoding UTF8
Write-Host "Report exported to $reportDir"
ポリシー設計のコツ:ノイズを抑えつつ必要十分に
- 最小限のサブカテゴリ: まずは
4800/4801と4624/4625に限定し、必要に応じて拡張。 - 自動ロックの強制: ロック解除の履歴はロック運用が前提。一定時間での自動ロック(スクリーンセーバー+パスワード保護)を徹底。
- 組織ルールとの整合: 私物端末や在宅環境では、プライバシー配慮と目的限定を明確に。
サンプル:管理台帳(Excel想定)に載せるべき観点
| 列名 | 説明 | 例 |
|---|---|---|
| Computer | 端末名 | PC-001 |
| UserPrincipal | ユーザー(ドメイン\ユーザー) | CONTOSO\taro |
| LockTime | ID 4800の時刻 | 2025-11-01 12:01:22 |
| UnlockTime | ID 4801の時刻 | 2025-11-01 12:05:07 |
| Elapsed(min) | 解除までの経過分数 | 3.8 |
| Remarks | 例外・備考 | 緊急対応のため夜間解除 |
監査の精度を高めるコリレーション設計
- 端末×ユーザーの二軸: ユーザー単位だけでなく端末単位の異常(特定PCのみ夜間解除多発)を拾う。
- 時間帯ルール: 業務時間外の
4801はアラート、計画保守日は抑制など。 - 連続失敗後の解除:
4625の連続後に4801が出たら要注意。
FAQ:現場からの質問に答える
Q. Windows Hello(顔/指紋/PIN)でも 4801 は出ますか?
A. はい。解除方法に関わらず解除イベントは記録されます。認証方式の詳細は 4624 側のフィールド(ログオンプロセス等)で把握するのが一般的です。
Q. ロックを強制したいのですが?
A. GPOでスクリーンセーバーのタイムアウトとパスワード保護を強制し、ロック忘れの発生を抑止します。ログは遵守状況の確認に。
Q. どのくらいの容量を確保するべき?
A. 端末の稼働パターン次第ですが、セキュリティログは少なくとも数十MB、可能なら数百MB以上を推奨。WEFやSIEMで長期保存を行うと安心です。
Q. 監査有効化でパフォーマンスに影響は?
A. 本サブカテゴリの負荷は一般に軽微です。ただし大規模に集約する場合は転送量・保存量のキャパシティ計画が必要です。
まとめ:解除監査の最短ルート
- やることはシンプル: 詳細監査の Other Logon/Logoff Events を有効化 → 4801 を見る。ロックは 4800。
- 見るべき周辺ログ: 4624/4625/4634/4647、必要に応じて 4778/4779・4802/4803。
- 運用に耐える設計: GPOで一括配布、WEF/SIEMで集約、容量と保持をルール化。
- 実効性: テスト(Win+L→解除)で即座に検証し、カスタムビューやスクリプトで日常運用に落とし込む。
付録:管理者向けコマンド早見表
| 目的 | コマンド | メモ |
|---|---|---|
| 監査有効化 | AuditPol /set /subcategory:"Other Logon/Logoff Events" /success:enable /failure:enable | Homeでも利用可能 |
| 状態確認 | AuditPol /get /subcategory:"Other Logon/Logoff Events" | Enabled を確認 |
| 直近の解除5件 | wevtutil qe Security "/q:*[System[EventID=4801]]" /f:text /c:5 | 簡易確認に最適 |
| PowerShell検索 | Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4801} | 柔軟な絞り込みが可能 |
| CSV出力 | ... | Export-Csv .\UnlockHistory.csv -NoTypeInformation -Encoding UTF8 | 報告用 |
付録:XMLクエリ(UnlockとLockをまとめて取得)
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[(EventID=4800 or EventID=4801)]]</Select>
</Query>
</QueryList>

コメント