Get-Winevent,过滤掉使用变量扫描服务器

时间:2018-01-18 18:43:51

标签: powershell

我有几十台服务器的文本文件来扫描他们的事件日志。在少数情况下,我发现我收到垃圾邮件,其中包含我必须传递给其他人的关键级别错误,并且在其他部门修复它的时候,我想过滤掉该服务器。

我在这里写了一个有人帮助的功能,它主要起作用。我可以过滤掉我想要排除的服务器,但如果我尝试运行没有排除的脚本,它就不起作用。

我没有使用-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

          }

2 个答案:

答案 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) &lt;= {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 = " ")