论坛里面有人询问如何使用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
根据这个思路,我如果想获取最新的20个4771的事件日志,并输出结果
$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
有的时候,事件的数目很多,我希望对这个时间进行一个限制。千万别用 where-object 的方式来过滤,不然等到地老天荒也未必出结果。
我们需要通过哈希表来过滤
$endtime=get-date $starttime=$endtime.addminutes(-1) $eventcritea = @{logname='security';id=4740;starttime=$starttime;endtime=$endtime}
另外一种常见的方式是通过xmlfilter来过滤日志
首先,我们可以通过event viewer来自定义一个xpath
因为是不同的事件,他的eventdata结果是不一样的,因此我做了些变动。
[xml]$xmlfilter = @" <querylist> <query id="0" path="application"> <select path="application">*[system[(eventid=1002) and timecreated[timediff(@systemtime) <= 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) <= 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
结果如下
最后再给一个例子,我希望获取lockout用户的信息以及他们是在哪里被锁住的,这个日志我们查看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 }
本文出自 “麻婆豆腐” 博客
如对本文有疑问, 点击进行留言回复!!
powershell自动化操作AD域、Exchange邮箱系列(1)——powershell 简介
Jmeter 之BeanShell 获取 header 以及 body
网友评论