Email 使用电子邮件通知对多台计算机进行日志监视-按EventID筛选

Email 使用电子邮件通知对多台计算机进行日志监视-按EventID筛选,email,powershell,notifications,event-log,Email,Powershell,Notifications,Event Log,我下面有一个PowerShell代码,它从计算机列表中收集事件日志,然后向收件人发送电子邮件 我需要的是让它查找一组特定的事件id,而不是搜索所有事件。然后,如果它看到我指定的任何事件,它将向用户发送报告,否则它将结束,而不发送任何电子邮件 # Continue even if there are errors $ErrorActionPreference = "Continue"; # EMAIL PROPERTIES # Set the recipients of the repor

我下面有一个PowerShell代码,它从计算机列表中收集事件日志,然后向收件人发送电子邮件

我需要的是让它查找一组特定的事件id,而不是搜索所有事件。然后,如果它看到我指定的任何事件,它将向用户发送报告,否则它将结束,而不发送任何电子邮件

# Continue even if there are errors 
$ErrorActionPreference = "Continue";

# EMAIL PROPERTIES 
 # Set the recipients of the report. 
  $rcpts = "user@domain.com" 

# REPORT PROPERTIES 
 # Path to the report 
  $reportPath = "SomePath"; 

 # Report name 
  $reportName = "SomeFileName"; 

# Path and Report name together 
$logReport = $reportPath + $reportName 

# Get computer list to check logs 
$computers = 'servers.txt'

# Date coverage of logs to be monitored
$StartDate = (get-date).AddDays(-1)

# LogNames to be monitored
$logname = "System"

# Cleanup old files.. 
$Daysback = "-7" 
$CurrentDate = Get-Date; 
$DateToDelete = $CurrentDate.AddDays($Daysback); 
Get-ChildItem $reportPath | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item; 

# CSS style
$css= "<style>"
$css= $css+ "BODY{ text-align: center; background-color:white;}"
$css= $css+ "TABLE{    font-family: 'Lucida Sans Unicode', 'Lucida Grande', Sans-Serif;font-size: 12px;margin: 10px;width: 100%;text-align: center;border-collapse: collapse;border-top: 7px solid #004466;border-bottom: 7px solid #004466;}"
$css= $css+ "TH{font-size: 13px;font-weight: normal;padding: 1px;background: #cceeff;border-right: 1px solid #004466;border-left: 1px solid #004466;color: #004466;}"
$css= $css+ "TD{padding: 1px;background: ##FFFFFF;border-right: 1px solid #004466;border-left: 1px solid #004466;color: #669;hover:black;}"
$css= $css+  "TD:hover{ background-color:#e5f7ff;}"
$css= $css+ "</style>" 

# Process logs 
$body = Get-Content $computers | ForEach-Object {
    Get-WinEvent -ComputerName $_ -FilterHashtable @{logname=$logname; Level=1,2,3; starttime=$StartDate}    
}

if ($body)
{
    # Convert to HTML style 
    $body | ConvertTo-HTML -Head $css MachineName,LogName,LevelDisplayName,ID,TimeCreated,Message > $logReport

    # Get-Date for Email Subject
    $subjectDate = get-date -format F

    # EMAIL Properties
    $smtpServer = "smtp.domain.com" 
      $smtp = New-Object Net.Mail.SmtpClient($smtpServer) 
      $msg = New-Object Net.Mail.MailMessage 
      $msg.To.Add($rcpts) 
            $msg.From = "user@domain.com" 
      $msg.Subject = "EventLog Report for $subjectDate" 
            $msg.IsBodyHTML = $true 
            $msg.Body = get-content $logReport 
      $smtp.Send($msg) 
            $body = "Hello"
}
#即使有错误也要继续
$ErrorActionPreference=“继续”;
#电子邮件属性
#设置报告的收件人。
$rcpts=”user@domain.com" 
#报告属性
#报告的路径
$reportPath=“SomePath”;
#报告名称
$reportName=“SomeFileName”;
#路径和报告名称一起
$logReport=$reportPath+$reportName
#获取计算机列表以检查日志
$computers='servers.txt'
#待监控日志的日期覆盖率
$StartDate=(获取日期).AddDays(-1)
#要监视的日志名
$logname=“系统”
#清理旧文件。。
$Daysback=“-7”
$CurrentDate=获取日期;
$DateToDelete=$CurrentDate.AddDays($Daysback);
获取ChildItem$reportPath |其中对象{$\ LastWriteTime-lt$DatetoDelete}|删除项;
#CSS样式
$css=“”
$css=$css+“正文{文本对齐:居中;背景色:白色;}”
$css=$css+“表格{字体系列:'Lucida Sans Unicode','Lucida Grande',Sans Serif;字体大小:12px;边距:10px;宽度:100%;文本对齐:居中;边框折叠:折叠;边框顶部:7px实心#004466;边框底部:7px实心#004466;}”
$css=$css+“TH{font size:13px;font-weight:normal;padding:1px;background:#cceeff;border right:1px solid#004466;border left:1px solid#004466;color:#004466;}”
$css=$css+“TD{填充:1px;背景:##FFFFFF;右边框:1px实心#004466;左边框:1px实心#004466;颜色:#669;悬停:黑色;}”
$css=$css+“TD:hover{背景色:#e5f7ff;}”
$css=$css+“”
#过程日志
$body=获取内容$computers | ForEach对象{
Get-WinEvent-ComputerName$\uU2-FilterHashtable@{logname=$logname;Level=1,2,3;starttime=$StartDate}
}
如果($正文)
{
#转换为HTML样式
$body |转换为HTML-Head$css MachineName、LogName、LevelDisplayName、ID、TimeCreated、Message>$logReport
#获取电子邮件主题的日期
$subjectDate=获取日期-格式F
#电子邮件属性
$smtpServer=“smtp.domain.com”
$smtp=新对象Net.Mail.SmtpClient($smtpServer)
$msg=新对象Net.Mail.MailMessage
$msg.To.Add($rcpts)
$msg.From=”user@domain.com" 
$msg.Subject=“$subjectDate的事件日志报告”
$msg.IsBodyHTML=$true
$msg.Body=获取内容$logReport
$smtp.Send($msg)
$body=“你好”
}

您可以尝试将ID参数放入筛选器哈希表,然后使用
If Else
语句打开和关闭ID搜索。尽快创建您的文本文件:

servers.txt

SERVERNAME1;11,65,73
SERVERNAME2;1
SERVERNAME3;1,2,3,4,5
SERVERNAME4;
SERVERNAME5;
SERVERNAME5;33,64,217,15
注意
4
5
末尾没有ID的code>将搜索所有事件

然后使用以下代码从
servers.txt
中选择事件id和服务器名称,并进行相应搜索

$body = Get-Content $computers | ForEach-Object {

    # Reset Variables
    $EventIds=$ServerName=$split=$null

    # Split the line in the text file on ;
    $split = $_ -split ";"

    # Get the servernamne and eventIds
    $ServerName = $split[0]
    [Array]$EventIds = $split[1] -split ','

    # If there is an event id mentioned search for it else search for all events
    If($EventIds -ne "" -and $EventIds -ne $null){
        Get-WinEvent -ComputerName $ServerName -FilterHashtable @{logname=$logname; Level=1,2,3; starttime=$StartDate; Id=$EventIds} -ErrorAction SilentlyContinue
    }
    Else{
        Get-WinEvent -ComputerName $ServerName -FilterHashtable @{logname=$logname; Level=1,2,3; starttime=$StartDate}    
    }
}

我已经解决了这个问题,只需添加一行代码

添加了此
$EventID=Get Content'EventID.txt'

并修改了这个

$body = Get-Content $computers | ForEach-Object {
    Get-WinEvent -ComputerName $_ -FilterHashtable @{logname=$logname; Level=1,2,3; starttime=$StartDate; ID=$EventID}    
}

这可能行得通。但是,我要指出的两件事是,我要筛选的事件ID集合与所有服务器相同,如果进程没有看到ID集合中的任何条目,则进程将结束,并且不会进一步搜索。@lapsantos我在额外的foreach循环中添加了一个逐个搜索每个ID的循环。因此,如果一个ID没有任何事件,它将以静默方式继续到下一个ID。@lapsantos发现,您不需要foreach循环,您可以使用
-ErrorAction SilentlyContinue
和事件ID数组,它将继续搜索。我已经更新了我的答案来反映这一点。感谢Richard的帮助。我对你的答案投了赞成票