远程运行Get-EventLog会擦除实际的事件日志

时间:2012-05-02 13:57:56

标签: powershell powershell-remoting

我编写了一个脚本来远程获取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需要建立这么多连接?是因为连接不断下降还是什么?

获取此数据的最快方法是什么 - 通过指定Get-EventLog使用本机-ComputerName命令,或者我应该使用Enter-PSSessionInvoke-Command之类的内容。

Enter-PSSessionInvoke-Command是否会遇到与Get-EventLog相同的问题?

我想避免使用Enter-PSSessionInvoke-Command这一简单事实,即我无法保证公司中的所有计算机都启用了远程执行。

1 个答案:

答案 0 :(得分:3)

所以,问题是Get-EventLog最终擦除了我试图获取的远程事件日志。不确定原因,但是Get-EventLog超过了一百万个“连接”,这些连接出现在登录/注销事件中,从而覆盖了我的日志。

Per @ Richard的评论,我做了一些研究,并决定使用Get-WinEvent进行测试,Get-EventLogGet-WinEvent的更新和更强大的替代品。经过一周的测试后,我遇到的最糟糕的情况是我的脚本创建了4个登录/注销事件。这是完全可以接受的,并且比超过一百万个事件更好。

我与此主题相关的一个问题是表现。因为我们收集了许多远程日志,所以我们有时需要尽快完成。我的问题是,与Enter-PSSessionInvoke-Command相比,Get-WinEvent是否足够快以提取日志。

对于此问题的范围,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 $fullOutputFile 同时满足速度要求和事件要求,并依赖cmdlet来执行我的远程处理工作。

我的代码非常简单,但我会以记录原因发布它:

{{1}}