GeekFactory

int128.hatenablog.com

システムの起動・終了時に記録されるイベントログ

Windows Vistaにて調べてみました。

ログのタイミングソースイベントIDメッセージ
起動EventLog6005イベント ログ サービスが開始されました。
終了EventLog6006イベント ログ サービスが停止されました。
休止状態に移行Kernel-Power42システムがスリープ状態になります。
休止状態から回復Power-Troubleshooter1システムはスリープ状態から再開しました。

ただし、Power-Troubleshooterメッセージは即時に記録されず、終了時または休止状態に移行時に一緒に記録されるようです。
これらのイベントをWMIで取得するためのコードも載せておきます。プロパティの名前などは WMI Creator で確認すると便利ですね。

var wbemFlagReturnImmediately = 0x10;
var wbemFlagForwardOnly = 0x20;
var eventObject = GetObject('winmgmts:{impersonationLevel=impersonate}');
var eventSet = eventObject.ExecQuery(
'select TimeGenerated, EventCode from Win32_NTLogEvent' +
' where ((EventCode = 6005 or EventCode = 6006) and SourceName = "EventLog")' +
' or (EventCode = 1 and SourceName = "Microsoft-Windows-Power-Troubleshooter")' +
' or (EventCode = 42 and SourceName = "Microsoft-Windows-Kernel-Power")',
'WQL',
wbemFlagReturnImmediately | wbemFlagForwardOnly);

ブート・シャットダウン日時を表示するWSHスクリプト

PCをいつ起動していつシャットダウンしたかを表示するスクリプト

<job id="eventlogview">
<script language="VBScript">

WScript.Echo "<eventLog>"
Set EventObject = GetObject("winmgmts:{impersonationLevel=impersonate}")
Set EventSet = EventObject.ExecQuery("select * from Win32_NTLogEvent")
For Each AnEvent In EventSet
If AnEvent.EventCode = 6005 Then
WScript.Echo "<start>" & AnEvent.TimeGenerated & "</start>"
ElseIf AnEvent.EventCode = 6006 Then
WScript.Echo "<end>" & AnEvent.TimeGenerated & "</end>"
End If
Next
WScript.Echo "</eventLog>"

</script>
</job>

実行結果は以下の感じ。これをSOAPクライアントでWebに投げれば、生活時間の可視化ができるね。面白そう。

D:\tmp>cscript eventlogview.wsf
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

<eventLog>
<start>20071210215654.000000+540</start>
<end>20071210001810.000000+540</end>
<start>20071206233622.000000+540</start>
<end>20071206095330.000000+540</end>
<start>20071206091018.000000+540</start>
<end>20071205001757.000000+540</end>
<start>20071204195513.000000+540</start>
...