在归档事件日志中查找特定用户

时间:2016-06-17 18:59:42

标签: windows powershell event-log

我们需要在存档的安全事件日志中找到特定用户的登录和注销时间。例如,我需要找出userX登录系统的日期和时间,然后注销。

这是我到目前为止所拥有的:

更新

这就是我所放在一起的

Get-ChildItem -Path c:\security\* -Recurse |
ForEach-Object {
"Parsing $($_.FullName)`r`n"
try {
  Get-WinEvent userid=userX -FilterHashtable @{
    logname   = 'security'
    id        = 4624, 4634
    userid    = userX
    Path      = $_.FullName
    Level     = 2
    StartTime = "4/1/16"
    EndTime   = "6/20/2016"
  } -EA Stop
} catch [System.Exception] {
  "No errors in current log"
 }
}

我对你建议的内容感到困惑。另外,当我运行它时,当我知道它应该在文件中时它没有提供结果。

1 个答案:

答案 0 :(得分:0)

您对Get-WinEvent的使用是错误的,但您的异常处理隐藏了由此引起的实际错误(因为您将所有异常解释为“当前日志中没有错误”)。首先,cmdlet不接受userid=userX作为参数,因此请将其删除。您的所有过滤条件都应该在哈希表中。此外,该哈希表中的值必须是正确的类型。

  

-FilterHashtable<哈希表[] GT;

     

[...]

     

有效的键值对如下:

     
      
  • LOGNAME = LT;字符串[]>
  •   
  • 的ProviderName = LT;字符串[]>
  •   
  • 路径=<字符串[]>
  •   
  • 关键字=<长[] GT;
  •   
  • ID = LT;的Int32 [] GT;
  •   
  • 等级= LT;的Int32 [] GT;
  •   
  • 的StartTime = LT; DateTime的>
  •   
  • 结束时间= LT; DATATIME>
  •   
  • 用户ID =< SID>
  •   
  • 数据=<字符串[]>
  •   
  • * =<字符串[]>
  •   

例如,StartTimeEndTime必须是实际的DateTime值。 ID是您要查找的事件ID(或事件ID列表)。在您的情况下,可能是事件4624和4634(有关相关事件ID的完整列表,请参阅here)。

最后删除try..catch。您不需要它,因为找不到匹配项时得到的错误不是终止错误。如果要禁止显示错误消息,只需重定向错误输出流(2>$null)。

Get-WinEvent调用更改为类似的内容,它应该有效:

Get-WinEvent -FilterHashtable @{
  LogName   = 'Security'
  ID        = 4624, 4634
  UserID    = 'userX'
  Path      = $_.FullName
  Level     = 2
  StartTime = [DateTime]'6/16/2016'
  EndTime   = [DateTime]'6/17/2016'
}