OS の Status を取得する VBScript を作成する


今回は少々レガシー系の記事を書きたいと思います。働き方改革と色々言われる中で、PC の状態を一括で管理したいという企業のリクエストが多くなってきている様な気がします。そのような背景もありつつPCの状態が一括監視できるように、今回は Windows の 起動状態を把握できる VBScript を作成したいと思います。

イベントログの取得について

今回は VBscript でイベントログからデータを抽出するようなスクリプトを作成します。PC の状態を示すイベントログはをまとめると以下の通りです。

参考記事
Windows のイベントビューアーを使って、何がいつ起きたか調べる
https://laboradian.com/find-out-event-using-event-viewer/

サンプルスクリプト

今回は単純にPCの開始/終了の時間を取得するスクリプトを作成しました。

sample.vbs
'取得ログをローカル時間に合わせる
Const CONVERT_TO_LOCAL_TIME = True
Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime") 
Set dtmEndDate = CreateObject("WbemScripting.SWbemDateTime") 
DateToCheck = Date
dtmStartDate.SetVarDate DateToCheck - 7, CONVERT_TO_LOCAL_TIME
dtmEndDate.SetVarDate DateToCheck + 1, CONVERT_TO_LOCAL_TIME

'イベントログの取得 今回は起動ログとシャットダウンのログ
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _ 
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colEvents = objWMIService.ExecQuery _ 
    ("Select * from Win32_NTLogEvent Where TimeWritten >= '" _ 
        & dtmStartDate & "' and TimeWritten < '" _ 
        & dtmEndDate & "' AND (EventCode = 6005 OR EventCode = 6006)")

'ログ生成
Dim msg
For each objEvent in colEvents
    Set tempDate = CreateObject("WbemScripting.SWbemDateTime") 
    tempDate.Value = objEvent.TimeWritten
If objEvent.EventCode = 6005 then
    msg = msg & "Start : " & tempDate.GetVarDate(True) & vbCrLf
ElseIf objEvent.EventCode = 6006 then
    msg = msg & "Stop : " & tempDate.GetVarDate(True) & vbCrLf
End If
Next

'ログ出力
Wscript.Echo msg

実際に実行してみる

このスクリプトを作成し「sample.vbs」等の適用な名前を付けて、任意の場所に配置します。コマンドプロンプトからこのスクリプトを呼び出すことで、PCの状態を Echo してくれます。

上記のことをイベントビューワーで確認することができますが、イベントビューワーから生成しようとするとかなり時間がかかってしまいます。また、業務時間の管理などに行う場合は、一人ひとりみるのは非常に手間がかかるので、上記のような形でスクリプト化するととても楽かもしれません。次回の記事では、実際に仮想空間に何台かデバイスを立ててみて、ログの一括取得を実施したいと思います。

参考記事

PCの起動時刻の取得 出退勤管理用
https://qiita.com/a2kiti/items/123894813a0975f19470

Windowsイベントログをコマンドでエクスポートする
http://quatrefromage.hatenablog.jp/entry/2016/08/06/164436