循序渐进:如何在Windows Server 2016上启动或停止特定Windows服务时触发电子邮件警报
与我上一篇文章的不同之处在于,我向您展示了如何根据Windows事件日志中记录的特定Windows EventID发送电子邮件警报,这次我将分享如何在特定Windows服务启动或停止时触发电子邮件警报。它适用于大多数活动。虽然请注意,如果您希望在特定Windows服务启动或停止时收到通知,这并不理想。当Windows服务启动或停止时,Windows系统日志中会记录源“服务控制管理器”中的EventID 7036。现在,我们可以设置一个触发器,以便在记录EventID时发送电子邮件,就像我在上一篇文章中所描述的那样。 但是,您可能不希望在每个Windows服务启动或停止时收到电子邮件。为了更具体一点,我们必须在设置触发器时编辑与Windows事件过滤器关联的XML数据。这是为了更深入地了解事件属性并对EventData进行过滤,该事件仅在您在Windows事件的“详细信息”选项卡上查看XML视图时显示。这项工作在Windows Server 2016上得到了验证,但我怀疑它也可以在Windows Server 2012 R2和Windows Server 2019上运行。如果您在任何其他平台上工作,请发表评论并告知我们您是否需要更改任何内容。
第1步 – 编写Powershell脚本
您需要做的第一件事是编写一个Powershell脚本,在运行时可以发送电子邮件。您需要该电子邮件才能在特定Windows服务启动或停止时触发电子邮件警报。有很多方法可以完成这项任务。我即将向您展示只是一种方式,但您可以随意尝试并使用适合您环境的方法。在我的实验室中,我没有运行自己的SMTP服务器,因此我必须编写一个可以利用我的Gmail帐户的脚本。您将在我的Powershell脚本中看到对SMTP服务器进行身份验证的电子邮件帐户的密码是纯文本格式。如果您担心某人可能有权访问您的脚本并发现您的密码,那么您将需要加密您的凭据。Gmail需要和SSL连接,因此您的密码应该是安全的,就像任何其他电子邮件客户端一样。下面是一个Powershell脚本示例,当与Task Scheduler结合使用时,它会在Windows事件日志中记录任何指定的事件时自动发送电子邮件警报。在我的环境中,我将此脚本保存到C: Alerts ServiceAlert.ps1
$ filter =“* [System [EventID = 7036] and EventData [Data ='SIOS DataKeeper']]” $ A = Get-WinEvent -LogName系统-MaxEvents 1 -FilterXPath $ filter $ 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`n $ 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,EventID和EventDataspecified获取最新的事件日志条目。然后它解析该事件并将EventID,Source,MachineName和Message分配给将用于撰写电子邮件的变量。您将看到指定的LogName,EventID和EventData与您在步骤2中设置计划任务时指定的内容相同。虽然EventID,LogName可能对您来说很熟悉,但EventData可能并不那么熟悉。要查看与特定事件关联的EventData,您需要在事件查看器中打开事件,查看“详细信息”选项卡,然后选择“XML视图”。从XML视图中,您可以看到事件中包含的所有数据。在XML的底部附近,您将看到一个名为<EventData>的数据数组。在那里,您将找到存储为参数的其他事件数据。如下所示,在“param1”中,我们将找到停止或启动的服务名称。
第2步 – 设置计划任务
在任务计划程序中创建一个任务,如以下屏幕截图所示。
- 创建任务确保将任务设置为“运行”,无论用户是否已登录。
- 在“触发器”选项卡上,选择“新建”以创建将启动“在事件上”任务的触发器。在我的示例中,我将创建一个事件,触发任何时候DataKeeper(extmirr)将重要事件记录到系统日志。 创建一个自定义事件和新事件过滤器,如下所示...对于我的触发器,您可以开始设置一个监视7036的触发器,正如我在上一篇文章中所描述的那样。但是,过滤器GUI界面不允许我们指定存储在EventData的Param1中的服务名称,如前所述。为了监控我们感兴趣的特定服务,我们需要直接编辑XML,如下所示。 如果您只是直接跳到追逐,请随意复制我的XML,并将“SIOS DataKeeper”替换为存储在您要监控的事件的param1中的事件数据。
<QueryList> <Query Id =“0”Path =“System”> <Select Path =“System”> * [System [(Level = 4或Level = 0)和(EventID = 7036)]] 和* [EventData [Data [1] ='SIOS DataKeeper']] </ Select> </查询> </ QueryList>
- 配置事件触发器后,您将需要配置事件运行时发生的操作。在我们的例子中,我们将运行我们在步骤1中创建的Powershell脚本。
- 默认的Condition参数应该足够了。
- 最后,在“设置”选项卡上,确保允许按需运行任务,并在任务已在运行时“排队新实例”。
步骤3(如有必要) – 修复Microsoft -Windows – Distributedcom事件ID:10016错误
理论上,如果您正确地执行了所有操作,则只要您正在监视的某个事件记录在事件日志中,您就应该立即开始接收电子邮件。 但是,我在我的一台服务器上遇到了一个奇怪的权限问题,我必须在一切工作之前解决这个问题。我不确定你是否会遇到这个问题,但以防这里是修复。在我的情况下,当我手动触发事件,或者我直接运行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搜索结果都表明该错误是良性的,并包含有关如何抑制错误而非修复错误的说明。但是,我非常确定此错误是导致我当前无法从受监视的事件日志条目触发的计划事件发送电子邮件警报的原因。我需要解决它。经过多次搜索,我偶然发现了这个新闻组的讨论。 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文件并将其导入其他系统即可。导出[/ caption] [caption id =“attachment_2346”align =“alignnone”width =“391”]导入[/ caption]甚至更好,在文件共享中提供XML文件后,通过Powershell脚本自动执行构建过程中的导入,如以下示例所示。
PS C:> Register-ScheduledTask -Xml(get-content'\ myfileshare tasks DataKeeperAlerts.xml' | out-string)-TaskName“DataKeeper Service Alerts”-User datakeeper dave -Password MyDomainP @ 55W0rd -Force
最后,特定Windows服务启动或停止时的电子邮件警报
希望我提供的内容能为您提供开始接收警报通知电子邮件所需的一切,无论您使用哪种Windows服务让您夜不能寐。以上是关于配置电子邮件警报的系列文章。在本系列中,我介绍了基于Perfmon计数器,事件日志条目以及本文Windows服务启动和停止事件的配置警报。当然,您可以扩展这些文章中描述的Powershell脚本,而不仅仅是发送电子邮件。许多警报或意外服务中断通常需要一些补救措施。为什么不编写恢复步骤的脚本,让触发的任务为您解决问题?我个人建议您投资SCOM,SolarWinds或其他一些企业管理系统,但如果这不在您工作的卡片中,那么这些文章可以帮助您。要了解有关特定Windows服务启动或停止时的电子邮件警报的更多提示,请与我们联系转发,并获得Clusteringformeremortals.com的许可