【VBA】Windowsのイベントログを取得する

VBAから
 ・Windowsのイベントログを取得
できます!

例えば
 ・PCを起動
 ・PCを終了
 ・ログイン
 ・ログアウト
した時間を取得できます!

PR

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

各種イベント(PC起動、PC終了、ログイン、ログアウト)の情報を取得するために、条件として「Eventcode(イベントコード)」を指定しています(30~31行目)。
※PC起動は「6005」、PC終了は「6006」、ログインは「7001」、ログアウトは「7002」です。

2021年10月の情報を取得するために、条件として「TimeGenerated(日時)」を指定しています(32~33行目)。
※「2021/10/01以上 かつ 2021/11/01以下」とすることで、2021年10月を指定しています。

「日時(UTC)」から「日時(JST)」を取得しています。(47~58行目)。
※日時(UTC)に9hを加算することで取得します。

PR

実行結果

Windowsのイベントログを取得できました。

実行結果
実行結果
PR

参考①

上記のVBAコードは「WMI」を使用しています。

「WMI」の詳細は、公式サイトをご確認ください。

PR

参考②

「WMI」を使用することで、対象PCへPingコマンドを実行することもできます。

詳細は以下の記事をご確認ください。