3

我编写了一个脚本来远程获取 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通过指定 a 使用本机命令-ComputerName,或者我应该使用类似Enter-PSSessionor的东西Invoke-Command

Enter-PSSessionInvoke-Command两者都有我遇到的相同问题Get-EventLog吗?

我想避免使用Enter-PSSessionInvoke-Command因为我不能保证公司中的所有机器都启用远程执行。

4

1 回答 1

3

所以,问题在于Get-EventLog最终擦除了我试图获取的远程事件日志。不知道为什么,但是Get-EventLog做了超过一百万个“连接”,显示为登录/注销事件,从而覆盖了我的日志。

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

我与该主题相关的一个附带问题是性能。因为我们正在收集许多远程日志,所以有时我们需要尽快完成这项工作。我的问题是Get-WinEvent,与 anEnter-PSSessionInvoke-Command.

对于这个问题的范围,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 $fullOutputFile
于 2012-05-09T17:42:21.293 回答