我编写了一个脚本来远程获取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-PSSession
或Invoke-Command
之类的内容。
Enter-PSSession
和Invoke-Command
是否会遇到与Get-EventLog
相同的问题?
我想避免使用Enter-PSSession
和Invoke-Command
这一简单事实,即我无法保证公司中的所有计算机都启用了远程执行。
答案 0 :(得分:3)
所以,问题是Get-EventLog
最终擦除了我试图获取的远程事件日志。不确定原因,但是Get-EventLog
超过了一百万个“连接”,这些连接出现在登录/注销事件中,从而覆盖了我的日志。
Per @ Richard的评论,我做了一些研究,并决定使用Get-WinEvent
进行测试,Get-EventLog
是Get-WinEvent
的更新和更强大的替代品。经过一周的测试后,我遇到的最糟糕的情况是我的脚本创建了4个登录/注销事件。这是完全可以接受的,并且比超过一百万个事件更好。
我与此主题相关的一个问题是表现。因为我们收集了许多远程日志,所以我们有时需要尽快完成。我的问题是,与Enter-PSSession
或Invoke-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}}