我编写了一个脚本来远程获取PowerShell中的事件日志,但我不喜欢该脚本创建自己的事件日志条目的方式。
具体地说,此脚本捕获几种类型的事件ID,包括登录/注销事件。最近,我被要求运行脚本为另一个用户获取事件,并且必须在几个小时内获取这些数据。通常我启动脚本并让它在一天中的大部分时间内运行(因为这里通常有很多数据),但这次为了加快进程,我旋转了4个脚本实例,以比平时更快地获取这些数据。脚本的每个实例都在一个不同的时间范围内查看,因此所有4个脚本组合在一起都在我被要求的时间范围内获取。
在大约3个小时的时间里,我对这台远程计算机上的用户ID进行了超过一百万次不同的登录尝试。我有如此多的登录,以至于我最终覆盖了最初要求我获取的事件日志数据。
经验教训,我现在正在研究如何让它更快,更有效,更可靠。
这是我的代码的核心,非常简单明了,并且大部分都是有效的。
$output = Get-EventLog `
-instanceID 4672,4647,4634,4624,4625,4648,4675,4800,4801,4802,4803 `
-logName Security `
-after (Get-Date $inStartDate) `
-before (Get-Date $inEndDate).addDays(1) `
-message ("*" + $InUserID + "*") `
-computerName $inPCID我想,到目前为止,在我的研究中,有几个问题是我无法解决的。为什么Get-EventLog需要建立这么多连接?是因为连接一直断线还是怎么的?
获取此数据的最快方法是什么-通过指定-ComputerName使用原生Get-EventLog命令,还是应该使用Enter-PSSession或Invoke-Command之类的东西。
Enter-PSSession和Invoke-Command都会有我在Get-EventLog上遇到的同样问题吗
我想避免使用Enter-PSSession和Invoke-Command,因为我不能保证公司中的所有机器都会启用远程执行。
发布于 2012-05-10 01:42:21
所以,问题是Get-EventLog最终擦除了我试图获取的远程事件日志。不知道为什么,但Get-EventLog建立了超过一百万的“连接”,这些连接显示为登录/注销事件,从而覆盖了我的日志。
根据@Richard的评论,我做了一些研究,并决定使用Get-EventLog的更新和更强大的替代品Get-WinEvent进行测试。经过一周的测试,我遇到的最糟糕的情况是我的脚本创建了4个登录/注销事件。这是完全可以接受的,而且比超过一百万个事件要好得多。
与此主题相关的一个次要问题是性能。因为我们要收集许多远程日志,所以有时我们需要尽可能快地完成这项工作。我的问题是,与Enter-PSSession或Invoke-Command相比,Get-WinEvent是否足够快来提取日志。
对于这个问题的范围,Get-WinEvent既满足了速度要求也满足了事件要求,并且依靠cmdlet来执行我的远程处理工作得很好。
我的代码非常简单,但出于记录原因,我将其发布:
Get-WinEvent `
-computerName $inPCID `
-FilterHashtable @{LogName="Security";Id=4672,4647,4634,4624,4625,4648,4675,4800,4801,4802,4803; `
StartTime = $inStartDate; EndTime = $inEndDate} | Where-object {$_.message -like ("*" + $InUserID + "*")} `
| export-csv $fullOutputFilehttps://stackoverflow.com/questions/10415266
复制相似问题