2

イベント ログからログオン/ログオフ履歴を取得するスクリプトに取り組んでいます。問題は、私が見つけたほとんどすべてのコード例が機能する "Get-EventLog" を使用していることですが、サーバーで検出されたイベント ログが通常のワークステーションよりもはるかに大きいため、処理が非常に遅いことです。そのため、代わりに「Get-WinEvent」を選択しました。非常によく似た結果が得られますが、数秒以内に結果が返されるためです。私が抱えている問題は、上記の結果の出力を使用可能な形式に操作することです。

更新: 私は自分でゆっくりと問題を解決することができました。詳細については、コメントを参照してください。これを調べていた人に感謝します:)

元の作業コード (Get-EventLog - 出力が遅い)

function get-logonhistory{
 cls
 $Result = @()
 Write-Host "Gathering Event Logs, this can take awhile..."
 $ELogs = Get-EventLog System -Source Microsoft-Windows-WinLogon
 If ($ELogs)
 { Write-Host "Processing..."
 ForEach ($Log in $ELogs)
 { If ($Log.InstanceId -eq 7001)
   { $ET = "Logon"
   }
   ElseIf ($Log.InstanceId -eq 7002)
   { $ET = "Logoff"
   }
   Else
   { Continue
   }
   $Result += New-Object PSObject -Property @{
    Time = $Log.TimeWritten
    'Event Type' = $ET
    User = (New-Object System.Security.Principal.SecurityIdentifier $Log.ReplacementStrings[1]).Translate([System.Security.Principal.NTAccount])
   }
 }
 $Result | Select Time,"Event Type",User | Sort Time -Descending | Out-GridView
 Write-Host "Done."
 }
 Else
 { Write-Host "There was a problem reading the logs..."
 }
}


get-logonhistory

(Get-WinEvent) - ほぼ即時の結果

function get-logonhistory{
 cls
 $Result = @()
 Write-Host "Gathering Event Logs, this can take awhile..."
 $ELogs = Get-WinEvent -ea SilentlyContinue ` -ProviderName “Microsoft-Windows-Winlogon”| Where-Object { $_.TimeCreated -le [datetime]::today}
 If ($ELogs)
 { Write-Host "Processing..."
 ForEach ($Log in $ELogs)
 { If ($Log.Id -eq 7001)
   { $ET = "Logon"
   }
   ElseIf ($Log.Id -eq 7002)
   { $ET = "Logoff"
   }
   Else
   { Continue
   }
   $SID = $Log.Properties.Value.Value
   $objSID = New-Object System.Security.Principal.SecurityIdentifier $SID
   $objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
   $Result += New-Object PSObject -Property @{
    Time = $Log.TimeCreated
    'Event Type' = $ET
    User = $objUser.Value
   }
 }
 $Result | Select Time,"Event Type",User | Sort Time -Descending | Out-GridView
 Write-Host "Done."
 }
 Else
 { Write-Host "There was a problem reading the logs..."
 }
}


get-logonhistory
4

1 に答える 1

3

Get-WinEvent と Get-EventLog は、異なる配列を使用してイベント ログの詳細を格納します。Get-WinEvent ユーザーの「Properties」と Get-EventLog ユーザーの「ReplacementStrings」。それぞれを JSON に変換することで、それぞれの正確な詳細を確認し、探しているデータを見つけることができます。この場合、イベントを実行したアカウントの SID です。これを取得したら、その SID をユーザー名に変換して、結果にフィードできます。必要に応じて結果をフィルタリングできるように、より使いやすいように Grid-View が選択されました (つまり、特定のユーザーのイベントが必要な場合)。以下は最終的なコードです。

function get-logonhistory{
 cls
 $Result = @()
 Write-Host "Gathering Event Logs, this can take awhile..."
 $ELogs = Get-WinEvent -ea SilentlyContinue ` -ProviderName “Microsoft-Windows-Winlogon”| Where-Object { $_.TimeCreated -le [datetime]::today}
 If ($ELogs)
 { Write-Host "Processing..."
 ForEach ($Log in $ELogs)
 { If ($Log.Id -eq 7001)
   { $ET = "Logon"
   }
   ElseIf ($Log.Id -eq 7002)
   { $ET = "Logoff"
   }
   Else
   { Continue
   }
   $SID = $Log.Properties.Value.Value
   $objSID = New-Object System.Security.Principal.SecurityIdentifier $SID
   $objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
   $Result += New-Object PSObject -Property @{
    'Date/Time' = $Log.TimeCreated
    'Event Type' = $ET
    User = $objUser.Value
   }
 }
 $Result | Select "Date/Time","Event Type",User | Sort Time -Descending | Out-GridView -Title "System Logon Events"
 Write-Host "Done."
 }
 Else
 { Write-Host "There was a problem reading the logs..."
 }
}


get-logonhistory
于 2019-11-29T18:10:57.773 に答える