2016-07-26 78 views
0

我需要从Windows 7工作站中提取本地登录/注销列表。我以evtx格式获得了安全事件日志的保存副本,并且遇到了一些问题。使用PowerShell提取登录/注销事件

下面的PowerShell提取所有的事件ID为46244634

Get-WinEvent -Path 'C:\path\to\securitylog.evtx' | where {$_.Id -eq 4624 -or $_.Id -eq 4634} 

我想那么只有logon type = 2 (local logon)过滤。配管这:

| where {$_.properties[8].value -eq 2} 

但是似乎删除所有id=4634(注销)事件。

即使事件id = 4624事件,也没有用户ID存在。例如管道到:

| select-object -property Timecreated,TaskDisplayName,MachineName,userid 

或以其它方式配管Export-Csv,所述userid是空白的。

两个问题是:

  1. 为什么当管道输送到这里{$_.properties[8].value -eq 2}与ID 4634滴的事件?
  2. 为什么userid是空的?我怎样才能得到userid

回答

0
  1. 请注意,8不是幻数。它是由4624事件定义的XML中的第9个属性(索引从0开始)。如果打开Details选项卡并切换到XML视图,您可以在事件查看器中看到它。在查看4634事件时,您可以看到登录类型属性现在是第5个 - 因此您可能希望修改您的查询,如下所示:

    其中{{.Id -eq 4624-和$的.properties [8] -eq 2} - 或{$ .ID -eq 4634米-and $的.properties [4] -eq 2}}

  2. 用户ID是不为这些事件定义。您可能需要查看XML中定义的TargetUserName属性(第6个属性)。

+0

感谢您的 - 此命令的工作来提取的事件: GET-WinEvent -Path 'C:\路径\为\ securitylog.evtx' |其中{($ _。Id -eq 4624-和$ _。properties [8] .value -eq 2) - 或($ _。Id -eq 4634-和$ _。properties [4] .value -eq 2) } 有没有办法通过XML元素名称来引用属性元素? 另外,我如何实际打印出属性数组的值?选择对象允许我打印属性(例如select-object -property TTimecreated,TaskDisplayName,MachineName),但我似乎无法弄清楚如何从属性数组中打印特定的元素。 – cuvy

0

好吧,这就是我最终的结果。它打印出逗号分隔值:

$evts = Get-WinEvent -Path 'C:\path\to\securitylog.evtx' | where {($_.Id -eq 4624 -and $_.properties[8].value -eq 2) -or ($_.Id -eq 4634 -and $_.properties[4].value -eq 2) } 
foreach ($e in $evts) 
{ 
    # get the attributes 
    $ds = $e.TimeCreated 
    $tdn = $e.TaskDisplayName 
    $mn = $e.MachineName 

    # userid will vary depending on event type: 
    if($e.Id -eq 4624) { $userid = $e.properties[5].value } 
    if($e.Id -eq 4634) { $userid = $e.properties[1].value } 

    write-host ("{0},{1},{2},{3}" -f [string]$ds,[string]$tdn,[string]$mn,[string]$userid) 
}