アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うこと。

PCのログから起動・ログイン時間を抽出して勤務実態を調査する方法(GET-WinEvent)について

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

 

まあ、できるだろうな・・イベントログを見れば・・。

 

いつも、その程度に思って流してました。

 

でも、よく考えてみれば、具体的かつ効率的なやり方ってどうしたら良いか?を具体的に理解しているわけではないのにある日気づいたのですね。

 

ということで、調べてみることにしました。

 

どういう情報を拾えばよいのか?

 

 イベントログのSystemログに記録されているみたいです。

 

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

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

 

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

pentan.net

 

windows7,8なら、6005と6006と6008だけで良いのですが、Windows10の高速起動・終了を使った場合、そのログを書かないので、かわりにログオン・ログオフ(7001,7002)をひろう必要がある・・ということですね。

 

これをイベントビューアで見るのも良いですけど、WindowsにはPowerShellという便利なものがあるので、今回はそれを使います。

 

テキストで取得しておいた方が後々便利ですしね。

 

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

 

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

 

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

 

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

 

実行するコマンドです。 

 

GET-EventLogというコマンドを使う方法が紹介されている場合が多いですが、このコマンドは古いのでWindows10だと取得できないログの種類があったりしますし、アーカイブファイルを読めないという欠点があります。

 

なので、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.log" -Encoding UTF8

 

実行すると、以下のような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ばかり拾われてますが、まあ、こんなものでしょう。

 

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

 

あまり古いログはとれません。(自分の環境だと直近2ケ月分くらいでした)

 

コンピュータの管理>イベントビューアでシステムのプロパティで確認します。

f:id:arakan_no_boku:20180112195712j:plain

 

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

 

イベントを上書きしないでログをアーカイブするになっていれば、過去のログも確認できるみたいです。

 

 

過去のログは、evtx形式のファイルに保存されます。

 

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

f:id:arakan_no_boku:20180112230422j:plain

 

そのファイルから読み出す場合は、「GET-WinEvent  -path 'フルパスのアーカイブファイル名'」の様に指定します。

 

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

 

もう少し課題はあるかな

 

CSVで取得した時系列データをつらつらと眺めてみました。

 

これを丹念に目でおっていけば、確かに勤務実態の調査データにはなりそうです。

 

でも、考えてみれば、PCなんて1日の中で何回か起動・終了することもあります。

 

徹夜で仕事してれば、起動した日と終了した日が異なる場合も、ままありますし、どの時間が「始業時刻」で、どれが「終業時刻」なのか・・って、結構面倒な判断が必要だったりします。

 

それに、証拠として使うには、EXCELの表とかで勤務実績表みたいな形に整形しないといけないでしょうし。

 

まあまあ、手作業で手間がかかりますね。

 

このへんまで、スマートにできないかな・・なんて、思ってしまいます。

 

また、時間ある時に考えてみようかな。

 

とりあえず、今回はこのへんで。

 

2018/01/14追記

上記のデータ整形をpythonでやってみました。

arakan-pgm-ai.hatenablog.com