Date: 11월 18, 2018
태그: Windows Server 2016, 특정 Windows 서비스가 시작되거나 중지 될 때 전자 메일 알림
단계별 : 특정 Windows 서비스가 시작되거나 Windows Server 2016에서 중지 될 때 전자 메일 경고를 트리거하는 방법
이전 Windows 이벤트 로그에 기록 된 특정 Windows 이벤트 ID를 기반으로 전자 메일 경고를 보내는 방법을 보여준 이전 게시물과는 달리 이번에는 특정 Windows 서비스가 시작되거나 중지 될 때 전자 메일 경고를 트리거하는 방법을 공유합니다. 대부분의 이벤트에 잘 작동합니다. 특정 Windows 서비스가 시작되거나 중지 될 때 알림을 받고 싶다면 이상적이지 않습니다. Windows 서비스가 시작되거나 중지되면 Source "Service Control Manager"의 EventID 7036이 Windows 시스템 로그에 기록됩니다. 이제는 이전 게시물에 설명 된대로 EventID가 기록 될 때마다 이메일을 보내도록 트리거를 설정할 수 있습니다. 그러나 모든 Windows 서비스가 시작되거나 중지 될 때 전자 메일을 수신하지 않을 수도 있습니다. 좀 더 구체적으로 설명하기 위해 트리거를 설정할 때 Windows 이벤트 필터와 관련된 XML 데이터를 편집해야합니다. 이것은 이벤트 속성을 약간 더 자세히보고 Windows 이벤트의 세부 정보 탭에서 XML보기를 볼 때만 표시되는 EventData에 필터링합니다. 이 작업은 Windows Server 2016에서 확인되었지만 Windows Server 2012 R2 및 Windows Server 2011에서도 작동해야합니다. 다른 플랫폼에서 작동하게되면 다른 플랫폼으로 의견을 말하고 알려주십시오.
1 단계 – Powershell 스크립트 작성
당신이해야 할 첫 번째 일은 이메일을 보낼 수있는 Powershell 스크립트를 작성하는 것입니다. 특정 Windows 서비스가 시작 또는 중지 될 때 전자 메일 경고를 트리거하려면 해당 전자 메일이 필요합니다. 이 작업을 수행하는 방법은 여러 가지가 있습니다. 나는 당신이 한 가지 방법 일뿐만 아니라 실험하고 환경에 맞는 것을 자유롭게 사용한다는 것을 보여주고 있습니다. 내 실험실에서는 자체 SMTP 서버를 실행하지 않으므로 Gmail 계정을 활용할 수있는 스크립트를 작성해야했습니다. 내 Powershell 스크립트에서 SMTP 서버를 인증하는 전자 메일 계정의 암호가 일반 텍스트로 표시됩니다. 누군가가 귀하의 스크립트에 액세스하여 귀하의 암호를 발견 할 우려가 있다면 자격 증명을 암호화하고 싶을 것입니다. Gmail은 다른 모든 이메일 클라이언트와 마찬가지로 비밀번호가 유선에서 안전해야하므로 SSL 연결을 요구합니다. 다음은 Windows 이벤트 로그에 지정된 이벤트가 기록 될 때 전자 메일 경고를 자동으로 보내는 작업 스케줄러와 함께 사용되는 Powershell 스크립트의 예제입니다. 내 환경에서이 스크립트를 C : Alerts ServiceAlert.ps1에 저장했습니다.
$ filter = "* [System [EventID = 7036] 및 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 = "Alert from $ MachineName" $ Body = "EventID : $ EventID`nSource : $ 소스`nMachineName : $ MachineName`n $ 메시지" $ SMTPServer = "smtp.gmail.com" $ SMTPClient = 새 개체 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"에는 중지되었거나 시작된 Service의 이름이 있습니다.
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> </ Query> </ QueryList>
- 이벤트 트리거가 구성되면 이벤트가 실행될 때 발생하는 작업을 구성해야합니다. 이 경우에는 1 단계에서 만든 Powershell 스크립트를 실행합니다.
- 기본 조건 매개 변수로 충분해야합니다.
- 마지막으로 설정 탭에서 작업이 이미 실행중인 경우 필요시 실행되도록하고 "새 인스턴스 대기"로 설정하십시오.
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 서버 응용 프로그램에 대한 {D63B10C5-BB46-4990-A94F-E40B9D520160} 및 APPID {9CA88EE3-ACB7-47C8-AFC4-AB702511C276} 사용자에게 DATAKEEPER dave SID (S-1-5-21-25339xxxxx-208xxx580-6xxx06984-500) address LocalHost (LRPC 사용) 응용 프로그램 컨테이너에서 실행 중입니다. 사용할 수없는 SID (사용할 수 없음). 이 보안 권한은 구성 요소 서비스 관리 도구를 사용하여 수정할 수 있습니다.
해당 오류에 대한 Google 검색 결과의 대부분은 오류가 발생하지 않았 음을 나타내며 오류를 수정하는 대신 오류를 억제하는 방법에 대한 지침을 포함합니다. 그러나이 오류가 현재 모니터링 된 이벤트 로그 항목에서 트리거 된 예약 된 이벤트에서 전자 메일 경고를 보낼 수없는 현재 오류의 원인이라고 확신했습니다. 나는 그것을 고칠 필요가 있었다. 많은 검색을 한 후에, 나는이 뉴스 그룹 토론을 발견했습니다. Marc Whittlesey의 답변은 올바른 방향으로 나를 지적했습니다. 이것은 그가 쓴 것입니다 …
구성 요소 서비스의 DCOM 구성 (CLSID 키 및 APPID 키)에 가기 전에 사용 권한을 설정해야하는 두 가지 레지스트리 키가 있습니다.
문제를 해결하기위한 몇 가지 단계를 따르는 것이 좋습니다.
1. Windows + R 키를 누르고 regedit를 입력하고 Enter 키를 누릅니다. 2. HKEY_Classes_Root CLSID * CLSID *로 이동하십시오. 삼. 그것을 마우스 오른쪽 단추로 클릭 한 다음 권한을 선택하십시오. 4. 고급을 클릭하고 소유자를 관리자로 변경하십시오. 소유자 줄 아래에 표시되는 상자를 클릭하십시오. 5. 완전한 제어를 적용하십시오. 6. 탭을 닫은 다음 HKEY_LocalMachine Software Classes AppID * APPID *로 이동하십시오. 7. 그것을 마우스 오른쪽 단추로 클릭 한 다음 권한을 선택하십시오. 8. 고급을 클릭하고 소유자를 관리자로 변경하십시오. 9. 소유자 선 아래에 표시 될 상자를 클릭하십시오. 10. 적용을 클릭하고 관리자에게 모든 권한을 부여하십시오. 11. 모든 탭을 닫고 관리 도구로 이동하십시오. 12. 구성 요소 서비스를 엽니 다. 13. 컴퓨터, 내 컴퓨터를 차례로 클릭 한 다음 DCOM을 클릭하십시오. 14. 오류 표시기에 나타나는 해당 서비스를 찾으십시오. 15. 마우스 오른쪽 버튼으로 클릭 한 다음 속성을 클릭하십시오. 16. 보안 탭을 클릭 한 다음 사용자 추가, 시스템 추가, 적용을 클릭하십시오. 17. 로컬 활성화 상자를 선택하십시오. 따라서 여기에서 관련 키를 사용하면 DCOM Config를 통해 회색 영역에 액세스 할 수 있습니다. CLSID {D63B10C5-BB46-4990-A94F-E40B9D520160} APPID {9CA88EE3-ACB7-47C8-AFC4-AB702511C276}
나는 1-15 단계를 거의 그대로 따라갈 수 있었다. 그러나, 제가 16 단계에 도착했을 때, 저는 그가 제가 원하는 것을 정확하게 말할 수 없었습니다. 처음에는 DATAKEEPER dave 사용자 계정에 RuntimeBroker에 모든 권한을 부여했습니다. 하지만 그건 문제를 해결하지 못했습니다. 결국 세 가지 권한 모두에서 "기본값 사용"을 선택하고 문제가 해결되었습니다. 어떻게 또는 왜 이런 일이 일어 났는지는 잘 모르겠지만, 문제가 생길 경우를 대비해서 다시 쓰는 것이 더 낫다고 생각했습니다.
4 단계 – 배포 자동화
여러 시스템에서 동일한 경고를 활성화해야하는 경우 작업을 XML 파일로 내보내고 다른 시스템에서 가져올 수 있습니다. [캡션 ID = "첨부 파일 _2345"정렬 = "alignnone"너비 = "369"] 내보내기 [/ 캡션] [캡션 ID = "첨부 파일 _2346"정렬 = "alignnone"너비 = "391"] 가져 오기 [/ 캡션] 다음 예제와 같이 파일 공유에서 XML 파일을 사용할 수있게 한 다음 Powershell 스크립트를 통해 빌드 프로세스의 일부로 가져 오기를 자동화하십시오.
PS C : > Register-ScheduledTask -Xml (get-content '\ myfileshare tasks DataKeeperAlerts.xml' | out-string) -TaskName "DataKeeper 서비스 경고"- 사용자 datakeeper dave - 암호 MyDomainP @ 55W0rd - 포스
마지막으로 특정 Windows 서비스가 시작되거나 중지 될 때 전자 메일 알림
다행히도 내가 제공 한 서비스는 밤에 Windows 서비스를 계속 사용하는 경우 경고 알림 전자 메일을 받기 위해 필요한 모든 것을 제공합니다. 이것으로 전자 메일 경고 구성에 관한 본 시리즈를 마칩니다. 이 시리즈에서는 성능 카운터, 이벤트 로그 항목 및이 기사의 Windows 서비스 시작 및 중지 이벤트를 기반으로 구성된 경고 구성에 대해 다뤘습니다. 물론이 기사에서 설명하는 Powershell 스크립트를 확장하여 전자 메일을 보내는 것 이상의 기능을 수행 할 수 있습니다. 많은 경고 또는 예상치 못한 서비스 중지에는 일반적으로 약간의 수정이 필요합니다. 왜 복구 단계를 스크립트 아웃하지 않고 트리거 된 작업을 통해 문제를 해결할 수 있습니까? 개인적으로 SCOM, SolarWinds 또는 다른 엔터프라이즈 관리 시스템에 투자하는 것이 좋지만, 근무지의 카드에 없으면이 기사가 도움이 될 수 있습니다. 특정 Windows 서비스가 시작되거나 중지 될 때 전자 메일 경고에 대한 추가 팁을 보려면 Microsoft에 문의하십시오. Clusteringformeremortals.com의 허가를 받아 복제했습니다.