兩個階段解決方案,編寫該事件中的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爲您提供的所有幫助!
祝
邁克
我查了選擇的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'}' –
謝謝Marcus我會試試看。很好的發現,聽起來可能!我想這可能也解釋了webtutil的結果。 – MikeB
輕微的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