Windowsのロック解除を監査する方法|イベントID4801でユーザーと時刻を記録・確認する具体手順【Windows 10/11/Server対応】

「誰がいつ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の例)

  1. ローカル グループ ポリシー エディター(Win+R → gpedit.msc)を起動。
  2. [コンピューターの構成] → [Windows の設定] → [セキュリティの設定] → [詳細監査ポリシーの構成] → [システム監査ポリシー] → [ログオン/ログオフ] を開く。
  3. [その他のログオン/ログオフ イベント] を 成功 および 失敗 ともに 有効 に設定。
  4. 設定を反映(gpupdate /force でも可)。
  5. イベント ビューアーを開き、[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

イベント ビューアーでのフィルター方法

  1. イベント ビューアー → [Windows ログ] → [セキュリティ] を開く。
  2. 右ペインの [現在のログをフィルター] を選び、[イベントID] に 4801 と入力。
  3. 必要に応じて期間やユーザーで絞り込み、一覧から該当イベントをダブルクリックして詳細を確認。

カスタムビュー(XMLクエリ)で再利用を効率化

頻繁に確認する場合はXMLクエリでカスタムビューを作ると便利です。

<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security">*[System[(EventID=4801)]]</Select>
  </Query>
</QueryList>

関連イベントの対応表(ロック・ログオン・解除の全体像)

イベントID名称(英語)主な用途補足
4800The workstation was lockedユーザーがロックした時刻を記録休憩開始や離席の把握に有用
4801The workstation was unlockedユーザーがロック解除した時刻を記録利用再開のタイミングを特定
4624An account was successfully logged onログオン成功ログオンタイプ 2(対話)、7(アンロック) 等の区別が可能
4625An account failed to log onログオン失敗ブルートフォースや誤入力の検知に
4634An account was logged offログオフ明示的なサインアウトの有無を把握
4647User initiated logoffユーザー起因のログオフ自発的な終了操作の証跡
4778/4779RDP セッションの再接続/切断リモート利用の把握ターミナルサービス系の指標

クイック検証: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)

  1. グループ ポリシー管理コンソール(GPMC) を起動し、新規GPOを作成。
  2. [コンピューターの構成] → [ポリシー] → [Windows の設定] → [セキュリティの設定] → [詳細監査ポリシーの構成] → [システム監査ポリシー] → [ログオン/ログオフ] を開く。
  3. [その他のログオン/ログオフ イベント] を 成功/失敗ともに有効 に設定。
  4. 必要に応じて、[ローカル ポリシー] → [セキュリティ オプション] の 「監査: 監査ポリシーのサブカテゴリ設定を(Windows Vista以降)監査ポリシーの設定に上書きして使用する」 を 有効 に設定(Advanced Audit Policyの適用を確実にする推奨設定)。
  5. 対象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
LockTimeID 4800の時刻2025-11-01 12:01:22
UnlockTimeID 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:enableHomeでも利用可能
状態確認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>

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次