"BOKU"のITな日常

62歳・文系システムエンジニアの”BOKU”は日々勉強を楽しんでます

勤務実態を調査用に、イベントログからログオン・ログオフ時間等を抽出する方法。(GET-WinEvent)

今回は、Windows10パソコン(PC)のイベントログから、起動時刻・ログオンおよび停止時刻・ログオフ時刻を収集する具体的な方法についてのお話です。

f:id:arakan_no_boku:20190221231559j:plain

 

前振り

 

ブラック企業労働争議などの記事に、「PCのログを押収し、起動時刻やログイン時刻を調査した・・」等の記述がよくあります。 

でも、よく目にするわりに「PCのログから起動時刻やログイン時刻を調査する」具体的なやり方を知っている人は意外と少なかったりします。

自分も急に必要になったときに、記憶だけでぱっとできる自信はないです。

なので。

まとめておくことにしました。
 

起動・ログインに関係のあるイベントを拾う

 

取得の対象になる「PCのログ」とはイベントログのことです。

起動時刻やログイン時刻は、イベントログの「System」ログに記録されています。 

 

抽出対象にするイベントIDのリスト

 

関係のありそうなイベントIDは以下の通りです。

  • 6005 :起動
  • 6006 :シャットダウン
  • 6008 :正常ではない終了
  • 7001 :サービススタート(ログオン:Windows10高速起動時)
  • 7002 :サービスストップ(ログオフ:Windows10高速起動時)

 

意外と情報がなく、以下のサイトを参考にさせてもらいました。

pentan.net

 

Windowsのバージョンで対象とするIDは違う

 

windows7,8なら、6005と6006と6008だけで良いです。

windows10の場合はログオン・ログオフ(7001,7002)を取得する必要があります。

Windows10の高速起動・終了を使うと、6005と6006と6008に該当するログを書かず、ログオン・ログオフ(7001,7002)で記録するからです。

実は、イベントログには、Sequrityのカテゴリに、以下のイベントもあります。

  • 4672 : Spcial Logon
  • 4624 : Logon

ですが、監査ログで情報が詳しすぎて、とても面倒くさく、今回のように時刻だけ知りたい場合には適さないので上記からははずしました。

いちおう、この記事の最後に、取得方法とログの例をのせておきますので、興味があればどうぞ。 

 

PowerShellで情報を取得して、CSVファイルにする

 

さて。

イベントログの情報を取得する方法にはいります。

もちろん、イベントビューアでも見ることはできますが、「PCのログを押収し・・」にはあたらないので、情報をCSVデータとして取得する方法に絞ります。

テキストで取得するには、WindowsPowerShellを使います。 

 

イベントIDを取得するGET-WinEventコマンド

 

Windows powershellを「管理者権限」で立ち上げます。 

EventLogから起動・終了(またはログオン・ログオフ)のイベントを拾って、日時とイベントIDとメッセージのみを、CSVファイルにはきだします。 

実行するコマンドです。  

GET-WinEventを使います。 

 

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

 

f:id:arakan_no_boku:20180414201528j:plain

上記をコピペで実行する場合は、出力するCSVの指定("C:\myWork\99_tmp\event.csv")を、環境にあわせて変更してください。  

なお。

GET-EventLogというコマンドを使う方法が紹介されている場合も多いですが、このコマンドは古いです。

Windows10だと取得できないログの種類があったり、アーカイブファイルを読めないという欠点があるので、使わないほうがいいです。

 

実行して出力されるCSVファイルのイメージサンプル

 

実行すると、以下のような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","カスタマー エクスペリエンス向上プログラムのユーザー ログオン通知"

 

Windows10で、かつ、高速起動・終了を使っているので、ほとんど7001、7002ばかり拾われてます。

とりあえず、起動またはログインおよび終了またはログオフの時間データは取得できました。 

 

CSVデータを整理して、1日の始業・終業時刻を求める

 

イベントログから取得しただけのCSVデータは、同一日付に複数回の起動・終了のログが残っていたり、深夜残業などで起動した日と終了した日が異なる場合があるなど問題が残っている場合がほとんどです。

1日の「始業時刻」と「終業時刻」を見やすくするためには整理が必要です。

整理そのものは、手作業でもできます。

でも。

面倒ではあります。

沢山の人数分を処理したりする場合は、プログラムとかで、整形までスマートにやったほうがいいでしょう。

ということで。

別記事で、EXCEL VBAで集計するツールを作っています。

arakan-pgm-ai.hatenablog.com

また、同様のことpythonでやる例も書いてます。

arakan-pgm-ai.hatenablog.com

参考までに。

 

注意事項:ログサイズの上限と過去ログからの情報取得について

 

残念ながらログサイズには上限があります。 

あまり古いログはとれません。

自分の環境だと直近2ケ月分くらいでした。 

最大ログサイズとか、過去ログを復活させられるかどうかなどは、コンピュータの管理>イベントビューアでシステムのプロパティで確認します。

f:id:arakan_no_boku:20180112195712j:plain

ここで、上記みたいに「イベントを上書きする」になってると、古いイベントは上書きして消されているので、過去ログを復旧するのは、ちょっと望み薄です。 

イベントを上書きしないでログをアーカイブするになっていれば、過去のログも確認できる可能性がありますが、まめに定期的に取得しておくのが、確実ではあります。

 

過去のログの取得方法について

 

さて。 

ログをアーカイブする場合、過去ログが、evtx形式ファイルに保存されます。 

場所はログのパスで確認します。

f:id:arakan_no_boku:20180112230422j:plain

 

そのファイルから過去ログを読み出す場合は、「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が乗っ取られてるんじゃないか・・とか、そういう緊急事態には参照するログだと思っておけばよさげです。

ではでは。