Home > Windows にまつわる e.t.c.

セキュリティログから PowerShell でログオン履歴を抽出する


Windows のセキュリティログには、コンピーターへのログオン情報が記録されているので、ログオン履歴を抽出することができます。

ログオン時刻/ログオン成功失敗/ユーザーID/接続元 IP/ログオンタイプを抽出する関数を作ってみました。
(セキュリティログ舐めるので結構時間かかります)

################################################
# ログオン履歴取得
################################################
function GetLogonHistry(){

    # ログオン成功
    $LogonSuccess = 4624

    # ログオン失敗
    $LogonFail = 4625

    # ログオンイベントの抽出
    $LogonEvents = Get-WinEvent -LogName Security | ? {($_.Id -eq $LogonSuccess) -or ($_.Id -eq $LogonFail)}

    # ログオン履歴
    $LogonHistry = @()

    foreach( $LogonEvent in $LogonEvents ){
        $LogonStatus = New-Object PSObject | Select-Object `
                                                            EventTime,      # ログオン時刻
                                                            Success,        # ログオン成功?
                                                            LogonUser,      # ユーザー
                                                            Domain,         # ドメイン
                                                            LogonTypeName,  # ログオンタイプ名
                                                            LogonTypeCode,  # ログオンタイプ コード
                                                            IpAddress       # IP アドレス

        # ログオン時刻
        $LogonStatus.EventTime = $LogonEvent.TimeCreated

        # ログオン成功?
        $LogonStatus.Success = $LogonEvent.Id -eq $LogonSuccess

        $LogonEventXml = [XML]$LogonEvent.ToXml()

        # ログオンユーザー
        $LogonStatus.LogonUser = ($LogonEventXml.Event.EventData.Data | ? {$_.Name -eq "TargetUserName"}).'#text'

        # ドメイン
        $LogonStatus.Domain = ($LogonEventXml.Event.EventData.Data | ? {$_.Name -eq "TargetDomainName"}).'#text'

        # 接続元 IP
        $LogonStatus.IpAddress = ($LogonEventXml.Event.EventData.Data | ? {$_.Name -eq "IpAddress"}).'#text'

        # ログオンタイプ
        [int]$LogonType = ($LogonEventXml.Event.EventData.Data | ? {$_.Name -eq "LogonType"}).'#text'
        $LogonStatus.LogonTypeCode = $LogonType
        switch ($LogonType){
             2 { $LogonStatus.LogonTypeName = "対話型" }
             3 { $LogonStatus.LogonTypeName = "ネットワーク" }
             4 { $LogonStatus.LogonTypeName = "Batch" }
             5 { $LogonStatus.LogonTypeName = "サービス" }
             7 { $LogonStatus.LogonTypeName = "ロック解除" }
             8 { $LogonStatus.LogonTypeName = "Network Cleartext" }
             9 { $LogonStatus.LogonTypeName = "New Credentials" }
            10 { $LogonStatus.LogonTypeName = "RDP" }
            11 { $LogonStatus.LogonTypeName = "Cached Interactive" }
        }

        $LogonHistry += $LogonStatus
    }

    return $LogonHistry
}

 

参考情報

関数を PowerShell プロンプトで実行する
http://www.vwnet.jp/Windows/PowerShell/2016100401/UseFunctionInPsPrompt.htm

ログオンの監査(ログオンイベント ID 説明)
https://technet.microsoft.com/ja-jp/library/dn319080(v=ws.11).aspx

ログオン イベントの監査(ログオンタイプ説明)
https://technet.microsoft.com/ja-jp/library/mt634186(v=vs.85).aspx

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.