使用wevtutil将选定的事件属性作为选定事件记录中的文本返回

时间:2013-12-08 10:46:55

标签: events xpath

我正在尝试使用wevtutil从特定ID的最新审计事件4663中提取特定属性ObjectName(没有标记)的值。然后我想将其放在环境变量中以供使用由于出现4663而触发的批处理文件。我已在xml中复制了以下事件。

我已经能够选择事件并使用以下语法输出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>

2 个答案:

答案 0 :(得分:0)

一个奇怪的发现。如果我使用webtutil将整个事件写为文件,然后我编辑该文件以删除字符串

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

,没有别的,我可以访问我需要的数据  PowerShell使用此命令:

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

但是除非我删除了&#39; xmlns&#39;否则相同的命令不会返回任何内容。来自文件的字符串,这很不方便。

我迷失了为什么......

祝福,老鼠

答案 1 :(得分:0)

两阶段解决方案,将事件写入cmd.exe中的文件,然后使用select 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'}

不幸的是,select-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个Tab字符的序列加上可能在访问列表数据项后面的回车符或两个。它也显示在事件查看器中的格式化事件虽然奇怪地不在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为您提供的所有帮助!

祝福

麦克