Powershell - Get-WinEvent - 发送带有来自事件的消息的电子邮件

欲望

我是powershell的新手。我想从任务计划程序/操作中获取带有故障代码的事件,并发送一封包含正文中所有事件的电子邮件。

# Get all events from yesterday with ID=103 and Text, put in table and send email
   
# Get the event entries.
$eventEntries = & {Get-WinEvent  -FilterHashtable @{ LogName='Microsoft-Windows-TaskScheduler/Operational'; StartTime=(Get-Date).AddDays(-1); ID='103'} | 
    Where {$_.Message.Contains('Task Scheduler failed to start instance')} | 
    select -Property ID,TimeCreated,Message |ft -wrap}
            
# Create a table row for each entry.
$array = @()

foreach ($eventEntry in $eventEntries)
{
     $array += $eventEntry
}
$array | Format-table

# Create the email.
$MailFrom = "[email protected]"
$MailTo = "[email protected]"
$Subject = "EventLogAlert"
$email = New-Object System.Net.Mail.MailMessage( $MailFrom , $MailTo )
$email.Subject = $Subject
$email.IsBodyHtml = $true
$email.Body = @"
<table style="width:100%;border">
     <tr>
         <th style="text-align: center; padding: 5px;">ID</th>
         <th style="text-align: center; padding: 5px;">TimeCreated</th>
         <th style="text-align: center; padding: 5px;">Message</th>
        </tr>
    
    $array
    </table>
"@

# Send the email.
$SmtpServer = "smtp.mail.outlook.com"
$SmtpPort = 587
$SmtpUser = "[email protected]"
$SmtpPassword = "passwordexample"
$SMTPClient=New-Object System.Net.Mail.SmtpClient($SmtpServer,$SmtpPort)
$SMTPClient.EnableSsl=$true
$SMTPClient.Credentials= New-Object System.Net.NetworkCredential($SmtpUser,$SmtpPassword);
$SMTPClient.Send($email)

$array 是用其中的值创建的,可以查看echo $eventEntries结果 $email 没有表中的值,它给出了这个文本

Microsoft.PowerShell.Commands.Internal.Format.FormatStartData Microsoft.PowerShell.Commands.Internal.Format.GroupStartData Microsoft.Powershell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.GroupEndData Microsoft.PowerShell.Commands.Internal.Format.FormatEndData 

有人可以帮我编写正确的代码来查看电子邮件中的所有事件。

此外,为每个事件分别创建一封电子邮件。

提前致谢!

跟随

如果您打算进一步使用数据,则不应使用Format-Table,因为该 cmdlet 仅用于显示目的。

试试下面的代码:

$yesterday = (Get-Date).AddDays(-1).Date   # set to midnight
$filter    = @{LogName='Microsoft-Windows-TaskScheduler/Operational'; StartTime=$yesterday; ID='103'}
$events    = Get-WinEvent -FilterHashtable $filter -ErrorAction SilentlyContinue | 
             Where-Object {$_.Message -like '*Task Scheduler failed to start instance*'} | 
             Select-Object -Property TaskDisplayName,ID,TimeCreated,Message

$style = @'
<style>
    body {font-family: Calibri, Tahoma, Helvetica, sans-serif; color: black;}
    table {width: 100%; border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
    th {text-align: center; padding: 5px; background-color: #6495ED; color: white;}
    td {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
'@

# to use for both the email as the subject for this email
$subject = 'EventLogAlert {0:yyyy-MM-dd HH:mm:ss}' -f (Get-Date)

# create the email body using the style above for the table
$body = $events | ConvertTo-Html -Head $style -PreContent "<h2>$subject</h2>"

# Create the email.
$MailFrom = "[email protected]"
$MailTo   = "[email protected]"
$email    = New-Object System.Net.Mail.MailMessage($MailFrom, $MailTo)
$email.Subject    = $subject
$email.IsBodyHtml = $true
$email.Body       = $body -join [environment]::NewLine

# Send the email.
$SmtpServer   = "smtp.mail.outlook.com"
$SmtpPort     = 587
$SmtpUser     = "[email protected]"
$SmtpPassword = "passwordexample"
$SMTPClient   = New-Object System.Net.Mail.SmtpClient($SmtpServer, $SmtpPort)
$SMTPClient.EnableSsl   = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($SmtpUser, $SmtpPassword);
$SMTPClient.Send($email)

笔记:

  • 我使用的是-like运算符而不是.Contains()字符串方法,因为后者区分大小写
  • 我已通过附加将昨天的日期设置为午夜.Date
  • 样式完全取决于您,这只是您可能喜欢或不喜欢的示例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用PowerShell发送电子邮件

Powershell发送带有图像的电子邮件

通过PowerShell发送电子邮件

PowerShell,Get-WinEvent -FilterHashTable ID和数组的怪异行为

PowerShell Get-Winevent按关键字和提供程序名称的问题

使用PowerShell发送电子邮件

PowerShell Get-WinEvent仅显示Message属性的第一行吗?

通过电子邮件发送Powershell脚本的结果

如何在Powershell中使用Get-ChildItem将文件附加到电子邮件

Powershell过滤来自Get-WinEvent的输出数据

Get-WinEvent脚本

通过Powershell使用批处理文件发送带有附件的电子邮件

使用Get-WinEvent检索用户名

Powershell通过EWS发送电子邮件,消息正文格式出现问题

带有文本输入的PowerShell电子邮件

如何使用Get-WinEvent cmdlet获取最新日志?

Powershell 电子邮件发送错误

使用 PowerShell Get-WinEvent 或 Get-WMIObject 查询 Windows 更新错误

PsExec with Get-WinEvent: 系统找不到指定的文件

如何使用 EWS Powershell 发送带有自定义投票选项的电子邮件

Powershell - Get-WinEvent 替换文本

使用 powershell 发送带有内嵌附件的电子邮件

如何使用 Get-EventLog 在 PowerShell 中获得与 Get-WinEvent 相同的结果?

使用 Get-WinEvent 查询忽略来自特定来源的特定事件 ID

PowerShell - 将 HTML 文件作为电子邮件正文发送

从 Powershell Get-WinEvent 分组和选择前 1 个事件

Get-WinEvent 与匹配 TimeCreated

在发送带有附件的电子邮件的脚本结束后,PowerShell 仍会锁定文件

Get-WinEvent 搜索所有错误