1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

PowershellによるWindowsログのクエリ方法

2022-01-04 04:16:43

フォーラムで誰かが監査ログにファイルの変更を問い合わせるためにPowershellスクリプトを使用する方法を尋ねました。ビーンサーバーはこの機能を開いていませんでしたが、私はログを照会して対応するxmlコンテンツを出力する同様のスクリプトを書くことを試みました。

基本はget-wineventで、対応するeventidを指定してリストを取得します。このイベントの詳細を取得したい場合は、イベントの種類によってxmlの内容を変える必要があります。

例えば

$Events = Get-WinEvent -ComputerName syddc01 -FilterHashtable @{Logname='Security';Id=4771} -MaxEvents 1 
$eventXML = [xml]$Event.ToXml() 
$eventxml.event.event.data 

これに伴い、4771の最新20件のイベントログを取得し、その結果を出力したい場合

$Events = Get-WinEvent -ComputerName syddc01 -FilterHashtable @{Logname='Security';Id=4771} -MaxEvents 20     
       
# Parse out the event message data       
ForEach ($Event in $Events) {       
  # Convert the event to XML       
  $eventXML = [xml]$Event.ToXml()       
  # Iterate through each one of the XML message properties       
  For ($i=0; $i -lt $eventXML.Event.EventData.Data.Count; $i++) { 
    
       
    # Append these as object properties       
    Add-Member -InputObject $Event -MemberType NoteProperty -Force -Name $eventXML.Event.EventData.Data[$i].name -Value $eventXML.Event. EventData.Data[$i].' #text'      
  }       
}       
  
   
$events | select Message, TargetUserName, ipaddress,timecreated | Out-GridView 


イベント数が多く、その時間に制限をかけたいときがある。whereobjectでフィルタリングしないと、時間切れまで結果が出ないことがある。
ハッシュテーブルでフィルタリングする必要がある

$endtime=get-date
$starttime=$endtime.addminutes(-1) 
$eventcritea = @{logname='security';id=4740;starttime=$starttime;endtime=$endtime}

ログをフィルタリングするもう一つの一般的な方法は、xmlfilter を使用することです。

まず、イベントビューアーでxpathをカスタマイズします。

別のイベントなので、彼のeventdataの結果も違うので、少し変更しました。

[xml]$xmlFilter = @" 
<QueryList> 
 <Query Id="0" Path="Application"> 
  <Select Path="Application">*[System[(EventID=1002) and TimeCreated[timediff(@SystemTime) &lt;= 604800000]]]</ Select> 
 </Query> 
</QueryList> 
"@ 
#Get-WinEvent -ComputerName $DC.DC -LogName Security -FilterXPath "*[System[(EventID=529 or EventID=644 or EventID=675 or EventID=676 or EventID=681 or EventID=4625) and TimeCreated[timediff(@SystemTime) &lt;= 86400000]]]" #-MaxEvents 50 
$Events = Get-WinEvent -ComputerName syddc01 -FilterXML $xmlFilter 
ForEach ($Event in $Events) {       
  # Convert the event to XML       
  $eventXML = [xml]$Event.ToXml()       
  # Iterate through each one of the XML message properties       
  For ($i=0; $i -lt $eventXML.Event.EventData.Data.Count; $i++) { 
    
       
    # Append these as object properties       
    Add-Member -InputObject $Event -MemberType NoteProperty -Force -Name "App" -Value $eventXML.Event.EventData.Data[5]      
  }       
}   
$Events | select Message, App, providerName, timecreated | Out-GridView 


結果は次のようになります。

最後に、ロックアウトしたユーザーとロックアウトされた場所についての情報を取得したいのですが、このログについては、4771または4740を参照します。4771はログが多すぎてクエリに時間がかかるので、ここでは4740を例にとっています。

eventcritea = @{logname='security';id=4740} 
$Events = get-winevent -ComputerName (Get-ADDomain).pdcemulator -FilterHashtable $eventcritea 
#$Events = Get-WinEvent -ComputerName syddc01 -Filterxml $xmlfilter     
       
# Parse out the event message data       
ForEach ($Event in $Events) {   
    
  # Convert the event to XML       
  $eventXML = [xml]$Event.ToXml()   
      
  # Iterate through each one of the XML message properties       
  For ($i=0; $i -lt $eventXML.Event.EventData.Data.Count; $i++) { 
    
       
    # Append these as object properties       
    Add-Member -InputObject $Event -MemberType NoteProperty -Force -Name $eventXML.Event.EventData.Data[$i].name -Value $eventXML.Event. EventData.Data[$i].' #text'      
  }       
}       
  
   
$events | select TargetUserName,timecreated, targetdomainname | Out-GridView -Title LockOutStatus 
break; 
Search-ADAccount -LockedOut | ForEach-Object {Unlock-ADAccount -Identity $_.distinguishedname }

この記事は、「麻婆豆腐」ブログから転載しています。