VBAから
・Windowsのイベントログを取得
できます!
例えば
・PCを起動
・PCを終了
・ログイン
・ログアウト
した時間を取得できます!
VBAコード
ここでは例として、
・2021年10月の
・PCの起動時間と終了時間
・ログイン時間とログアウト時間
のイベントログを取得します。
取得したイベントログをシート「sample」の2列名と3列名に出力します。
※2列名に「イベント発生時刻」、3列名に「イベント名」を出力します。
Option Explicit
Sub sample()
Const EVENT_TIME_COLUMN As Integer = 2
Const EVENT_NAME_COLUMN As Integer = 3
Const START_ROW As Integer = 2
Dim objLocator As Object
Dim objServer As Object
Dim strCmd As String
Dim objEveSet As Object
Dim eve As Object
Dim ws As Worksheet
Dim i As Double
Dim strDate As String
Dim utcDate As Date
Dim jstDate As Date
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objServer = objLocator.ConnectServer()
'Eventcode
'┗6005:PC起動
'┗6006:PC終了
'┗7001:ログイン
'┗7002:ログアウト
strCmd = "Select * From Win32_NTLogEvent Where " & _
"Logfile = 'System' " & _
"And (Eventcode = '6005' Or Eventcode = '6006'" & _
"Or Eventcode = '7001' Or Eventcode = '7002')" & _
"AND TimeGenerated > '2021/10/01'" & _
"AND TimeGenerated < '2021/11/01'"
'イベントログ取得
Set objEveSet = objServer.ExecQuery(strCmd)
'出力するシートを指定
Set ws = Worksheets("sample")
i = START_ROW
'結果を取得
For Each eve In objEveSet
'日時(UTC)である「yyyymmddhhmmss.000000-000」から「000000-000」を除去
strDate = Left(eve.TimeWritten, 14)
'日時(UTC)を整形
utcDate = CDate(Mid(strDate, 1, 4) & "/" & _
Mid(strDate, 5, 2) & "/" & _
Mid(strDate, 7, 2) & " " & _
Mid(strDate, 9, 2) & ":" & _
Mid(strDate, 11, 2) & ":" & _
Mid(strDate, 13, 2))
'日時(UTC)から日時(JST)を取得 ※日時(UTC)に9hを加算
jstDate = DateAdd("h", 9, utcDate)
'日時(JST)を出力
ws.Cells(i, EVENT_TIME_COLUMN) = jstDate
'イベント名を出力
Select Case eve.EventCode
Case 6005
ws.Cells(i, EVENT_NAME_COLUMN) = "PC起動"
Case 6006
ws.Cells(i, EVENT_NAME_COLUMN) = "PC終了"
Case 7001
ws.Cells(i, EVENT_NAME_COLUMN) = "ログイン"
Case 7002
ws.Cells(i, EVENT_NAME_COLUMN) = "ログアウト"
Case Else
ws.Cells(i, EVENT_NAME_COLUMN) = "それ以外"
End Select
i = i + 1
Next
'後片づけ
Set objLocator = Nothing
Set objServer = Nothing
Set objEveSet = Nothing
End Sub
実行結果
Windowsのイベントログを取得できました。
参考①
上記のVBAコードは「WMI」を使用しています。
「WMI」の詳細は、公式サイトをご確認ください。
参考②
「WMI」を使用することで、対象PCへPingコマンドを実行することもできます。
詳細は以下の記事をご確認ください。