2

我正在尝试编写对远程服务器上过去 30 天应用程序和系统事件日志的审查的脚本,只查找警告、错误或严重条目。

借用我在这里和其他论坛上的发现,我想出了:

$Date = Get-Date
$Range = $Date.AddDays(-30)
$Range = $range.ToShortDateString();
$LogName = Read-Host "Which Log? (Application, System)"
$Server = Read-Host "Please Enter Server Name"

get-eventlog $LogName -ComputerName $Server -After $range | where {$_.EntryType -eq "Error" -or $_.EntryType -eq "Warning" -or $_.EntryType -eq  "Critical"}

这似乎运行得相当快,但如果确实如此,则在返回提示之前会挂起数(5-10+)分钟。

注意:如果我删除代码:

-After $range

我可以简单地用 ctrl-c 中断输出并继续我的一天,但我宁愿它按预期运行然后停止......

所以:关于如何消除这种挂起的任何想法?
我也对如何使代码更优雅(更快)持开放态度!而且我不介意脚本检查应用程序和系统日志而不必运行两次......

4

2 回答 2

2

我发现对于远程系统,如果我将它包装到 Invoke-Command 中,我可以使用相同的命令一次查询多个系统,比单独查询更快。这是我的解决方案。系统越多,节省的时间就越多。YMMV

$command = {Get-EventLog -LogName Application -After (Get-Date).AddHours("-24")}
Invoke-Command -ComputerName "foo1","foo2","foo3","foo4" -ScriptBlock $command
于 2014-07-01T23:30:47.390 回答
2

使用-EntryType字符串数组参数 onGet-EventLog比检索整个事件日志然后使用过滤要快得多Where-Object

尝试get-eventlog -Logname System -EntryType ("Error", "Warning")

但是......如果我将“Critical”放在-EntryType数组中,我会得到:The argument "Critical" does not belong to the set "Error,Information,FailureAudit,SuccessAudit,Warning" specified by the ValidateSet attribute.这让我想知道您是否应该注意以下建议Get-Help Get-EventLog

包含 EventLog 名词的 cmdlet(EventLog cmdlet)仅适用于经典事件日志。若要在 Windows Vista 和更高版本的 Windows 中从使用 Windows 事件日志技术的日志中获取事件,请使用 Get-WinEvent。

相反Get-WinEvent,我认为这就是你想要的: Get-Winevent -FilterHashtable @{LogName="System","Application"; Level=1,2,3; startTime=$range}

这将检查级别 1、2 或 3(分别为严重、错误、警告)的事件,并在同一调用中搜索应用程序和系统日志。

于 2013-09-26T01:40:37.587 回答