Powershell搜索事件ID并发送电子邮件
如何循环服务器列表以查看过去10分钟内是否存在事件ID,然后发送电子邮件。我无法理解“foreach”+“if”+“output” 它不起作用,我哪里做错了?A)(获取内容)从服务器列表获取服务器列表 B) (Foreach)循环遍历列表中的每个服务器 C) 从服务器列表中的计算机名获取条目类型为“Error”的事件。其中错误事件ID等于7036 D) 如果错误大于0,则发送所有错误的列表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
$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有效地检查$null是否等于7036,这永远不会是真的李>if
是一个空管道对象,因为您使用变量$\uu
来表示它李>$server
- 您甚至没有查看远程计算机,因为您没有指定
-ComputerName
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 $_}