2013-12-08 39 views
1

我想使用wevtutil從特定ID的最近審計事件4663中提取特定屬性ObjectName的值(無標記) 。然後我想把它放在一個環境變量中,以便在由4663事件觸發的批處理文件中使用。我已經在xml中複製了以下事件。使用wevtutil從選定的事件記錄返回選定的事件屬性作爲文本

我得的是能夠選擇的事件和輸出使用此語法的XML點:

C:\Users\Mike>wevtutil qe security /q:"*[System [(EventID=4663)]]" /c:1 /rd:true 

但我不能工作,如何從事件XML導致內檢索只有一個屬性。它甚至有可能嗎? Xpath似乎提供了語法,但是wevtutil是否支持它?

我寧願在一個階段做到這一點,但我知道wevtutil可以輸出到一個文件,所以我想你可以用某種方式處理它。

顯然,如果有比wevtutil更好的工具來做到這一點,我可以使用它。

非常感謝任何可以幫助的人。

邁克

事件XML

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> 
<System> 
<Provider Name="Microsoft-Windows-Security-Auditing" Guid="{54849625-5478-4994-A5BA-3E3B0328C30D}"/> 
<EventID>4663</EventID> 
<Version>0</Version> 
<Level>0</Level> 
<Task>12800</Task> 
<Opcode>0</Opcode> 
<Keywords>0x8020000000000000</Keywords> 
<TimeCreated SystemTime="2013-12-07T16:50:28.582540600Z"/> 
<EventRecordID>2637347</EventRecordID> 
<Correlation/> 
<Execution ProcessID="4" ThreadID="64"/> 
<Channel>Security</Channel> 
<Computer>Dell-8300-PC</Computer> 
<Security/> 
</System> 
<EventData> 
<Data Name="SubjectUserSid">S-1-5-21-1054466239-2335366426-2448288976-1001</Data> 
<Data Name="SubjectUserName">Mike</Data> 
<Data Name="SubjectDomainName">Dell-8300-PC</Data> 
<Data Name="SubjectLogonId">0x4149a</Data> 
<Data Name="ObjectServer">Security</Data> 
<Data Name="ObjectType">File</Data> 
<Data Name="ObjectName">D:\Mike's data\My Documents\fred</Data> 
<Data Name="HandleId">0x12a74</Data> 
<Data Name="AccessList">%%4418</Data> 
<Data Name="AccessMask">0x4</Data> 
<Data Name="ProcessId">0x1048</Data> 
<Data Name="ProcessName">C:\Windows\explorer.exe</Data> 
</EventData> 
</Event> 

回答

0

一個奇怪的發現。如果我使用webtutil寫整個事件作爲一個文件,然後我編輯該文件使用此命令通過 PowerShell來去除串

xmlns="http://schemas.microsoft.com/win/2004/08/events/event" 

,沒有別的,我可以訪問我所需要的數據:

PS> select-xml -path "C:\Users\Mike\xmltext1.xml" -Xpath "*//EventDat 
a/Data[@Name = 'ObjectName']" | ForEach-Object {$_.Node.'#text'} 

哪個正確返回:

C:\Program Files\MXContactEE\MXContact.pst 

但同樣的命令返回什麼,除非我從文件中刪除,這是不方便使用了「xmlns」字符串。

我迷路了,爲什麼.....

最良好的祝願,鼠標

+0

我查了選擇的XML文檔(http://technet.microsoft.com/en-us/library/hh849968.aspx)。您的XML正在使用所謂的「默認命名空間」。手冊建議在命名空間聲明中使用任意前綴。所以試試這個:'select-xml -hashtable @ {p =「http://schemas.microsoft.com/win/2004/08/events/event」} -path「C:\ Users \ Mike \ xmltext1.xml」 -Xpath「* // p:EventData/p:Data [@Name ='ObjectName']」| ForEach-Object {$ _。Node。'#text'}' –

+0

謝謝Marcus我會試試看。很好的發現,聽起來可能!我想這可能也解釋了webtutil的結果。 – MikeB

+0

輕微的mod - 參數是--namespace不是哈希表,它可以從Powershell中運行。具體來說:'select-xml -namespace @ {p =「http://schemas.microsoft.com/win/2004/08/events/event」} -path「C:\ Users \ Mike \ xmltext.xml」 - Xpath「* // p:EventData/p:Data [@Name ='ObjectName']」| ForEach-Object {$ _。Node。'#text'}'正確產生:'C:\ Program Files \ MXContactEE \ MXContact.pst'。我還用'xmltext.xml'取代了文件名,因爲該文件包含webtutil的未經編輯的XML輸出。因此,無論如何,我有兩個階段的方式:)。非常感謝Marcus! – MikeB

0

兩個階段解決方案,編寫該事件中的cmd.exe,然後選擇使用XML處理這一個文件,幾乎奏效。這是我使用的命令。首先輸入cmd.exe:

C:\Users\Mike> Wevtutil qe security /q:"*[System [(EventID=4663)]]" /c:1 /rd:true > xmltext.xml 

然後在Powerwshell:

PS C:\scripts> Select-xml -namespace @{p="http://schemas.microsoft.com/win/2004/08/events/event"} -path "C:\Users\Mike\xmltext.xml" -Xpath "*//p:EventData/p:Data[@Name = 'ObjectName']" | ForEach-Object {$_.Node.'#text'} 

不幸的是,選擇的XML語句通過錄制會議的方式文件2/3的意外結束失敗。即使您在Powershell中通過管道嘗試整件事情,它也會這樣做:

PS C:\Windows\System32\WindowsPowerShell\v1.0> & C:\windows\system32\wevtutil.exe --% qe security /q:*[System[(EventID=4663)]] /c:1 /rd:true | select-xml -namespace @{p="http://schemas.microsoft.com/win/2004/08/events/event"} -Xpath "*//p:EventData/p:Data[@Name = 'ObjectName']" | ForEach-Object {$_.Node.'#text'} 

兩種方法都會產生(非常快!)出現以下錯誤:

select-xml : Cannot convert value "<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'><System><Provider Name='Microsoft-Windows-Security-Auditing' Guid 
='{54849625-5478-4994-A5BA-3E3B0328C30D}'/><EventID>4663</EventID><Version>0</Version><Level>0</Level><Task>12800</Task><Opcode>0</Opcode><Keywords>0x8020000000000000</K 
eywords><TimeCreated SystemTime='2013-12-14T12:19:50.172177700Z'/><EventRecordID>3598848</EventRecordID><Correlation/><Execution ProcessID='4' 
ThreadID='52'/><Channel>Security</Channel><Computer>Dell-8300-PC</Computer><Security/></System><EventData><Data 
Name='SubjectUserSid'>S-1-5-21-1054466239-2335366426-2448288976-1001</Data><Data Name='SubjectUserName'>Mike</Data><Data 
Name='SubjectDomainName'>Dell-8300-PC</Data><Data Name='SubjectLogonId'>0x39533</Data><Data Name='ObjectServer'>Security</Data><Data Name='ObjectType'>File</Data><Data 
Name='ObjectName'>C:\Program Files\MXContactEE\MXContact.pst</Data><Data Name='HandleId'>0x4ef0</Data><Data Name='AccessList'>%%4416" to type "System.Xml.XmlDocument". 
Error: "Unexpected end of file has occurred. The following elements are not closed: Data, EventData, Event. Line 1, position 980." 
At line:1 char:97 
+ & C:\windows\system32\wevtutil.exe --% qe security /q:*[System[(EventID=4663)]] ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [Select-Xml], ParentContainsErrorRecordException 
    + FullyQualifiedErrorId : InvalidCastToXmlDocument,Microsoft.PowerShell.Commands.SelectXmlCommand 

select-xml : Cannot convert value "    </Data><Data Name='AccessMask'>0x1</Data><Data Name='ProcessId'>0x1b4c</Data><Data Name='ProcessName'>C:\Program 
Files (x86)\Microsoft Office\Office14\OUTLOOK.EXE</Data></EventData></Event>" to type "System.Xml.XmlDocument". Error: "Unexpected end tag. Line 1, position 7." 
At line:1 char:97 
+ & C:\windows\system32\wevtutil.exe --% qe security /q:*[System[(EventID=4663)]] ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [Select-Xml], ParentContainsErrorRecordException 
    + FullyQualifiedErrorId : InvalidCastToXmlDocument,Microsoft.PowerShell.Commands.SelectXmlCommand 

看來文件結尾的原因是EventXML中有Tab選項字符。 (我使用磁盤扇區編輯器查看webtutil輸出文件,並在select-xml放棄處理的過程中有一個4個製表符字符序列,並且可能在訪問列表數據項之後有一個或兩個回車符,它也顯示在事件查看器中的格式化事件雖然奇怪地不在XML中)。我最初創建和測試的文件沒有發生這種情況,我認爲我屏幕截取了輸出,並將其粘貼到文件中,而不是寫入文件,或者可能是我做了。 NET之間重新安裝。

我可以用流字符過濾器來修復這個問題,但我不知道如何爲非打印字符(如製表符)做到這一點。

所以我結束了使用PowerShell單級解決方案(以及更正確,沒有中間文件的解決方案),如下所示:

$events = Get-WinEvent -FilterHashtable @{ProviderName="Microsoft-Windows-Security-Auditing"; id=4663} 
$event = [xml]$events[0].ToXml() 
$ObjectName=$event.Event.EventData.Data | Where-Object {$_.name -eq "ObjectName"} 
$ObjectName."#text" 

其中相當緩慢,但正確地得出:

C:\Program Files\MXContactEE\MXContact.pst 

我適應從這裏的解決方案: https://social.technet.microsoft.com/Forums/scriptcenter/en-US/5aa133b0-ea69-4348-9bac-d028ba895024/powershell-obtaining-eventdata-from-a-specific-event?forum=ITCG

因此,我們有各種各樣的解決方案,儘管一個緩慢的,並不涉及webtutil。在這種體驗之後,人們可能會厭惡微軟。那裏有什麼標籤?

非常感謝Marcus爲您提供的所有幫助!

邁克

相關問題