Windowsパソコン(PC)のイベントログから、起動時刻・ログオンおよび停止時刻・ログオフ時刻を収集する具体的な方法です。
起動時刻やログイン時刻は、イベントログの「System」に記録されています。 関係のありそうなイベントIDは以下の通りです。
- 6005 :起動
- 6006 :シャットダウン
- 6008 :正常ではない終了
- 7001 :サービススタート(ログオン:Windows10高速起動時)
- 7002 :サービスストップ(ログオフ:Windows10高速起動時)
Windowsのバージョンで対象とするIDは異なります。windows7,8なら、6005と6006と6008だけ。windows10以降の場合はログオン・ログオフ(7001,7002)も取得する必要があります。Windows10の高速起動・終了を使うと、6005と6006と6008に該当するログを書かず、ログオン・ログオフ(7001,7002)で記録するからです。
実は、イベントログには、Sequrityのカテゴリに、以下のイベントもあります。
- 4672 : Spcial Logon
- 4624 : Logon
ですが、監査ログで情報が詳しすぎて、とても面倒くさく、今回のように時刻だけ知りたい場合には適さないのでははずしました。監査ログの取得方法とログの例は、この記事の最後に参考としてのせておきます。
イベントログの情報はイベントビューアで見ることができます。ですが、調査するにはある程度まとまったデータが必要です。今回は情報をCSVデータとして取得する方法に絞ります。取得するには、WindowsのPowerShellを使います。
<手順1>
以下のスクリプトをメモ帳などにコピーして、出力するCSVの指定("C:\myWork\99_tmp\event.csv")を、環境にあわせて変更します。
GET-WinEvent System | Where-Object{$_.Id -eq 6005 -or $_.Id -eq 6006 -or $_.Id -eq 6008 -or $_.Id -eq 7002 -or $_.Id -eq 7001} | select-Object TimeCreated,Id,Message | export-CSV "C:\myWork\99_tmp\event.csv" -Encoding UTF8
<手順2>
Windows powershellを「管理者権限」で立ち上げます。修正したスクリプトを貼り付けて実行します。

<手順3>
実行すると、以下のようなCSVファイルが出力されるので確認します。
#TYPE Selected.System.Diagnostics.Eventing.Reader.EventLogRecord
"TimeCreated","Id","Message"
"2018/01/12 12:42:52","7001","カスタマー エクスペリエンス向上プログラムのユーザー ログオン通知"
"2018/01/12 9:19:16","7002","カスタマー エクスペリエンス向上プログラムのユーザー ログオフ通知"
"2018/01/12 9:14:33","7001","カスタマー エクスペリエンス向上プログラムのユーザー ログオン通知"
"2018/01/12 9:13:26","7002","カスタマー エクスペリエンス向上プログラムのユーザー ログオフ通知"
"2018/01/12 8:16:04","7001","カスタマー エクスペリエンス向上プログラムのユーザー ログオン通知"
"2018/01/12 1:02:41","7002","カスタマー エクスペリエンス向上プログラムのユーザー ログオフ通知"
"2018/01/11 19:09:42","7001","カスタマー エクスペリエンス向上プログラムのユーザー ログオン通知"
"2018/01/11 0:33:50","7002","カスタマー エクスペリエンス向上プログラムのユーザー ログオフ通知"
"2018/01/10 19:22:06","7001","カスタマー エクスペリエンス向上プログラムのユーザー ログオン通知"
"2018/01/10 0:33:46","7002","カスタマー エクスペリエンス向上プログラムのユーザー ログオフ通知"
"2018/01/09 19:29:29","7001","カスタマー エクスペリエンス向上プログラムのユーザー ログオン通知"
起動またはログインおよび終了またはログオフの時間データは取得できました。なお、上記のスクリプトは「GET-WinEvent」を使っています。他に「GET-EventLog」を使う方法もありますが、Windows10だと取得できないログの種類があったり、アーカイブファイルを読めないという欠点があるので、使わないほうがいいです。
<手順4>
イベントログから取得しただけのCSVデータを見やすい形に整形します。たいていの場合、不要な情報の除去などのデータ整備も必要になります。同一日付に複数回の起動・終了のログが残っていたり、深夜残業などで起動した日と終了した日が異なる場合があるからです。手作業でもできますが、プログラムとかで、整形までスマートにやったほうがいいでしょう。
この手順については、EXCEL VBAで集計するツールとPythonでやる場合がありますが、行数の関係で別記事にしています。
以上です。
以下は、このテーマに関連した注意事項と参考情報です。
注意事項:ログサイズの上限と過去ログからの情報取得について
残念ながらログサイズには上限があります。あまり古いログはとれません。自分の環境だと直近2ケ月分くらいでした。最大ログサイズとか、過去ログを復活させられるかどうかなどは、コンピュータの管理>イベントビューアでシステムのプロパティで確認します。

ここで、上記みたいに「イベントを上書きする」になってると、古いイベントは上書きして消されているので、過去ログを復旧するのは、ちょっと望み薄です。 イベントを上書きしないでログをアーカイブするになっていれば、過去のログも確認できる可能性がありますが、まめに定期的に取得しておくのが、確実ではあります。
参考情報:過去のログの取得方法について
ログをアーカイブする場合、過去ログが、evtx形式ファイルに保存されます。 場所はログのパスで確認します。

そのファイルから過去ログを読み出す場合は、「GET-WinEvent -path 'フルパスのアーカイブファイル名'」の様に指定します。
参考情報:監査イベントのログイン・ログオフを取得する方法
最後に監査イベントのログを取得する方法です。前半に追記した、監査イベントの「4672:special logon」「4624:logon」を取得するひとつの方法はこちらです。
GET-WinEvent Security | Where-Object{$_.Id -eq 4624 -or $_.Id -eq 4672} | select-Object TimeCreated,Id,Message | export-CSV "C:\myWork\99_tmp\event_sequrity.log" -Encoding UTF8
取得できるログのサンプルはこちらです。
4672のサンプル(Windows10)
"2018/10/27 22:05:30","4672","新しいログオンに特権が割り当てられました。
サブジェクト:
セキュリティ ID: S-1-5-18
アカウント名: SYSTEM
アカウント ドメイン: NT AUTHORITY
ログオン ID: 0x3E7特権: SeAssignPrimaryTokenPrivilege
SeTcbPrivilege
SeSecurityPrivilege
SeTakeOwnershipPrivilege
SeLoadDriverPrivilege
SeBackupPrivilege
SeRestorePrivilege
SeDebugPrivilege
SeAuditPrivilege
SeSystemEnvironmentPrivilege
SeImpersonatePrivilege
SeDelegateSessionUserImpersonatePrivilege"
4624のサンプル(Windows10)
"2018/10/27 22:05:30","4624","アカウントが正常にログオンしました。
サブジェクト:
セキュリティ ID: S-1-5-18
アカウント名: DESKTOP-7L6KDGP$
アカウント ドメイン: WORKGROUP
ログオン ID: 0x3E7ログオン情報:
ログオン タイプ: 5
制限付き管理モード: -
仮想アカウント: いいえ
昇格されたトークン: はい偽装レベル: 偽装
新しいログオン:
セキュリティ ID: S-1-5-18
アカウント名: SYSTEM
アカウント ドメイン: NT AUTHORITY
ログオン ID: 0x3E7
リンクされたログオン ID: 0x0
ネットワーク アカウント名: -
ネットワーク アカウント ドメイン: -
ログオン GUID: {00000000-0000-0000-0000-000000000000}プロセス情報:
プロセス ID: 0x370
プロセス名: C:\Windows\System32\services.exeネットワーク情報:
ワークステーション名: -
ソース ネットワーク アドレス: -
ソース ポート: -詳細な認証情報:
ログオン プロセス: Advapi
認証パッケージ: Negotiate
移行されたサービス: -
パッケージ名 (NTLM のみ): -
キーの長さ: 0
このログは高度サイバー攻撃などを受けていないかを監査するためにあります。例えば、4672の場合だと「意図していないアカウントに対して出力されていたら、MS14-068の脆弱性が悪用され、攻撃者が不正に権限昇格をおこなった可能性がある」みたいに監査していくわけです。自分のPCが乗っ取られてるんじゃないか・・とか、そういう緊急事態に参照するログだと思っておけばよさげです。
ではでは。