Powershell搜索事件ID并发送电子邮件

Powershell搜索事件ID并发送电子邮件,powershell,Powershell,如何循环服务器列表以查看过去10分钟内是否存在事件ID,然后发送电子邮件。我无法理解“foreach”+“if”+“output” 它不起作用,我哪里做错了?A)(获取内容)从服务器列表获取服务器列表 B) (Foreach)循环遍历列表中的每个服务器 C) 从服务器列表中的计算机名获取条目类型为“Error”的事件。其中错误事件ID等于7036 D) 如果错误大于0,则发送所有错误的列表 $serverlist = get-content "c:\serverlist.txt" foreach

如何循环服务器列表以查看过去10分钟内是否存在事件ID,然后发送电子邮件。我无法理解“foreach”+“if”+“output”

它不起作用,我哪里做错了?

A)(获取内容)从服务器列表获取服务器列表

B) (Foreach)循环遍历列表中的每个服务器

C) 从服务器列表中的计算机名获取条目类型为“Error”的事件。其中错误事件ID等于7036

D) 如果错误大于0,则发送所有错误的列表

$serverlist = get-content "c:\serverlist.txt"
foreach ($server in $serverlist){
    $Errors = Get-Eventlog -ComputerName $Server -LogName System -EntryType Error -after (get-date).AddMinutes(-20) | Where-Object {$_.EventID -eq '7036'}
    if($Errors.Length -gt 0){
        Send-MailMessage -To test@test.com -From errors@test.com -Subject "ERRORS"  -Body $ErrorEvents
    }
}

您的方法不起作用的原因

  • 日志结果集和
    if
    语句没有任何连接。您正在将所有记录返回标准输出。您的if有效地检查$null是否等于7036,这永远不会是真的
  • $\uu
    是一个空管道对象,因为您使用变量
    $server
    来表示它
  • 您甚至没有查看远程计算机,因为您没有指定
    -ComputerName
您可以将所有条件筛选到cmdlet本身中。不需要后处理,这将使其运行更快

Get-Eventlog -LogName System -EntryType Error -after (Get-Date).AddMinutes(-20) -ID 7036 -ComputerName $server
因此,如果您将其捕获到一个变量中,您可以更改
if

$results = Get-Eventlog ....
if($results){"send mail"}
但是我会考虑收集所有的结果并发送一封邮件。
$computersWithEvents = Get-Content $path | 
    Where-Object{Get-Eventlog -LogName System -EntryType Error -after (Get-Date).AddMinutes(-10) -ID 7036 -ComputerName $_}
这样,
$computersWithEvents
包含所有在过去10分钟内发生7036事件的服务器。你现在可以用一封邮件发送


您还可以尝试使用
Get WinEvent
,这应该很容易替换您所拥有的。可以说,它比获得WinEvent更快,哪部分不起作用?你得到了什么错误?如果部分不起作用,它会列出所有的错误日志,事件ID不会被过滤。你可以像这样过滤你的get eventlog:
get eventlog“system”-EntryType error-after(get date)。AddMinutes(-20)| Where对象{$\事件ID-eq 7036}$computersWithEvents = Get-Content $path | 
    Where-Object{Get-Eventlog -LogName System -EntryType Error -after (Get-Date).AddMinutes(-10) -ID 7036 -ComputerName $_}