ทีละขั้นตอน: วิธีการเรียกใช้การแจ้งเตือนทางอีเมลจากเหตุการณ์ Windows ที่มีรายละเอียดของเหตุการณ์โดยใช้ Windows Server 2016
บทนำ
การแจ้งเตือนอีเมลแจ้งเตือนจากเหตุการณ์ Windows โดยใช้ Windows Server 2016 ต้องการเพียงไม่กี่ขั้นตอน ระบุการดำเนินการที่จะเกิดขึ้นเมื่อ Task ถูกเรียกใช้งาน เนื่องจาก Microsoft ได้ตัดสินใจยกเลิกการใช้งาน "ส่งอีเมล" ตัวเลือกเดียวที่เรามีคือ Start a Program ในกรณีของเราโปรแกรมดังกล่าวจะเป็นสคริปต์ Powershell เพื่อรวบรวมข้อมูลบันทึกเหตุการณ์และแยกวิเคราะห์ ด้วยวิธีนี้เราจะสามารถส่งอีเมลที่มีรายละเอียด Log Event ที่สำคัญ งานนี้ได้รับการยืนยันใน Windows Server 2016 แต่ฉันสงสัยว่าควรจะทำงานบน Windows Server 2012 R2 และ Windows Server 2019 เช่นกัน ถ้าคุณใช้งานได้กับแพลตฟอร์มอื่นโปรดแสดงความคิดเห็นและแจ้งให้เราทราบหากคุณต้องเปลี่ยนแปลงอะไร
ขั้นตอนที่ 1- เขียนสคริปต์ Powershell
สิ่งแรกที่ต้องทำคือการเขียนสคริปต์ Powershell ที่เมื่อรันสามารถส่งอีเมลได้ ขณะที่ค้นคว้าข้อมูลนี้ฉันค้นพบวิธีต่างๆมากมายในการทำให้งานนี้สำเร็จดังนั้นสิ่งที่ฉันกำลังจะแสดงให้คุณเห็นเป็นเพียงวิธีหนึ่ง แต่คุณสามารถทดลองและใช้สิ่งที่เหมาะสมกับสภาพแวดล้อมของคุณได้ ในห้องทดลองของฉันฉันไม่ได้ใช้เซิร์ฟเวอร์ SMTP ของตนเองดังนั้นฉันจึงต้องเขียนสคริปต์ที่สามารถใช้ประโยชน์จากบัญชี Gmail ของฉันได้ คุณจะเห็นในสคริปต์ Powershell ของฉันว่ารหัสผ่านไปยังบัญชีอีเมลที่ตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ SMTP อยู่ในรูปแบบข้อความล้วน หากคุณกังวลว่าอาจมีบุคคลอื่นเข้าถึงสคริปต์ของคุณและค้นพบรหัสผ่านของคุณให้เข้ารหัสข้อมูลประจำตัวของคุณ Gmail ต้องการและการเชื่อมต่อ SSL รหัสผ่านของคุณควรปลอดภัยบนสายเช่นเดียวกับโปรแกรมรับส่งอีเมลอื่น ๆ ฉันมีตัวอย่างของสคริปต์ Powershell เมื่อใช้ร่วมกับ Task Scheduler ระบบจะส่งอีเมลแจ้งเตือนโดยอัตโนมัติเมื่อมีการบันทึกเหตุการณ์ใด ๆ ไว้ใน Windows Event Log ในสภาพแวดล้อมของฉันฉันบันทึกสคริปต์นี้ไว้ที่ C: Alerts DataKeeper.ps1
$ EventId = 16,20,23,150,219,220 $ A = Get-WinEvent -MaxEvents 1 -FilterHashTable @ {Logname = "ระบบ"; ID = $ EventId} $ Message = $ A.Message $ EventID = $ A.Id $ MachineName = $ A.MachineName $ แหล่งที่มา = $ A.ProviderName $ EmailFrom = "sios@medfordband.com" $ EmailTo = "sios@medfordband.com" $ Subject = "การแจ้งเตือนจาก $ MachineName" $ Body = "EventID: $ EventID`nSource: $ แหล่งที่มา` nMachineName: $ MachineName `nMessage: $ ข้อความ" $ 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, $ หัวเรื่อง, $ Body)
ตัวอย่างอีเมลที่สร้างขึ้นจากสคริปต์ Powershell นั้นมีลักษณะดังนี้ คุณอาจสังเกตเห็นว่าสคริปต์ Powershell นี้ใช้ cmdlet Get-WinEvent เพื่อคว้ารายการบันทึกเหตุการณ์ล่าสุดจาก LogName, Source และ eventIDs ที่ระบุไว้ จากนั้นจะแยกวิเคราะห์เหตุการณ์และกำหนด EventID, Source, MachineName และ Message ให้เป็นตัวแปรที่จะใช้ในการเขียนอีเมล คุณจะเห็นว่า LogName, Source และ eventIDs ที่ระบุจะเหมือนกับที่คุณจะระบุเมื่อคุณตั้งค่า Scheduled Task ในขั้นตอนที่ 2
ขั้นตอนที่ 2 – ตั้งค่างานที่กำหนดเวลาไว้
ใน Task Scheduler สร้างงานตามที่แสดงในภาพหน้าจอต่อไปนี้
- สร้างงานตรวจสอบว่างานถูกตั้งค่าเป็นเรียกใช้ว่าผู้ใช้ล็อกอินหรือไม่
- ในแท็บทริกเกอร์เลือกสร้างใหม่เพื่อสร้าง Trigger ซึ่งจะเริ่มงาน "On a Event" ในตัวอย่างของฉันฉันจะสร้างเหตุการณ์ที่เรียกใช้เวลาใด ๆ DataKeeper (extmirr) บันทึกเหตุการณ์ที่สำคัญเข้าสู่บันทึกของระบบ สร้างเหตุการณ์แบบกำหนดเองและตัวกรองกิจกรรมใหม่ดังที่แสดงด้านล่าง … สำหรับทริกเกอร์ของฉันฉันเรียกใช้งานการตรวจสอบโดยปกติของ SIOS DataKeeper (ExtMirr) EventIDs 16, 20, 23,150,219,220 คุณจะต้องตั้งค่ากิจกรรมเพื่อเรียกใช้กิจกรรมเฉพาะที่คุณต้องการตรวจสอบ คุณสามารถใส่ทริกเกอร์หลายรายการในงานเดียวกันได้หากต้องการรับการแจ้งเตือนเกี่ยวกับเหตุการณ์ที่มาจากบันทึกหรือแหล่งที่มาต่างๆ
- เมื่อมีการกำหนดค่าทริกเกอร์เหตุการณ์คุณจะต้องกำหนดค่าแอ็คชันที่เกิดขึ้นเมื่อมีการเรียกใช้งานเหตุการณ์ ในกรณีของเราเราจะเรียกใช้สคริปต์ Powershell ที่เราสร้างขึ้นในขั้นตอนที่ 1
- พารามิเตอร์สภาวะดีฟอลต์ควรมีค่าเพียงพอ
- และสุดท้ายบนแท็บการตั้งค่าให้แน่ใจว่าคุณอนุญาตให้งานสามารถเรียกใช้ตามต้องการและ "คิวใหม่อินสแตนซ์" ถ้างานกำลังทำงานอยู่
ขั้นที่ 3 (ถ้าจำเป็น) – แก้ไขรหัสเหตุการณ์ของ Microsoft Windows DistributedCOM: 10016
ในทางทฤษฎีถ้าคุณทำทุกอย่างถูกต้องคุณควรสามารถเรียกใช้การแจ้งเตือนทางอีเมลจากเหตุการณ์ Windows โดยใช้ Windows Server 2016 อย่างไรก็ตามฉันได้รับสิทธิ์ในการอนุญาตแปลก ๆ จากเซิร์ฟเวอร์ของฉัน นี่คือการแก้ไขปัญหาของฉัน หวังว่ามันจะช่วยคุณได้เช่นกัน ในกรณีของฉันเมื่อฉันเรียกใช้เหตุการณ์ด้วยตนเองหรือถ้าฉันเรียกใช้สคริปต์ Powershell โดยตรงทุกอย่างทำงานตามที่คาดไว้และฉันจะได้รับอีเมล แต่ถ้าหนึ่ง EventIDs ถูกตรวจสอบเข้าสู่บันทึกเหตุการณ์จะไม่ส่งผลให้มีการส่งอีเมล เงื่อนงำเดียวที่ฉันมีคือรหัสเหตุการณ์: 10016 ถูกบันทึกไว้ในล็อกเหตุการณ์ระบบของฉันทุกครั้งที่ฉันคาด Task Trigger ตรวจพบเหตุการณ์ที่บันทึกไว้
ชื่อการเข้าสู่ระบบ: ระบบ แหล่งที่มา: Microsoft-Windows-DistributedCOM วันที่: 10/27/2018 5:59:47 PM รหัสเหตุการณ์: 10016 ประเภทงาน: ไม่มี ระดับ: ข้อผิดพลาด คำสำคัญ: คลาสสิก ผู้ใช้: DATAKEEPER dave คอมพิวเตอร์: sql1.datakeeper.local รายละเอียด: การตั้งค่าสิทธิ์เฉพาะแอปพลิเคชันไม่ได้ให้สิทธิ์การเปิดใช้งาน Local Activation สำหรับแอ็พพลิเคชันเซิร์ฟเวอร์ COM ที่มี CLSID {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 (Unavailable) สิทธิ์การรักษาความปลอดภัยนี้สามารถแก้ไขได้โดยใช้เครื่องมือการจัดการบริการคอมโพเนนต์
ผลการค้นหา Google จำนวนมากสำหรับข้อผิดพลาดดังกล่าวบ่งชี้ว่าข้อผิดพลาดนั้นไม่เป็นพิษเป็นภัย รวมถึงคำแนะนำในการปราบปรามข้อผิดพลาดแทนที่จะแก้ไข อย่างไรก็ตามผมค่อนข้างแน่ใจว่าข้อผิดพลาดนี้เป็นสาเหตุของความล้มเหลวในปัจจุบันของฉัน ถ้าฉันไม่สามารถแก้ไขได้ถูกต้องจะเป็นการยากที่จะเรียกใช้การแจ้งเตือนทางอีเมลจาก Windows โดยใช้ Windows Server 2016 หลังจากการค้นหามากฉันสะดุดเมื่ออภิปรายกลุ่มข่าวนี้ คำตอบจาก Marc Whittlesey ชี้ไปในทิศทางที่ถูกต้อง นี่คือสิ่งที่เขาเขียน …
มีคีย์รีจิสทรี 2 ชุดที่คุณต้องตั้งค่าสิทธิ์ก่อนที่คุณจะไปที่การกำหนดค่า DCOM ในบริการคอมโพเนนต์: คีย์ CLSID และปุ่ม APPID
ผมขอแนะนำให้ทำตามขั้นตอนต่างๆเพื่อแก้ไขปัญหา:
1 กดปุ่ม Windows + R และพิมพ์ regedit แล้วกด Enter 2 ไปที่ HKEY_Classes_Root CLSID * CLSID * 3 คลิกขวาที่ไฟล์แล้วเลือกสิทธิ์ 4 คลิกล่วงหน้าและเปลี่ยนเจ้าของเป็นผู้ดูแลระบบ คลิกกล่องที่จะปรากฏใต้บรรทัดเจ้าของ 5 ใช้การควบคุมแบบเต็มรูปแบบ 6 ปิดแท็บจากนั้นไปที่ APPID * HKEY_LocalMachine Software Classes AppID * 7 คลิกขวาที่ไฟล์แล้วเลือกสิทธิ์ 8 คลิกล่วงหน้าและเปลี่ยนเจ้าของให้ผู้ดูแลระบบ 9 คลิกช่องที่จะปรากฏใต้บรรทัดเจ้าของ 10 คลิกใช้และให้สิทธิ์การควบคุมแบบเต็มรูปแบบแก่ผู้ดูแลระบบ 11 ปิดแท็บทั้งหมดและไปที่เครื่องมือการดูแลระบบ 12 เปิดบริการส่วนประกอบ 13 คลิกคอมพิวเตอร์คลิกคอมพิวเตอร์ของฉันแล้วคลิก DCOM 14 ค้นหาบริการที่เกี่ยวข้องซึ่งปรากฏในโปรแกรมดูข้อผิดพลาด 15 คลิกขวาที่คุณสมบัติแล้วคลิกคุณสมบัติ 16 คลิกแท็บความปลอดภัยแล้วคลิก Add User, Add System จากนั้นใช้ 17 ทำเครื่องหมายที่ช่อง Enable local ดังนั้นใช้คีย์ที่เกี่ยวข้องที่นี่และ DCOM Config จะทำให้คุณสามารถเข้าถึงพื้นที่ที่เป็นสีเทาได้: CLSID {DATBLE {9CA88EE3-ACB7-47C8-AFC4-AB702511C276} {D63B10C5-BB46-4990-A94F-E40B9D520160}
ฉันสามารถทำตามขั้นตอน 1-15 คำทุกคำสวย ๆ อย่างไรก็ตามเมื่อฉันไปถึงขั้นตอนที่ 16 ฉันไม่สามารถบอกได้อย่างแท้จริงว่าเขาต้องการให้ฉันทำอะไร ตอนแรกฉันได้รับ DATAKEEPER dave บัญชีผู้ใช้ Full Control ไปยัง RuntimeBroker แต่ไม่สามารถแก้ไขปัญหาได้ สุดท้ายฉันเลือก "ใช้ค่าเริ่มต้น" กับทั้งสามสิทธิ์และแก้ไขปัญหา ฉันไม่แน่ใจว่าเหตุใดจึงเกิดขึ้น ฉันคิดว่าฉันดีกว่าเขียนมันทั้งหมดลงในกรณีที่เกิดขึ้นอีกครั้งเพราะเอาฉันในขณะที่จะคิดออก
ขั้นตอนที่ 4 – ใช้การปรับใช้อัตโนมัติ
ถ้าคุณต้องการเปิดใช้งานการแจ้งเตือนเดียวกันในหลายระบบให้ส่งออกงานของคุณไปยังไฟล์ XML และนำเข้าในระบบอื่น ๆ ของคุณ หรือดียิ่งกว่านี้ ทำให้การนำเข้าเป็นส่วนหนึ่งของกระบวนการสร้างของคุณโดยใช้สคริปต์ Powershell หลังจากทำไฟล์ XML ของคุณพร้อมกับแชร์ไฟล์ดังที่แสดงในตัวอย่างต่อไปนี้
PS C: > ลงทะเบียน-ScheduledTask-Xml (รับเนื้อหา '\ myfileshare tasks DataKeeperAlerts.xml' | ออกสตริง) -TaskName "DataKeeperAlerts" - ผู้ใช้ datakeeper dave -Password MyDomainP @ 55W0rd -Force
เรียกใช้การแจ้งเตือนทางอีเมลจากเหตุการณ์ Windows โดยใช้ Windows Server 2016
ในโพสต์ต่อไปของฉันฉันจะแสดงวิธีรับการแจ้งเตือนเมื่อบริการที่ระบุเริ่มหรือหยุด แน่นอนคุณสามารถตรวจสอบ EventID 7036 จาก Service Control Monitor ได้ แต่จะแจ้งให้คุณทราบเมื่อใดก็ตามที่บริการใด ๆ เริ่มหรือหยุดลง เราจำเป็นต้องขุดลึกขึ้นเล็กน้อยเพื่อให้แน่ใจว่าเราได้รับแจ้งเฉพาะเมื่อบริการที่เราสนใจเกี่ยวกับการเริ่มต้นหรือหยุดเท่านั้น หากคุณสนใจในบทความเกี่ยวกับวิธีใช้ของเราเช่นการแจ้งเตือนอีเมลแจ้งเตือนจากเหตุการณ์ Windows โดยใช้ Windows Server 2016 ให้คลิกที่นี่ ทำซ้ำจาก Clusteringformeremortals.com