Date: 11月 9, 2018
循序渐进:如何使用Windows Server 2016从包含事件详细信息的Windows事件触发电子邮件警报
介绍
从Windows事件触发电子邮件警报使用Windows Server 2016只需要几个步骤。指定触发该任务时将发生的操作。由于Microsoft已决定弃用“发送电子邮件”选项,因此我们唯一的选择是启动程序。在我们的例子中,该程序将是一个Powershell脚本,用于收集事件日志信息并对其进行解析。这样,我们就可以发送包含重要日志事件详细信息的电子邮件。此工作已在Windows Server 2016上得到验证。但我怀疑它应该适用于Windows Server 2012 R2和Windows Server 2019。如果您在任何其他平台上工作,请发表评论,如果您需要更改任何内容,请告诉我们。
步骤1-编写Powershell脚本
首先要做的是写一个Powershell脚本,运行时可以发送电子邮件。在研究这个问题时,我发现了很多方法来完成这项任务,所以我要向您展示的只是一种方式,但您可以随意尝试并使用适合您环境的方法。在我的实验室中,我没有运行自己的SMTP服务器,因此我必须编写一个可以利用我的Gmail帐户的脚本。您将在我的Powershell脚本中看到,对SMTP服务器进行身份验证的电子邮件帐户的密码是纯文本格式。如果您担心某人可能有权访问您的脚本并发现您的密码,请加密您的凭据。Gmail需要和SSL连接。 您的密码应该是安全的,就像任何其他电子邮件客户端一样。我有一个Powershell脚本的例子。与任务计划程序一起使用时,它将在Windows事件日志中记录任何指定的事件时自动发送电子邮件警报。在我的环境中,我将此脚本保存到C: Alerts DataKeeper.ps1
$ EventId = 16,20,23,150,219,220 $ A = Get-WinEvent -MaxEvents 1 -FilterHashTable @ {Logname =“System”; ID = $ EventId} $ Message = $ A.Message $ EventID = $ A.Id $ MachineName = $ A.MachineName $ Source = $ A.ProviderName $ EmailFrom =“sios@medfordband.com” $ EmailTo =“sios@medfordband.com” $ Subject =“来自$ MachineName的警报” $ Body =“EventID:$ EventID`nSource:$ Source`nMachineName:$ MachineName`nMessage:$ Message” $ SMTPServer =“smtp.gmail.com” $ SMTPClient = New-Object Net.Mail.SmtpClient($ SmtpServer,587) $ SMTPClient.EnableSsl = $ true $ SMTPClient.Credentials = New-Object System.Net.NetworkCredential (“sios@medfordband.com”,“mySMTPP @ 55w0rd”); $ SMTPClient.Send($ EmailFrom,$ EmailTo,$ Subject,$ Body)
从Powershell脚本生成的电子邮件示例如下所示。 您可能已经注意到,此Powershell脚本使用Get-WinEvent cmdlet根据指定的LogName,Source和eventID获取最新的Event Log条目。然后它解析事件并将EventID,Source,MachineName和Message分配给将用于撰写电子邮件的变量。您将看到指定的LogName,Source和eventID与您在步骤2中设置计划任务时指定的ID相同。
第2步 – 设置计划任务
在任务计划程序中创建一个任务,如以下屏幕截图所示。
- 创建任务确保将任务设置为“运行”,无论用户是否已登录。
- 在“触发器”选项卡上,选择“新建”以创建将启动“在事件上”任务的触发器。在我的示例中,我将创建一个事件,触发任何时候DataKeeper(extmirr)将重要事件记录到系统日志。 创建一个自定义事件和新事件过滤器,如下所示…对于我的触发器,我触发通常受监控的SIOS DataKeeper(ExtMirr)EventIDs 16,20,23,150,219,220。您需要设置事件以触发要监视的特定事件。如果要通知来自不同日志或来源的事件,可以将多个触发器放在同一个任务中。
- 配置事件触发器后,您将需要配置事件运行时发生的操作。在我们的例子中,我们将运行我们在步骤1中创建的Powershell脚本。
- 默认的Condition参数应该足够了。
- 最后,在“设置”选项卡上,确保允许按需运行任务,并在任务已在运行时“排队新实例”。
步骤3(如有必要) – 修复Microsoft Windows DistributedCOM事件ID:10016错误
理论上,如果您正确地执行了所有操作,您应该能够使用Windows Server 2016从Windows事件触发电子邮件警报。但是,我在我的一台服务器上遇到了一个奇怪的权限问题。这是我解决问题的方法。希望它也会对你有所帮助。在我手动触发事件的情况下,或者如果我直接运行Powershell脚本,一切都按预期工作,我会收到一封电子邮件。但是,如果正在监视的某个EventID被记录到事件日志中,则不会导致发送电子邮件。我唯一的线索是事件ID:10016。每次我希望任务触发器检测到记录的事件时,它都记录在我的系统事件日志中。
日志名称:系统 来源:Microsoft-Windows-DistributedCOM 日期:10/27/2018 5:59:47 PM 事件ID:10016 任务类别:无 等级:错误 关键词:经典 用户:DATAKEEPER dave 电脑:sql1.datakeeper.local 描述: 特定于应用程序的权限设置不授予“本地激活”权限 对于具有CLSID的COM Server应用程序 {D63B10C5-BB46-4990-A94F-E40B9D520160} 和APPID {9CA88EE3-ACB7-47C8-AFC4-AB702511C276} 给用户DATAKEEPER dave SID(S-1-5-21-25339xxxxx-208xxx580-6xxx06984-500) 来自地址LocalHost (使用LRPC)在应用程序容器中运行不可用SID(不可用)。 可以使用组件服务管理工具修改此安全权限。
许多针对该错误的Google搜索结果表明该错误是良性的。它包含有关如何抑制错误而不是修复错误的说明。但是,我很确定这个错误是我目前失败的原因。如果我没有正确解决问题,使用Windows Server 2016从Windows事件触发电子邮件警报将很困难。经过多次搜索,我偶然发现了这个新闻组的讨论。 Marc Whittlesey的回应使我指出了正确的方向。这是他写的……
在转到组件服务中的DCOM配置之前,您必须设置2个注册表项:CLSID密钥和APPID密钥。
我建议你按照一些步骤解决问题:
1。 按Windows + R键并键入regedit,然后按Enter键。2。 转到HKEY_Classes_Root CLSID * CLSID *。3。 右键单击它然后选择权限。4。 单击“高级”并将所有者更改为管理员。同时单击将显示在所有者行下方的框。5。 适用完全控制。6。 关闭选项卡,然后转到HKEY_LocalMachine Software Classes AppID * APPID *。7。 右键单击它然后选择权限。8。 单击“高级”并将所有者更改为管理员。9。 单击将显示在所有者行下方的框。10。 单击“应用”并向管理员授予完全控制权。11。 关闭所有选项卡,然后转到管理工具。12。 开放组件服务。13。 单击“计算机”,单击“我的电脑”,然后单击“DCOM”。14。 查找错误查看器上显示的相应服务。15。 右键单击它,然后单击属性。16。 单击安全选项卡,然后单击添加用户,添加系统,然后应用 17。 勾选激活本地框。因此,请在此处使用相关密钥,DCOM配置应该可以访问灰色区域:CLSID {D63B10C5-BB46-4990-A94F-E40B9D520160} APPID {9CA88EE3-ACB7-47C8-AFC4-AB702511C276}
我几乎可以逐字逐句地遵循步骤1-15。然而,当我到达第16步时,我真的无法确切地说出他希望我做什么。起初我将DATAKEEPER dave用户帐户完全控制权授予了RuntimeBroker,但这并没有解决问题。最后我只是在所有三个权限上选择了“使用默认值”并修复了问题。 我不确定这是怎么发生的。我想我最好把它全部写下去,以防它再次发生,因为我花了一段时间来弄清楚它。
第4步 – 自动部署
如果需要在多个系统上启用相同的警报,请将任务导出到XML文件并将其导入其他系统。 或者甚至更好。 在文件共享上提供XML文件后,通过Powershell脚本自动执行导入作为构建过程的一部分,如以下示例所示。
PS C:> Register-ScheduledTask -Xml(get-content '\ myfileshare tasks DataKeeperAlerts.xml'|出弦) -TaskName“DataKeeperAlerts” - 用户数据管理员 dave -Password MyDomainP @ 55W0rd -Force
使用Windows Server 2016从Windows事件触发电子邮件警报
在我的下一篇文章中,我将向您展示如何在指定的服务启动或停止时收到通知。当然,您只需从Service Control Monitor监视EventID 7036即可。但是,只要任何服务开始或停止,这都会通知您。我们需要深入挖掘,以确保只有在我们关心的服务开始或停止时才会收到通知。如果您对我们的操作方法文章感兴趣,例如使用Windows Server 2016从Windows事件触发电子邮件警报,请单击此处。从Clusteringformeremortals.com转载