我们需要在存档的安全事件日志中找到特定用户的登录和注销时间。例如,我需要找出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"
}
}
我对你建议的内容感到困惑。另外,当我运行它时,当我知道它应该在文件中时它没有提供结果。
答案 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>
- 数据=<字符串[]>
- * =<字符串[]>
例如,StartTime
和EndTime
必须是实际的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'
}