我有几十台服务器的文本文件来扫描他们的事件日志。在少数情况下,我发现我收到垃圾邮件,其中包含我必须传递给其他人的关键级别错误,并且在其他部门修复它的时候,我想过滤掉该服务器。
我在这里写了一个有人帮助的功能,它主要起作用。我可以过滤掉我想要排除的服务器,但如果我尝试运行没有排除的脚本,它就不起作用。
我没有使用-noserver选项并使用''或""没有服务器选项以及" NULL"然后当脚本应该返回数百个错误时,脚本根本不会返回任何数据。
function Check-Syslogs-v3
{
param([string] $box
,[int] $eventtype
,[int] $daysback
,[string] $noserver)
if ($daysback -ge 1)
{
$servers = Get-Content -literalpath "C:\temp\servers.txt"
$Date = (Get-Date).AddDays(0 - $daysback)
$log = ForEach ($box in $servers)
{Get-WinEvent -computername $box -FilterHashTable @{logname =
"System"; level = $eventtype; starttime = $Date} |
Where-Object {($_.Id -ne "137"
-and $_.Id -ne "8"
-and $_.MachineName -notmatch $noserver)} |
select-object @{n='HostName';e={($_.MachineName -split '\.')[0]}},
timecreated,id, message}
}
else
{
Write-Warning "'$Daysback' is not enough days."
}
return $log
}
答案 0 :(得分:1)
比从所有服务器收集日志然后从已排除的服务器中过滤掉消息更好,只需完全跳过服务器即可。我还建议您使用FilterXml
,这样您只能返回所需的事件ID,而不是返回所有事件,然后过滤掉8和137.我还将您的If
语句移到了{{ 1}}语句,并允许多种事件类型。
ValidateScript
因此,要获取过去3天内的所有严重,警告和错误条目,并排除名为“Server07”的服务器,您将执行以下操作:
function Check-Syslogs-v3
{
param([int[]] $eventtype
,[ValidateScript({$_ -ge 1})][int] $daysback
,[string] $noserver)
$XMLFilter = '<QueryList>
<Query Id="0" Path="System">
<Select Path="System">*[System[(Level={0}) and TimeCreated[timediff(@SystemTime) <= {1}]]]</Select>
<Suppress Path="System">*[System[(EventID=137 or EventID=8)]]</Suppress>
</Query>
</QueryList>' -f ($eventtype -join ' or Level='), ($daysback * 864000000000)
$servers = Get-Content -literalpath "C:\temp\servers.txt"
If(![string]::IsNullOrEmpty($noserver){$servers = $servers |?{$_ -notmatch $noserver}}
$log = ForEach ($box in $servers)
{
Get-WinEvent -computername $box -FilterXml $XMLFilter |
select-object @{n='HostName';e={($_.MachineName -split '\.')[0]}}, timecreated,id, message
}
return $log
}
答案 1 :(得分:0)
添加一项检查,如果$noserver
为空,请为其指定值。在我的测试中,如果我只为它分配一个空格,它就可以工作:
if(!$noserver)
{$noserver = " "}
另一种选择是强制该参数是强制性的,但这似乎与你想要的相反。最后,您可以将默认值分配给$noserver
,如下所示:
param([string] $box
,[int] $eventtype
,[int] $daysback
,[string] $noserver = " ")