循序漸進:如何在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的許可