מדריך המהיר שלך לעבודה עם אירועי WMI של Windows ופוורשל

האם ידעת שאתה יכול לפקוח על כמעט כל פעולה בווינדוס? לא, אין צורך לקנות תוכנה מתוחזקת. התשתית מפקחת על אירועים כמו התחלה ועצירה של שירותים, יצירת קובץ או תיקייה ועוד דרך אירועים ב-Windows Management Instrumentation (WMI).

האירועים של WMI אינם תכלית מסוימת של PowerShell, אלא אחד מהדרכים הקלות ביותר להשתמש באירועי WMI וליצור כלי שימושי עם PowerShell. במדריך הזה שלב אחר שלב, תלמד איך להפיק מועדונים מ-WMI עם PowerShell ולרכוש את המיומנויות לבניית כלים יעילים לצורך מעקב!

בוא נתחיל!

דרישות מוקדמות

יהיו הרבה הדגמות במדריך הפרקטי הזה. אם ברצונך להתעקש על כל אחת מההדגמות, הקפד לוודא שיש לך את הבא:

  • ווינדוס 7+ או Windows Server 2012+ – מדריך זה יעשה שימוש ב-Windows Server 2019.
  • מחובר כמשתמש בקבוצת המנהלים המקומית.
  • Windows PowerShell 5.1 או PowerShell 6+ – מדריך זה יעשה שימוש ב-PowerShell v7.1.2.

הבנה של WMI ו-CIM

לפני שתתחיל באירועי WMI, חשוב להבין את התשתית עליה הם מבוססים. אף שמדובר במדריך שאינו חוקר לעומק ב-WMI, תמיד תוכל להסתכל על תיעוד WMI של מיקרוסופט כדי לדעת עוד.

WMI ודגם הנתונים הקשור Common Information Model (CIM) הם דגמים המובנים בחלונות המאחסנים כל חלק כמעט של מידע במאגר שאליה זקוקים לפעולתם הפנימית של חלונות ולמה שפעיל עליו.

WMI ו-CIM הם כלים עוצמתיים שמנהלי מערכות משתמשים בהם כדי לנהל את חלונות המערכת גם באופן מקומי ו-מרוחק. באמצעות WMI או CIM, מנהלי מערכות יכולים לשאול מידע במערכת Windows כמו יישומים מותקנים, מצב שירות, קבצים במערכת הקבצים וכל מה שאחר.

WMI ו-CIM הם הדרך בה הרבה פתרונות לניטור עסקי מציבים מידע על בריאות מערכת ההפעלה והיישומים. אך אין צורך לרכוש כלי ניטור יקר כדי לנצל את WMI; יש לך את PowerShell!

בואו נתחיל עם שני הרכיבים הבסיסיים, וככל שנמשיך תלמדו את שאר הרכיבים הדרושים:

  • קבוצות: הקבוצות הן האירועים והמאפיינים שהיישום, כמו PowerShell, יכול לקרוא להם ולעדכן מידע. הקבוצות ממוקמות בתוך שם מרחב.
  • שם מרחב: שם המרחב הוא ארגז כלים לקבוצות הקשורות ל-WMI. תחשבו על זה כתיקיית My Picture המחזיקה תוכן הקשור לתמונות. ישנם מרחבי שמות מרובים, והנפוצים ביותר הוא CIMv2 שמחזיק את רוב הקבוצות של מערכת ההפעלה. אך, כל השמות מרחב ממוקמים תחת השם מרחב היחיד הגדול Root.
WMI Architecture

WMI מול CIM

שתי השפות WMI ו-CIM הן שני שיטות להתקשר עם המאגר במערכת Windows המכילה המון מידע ולעבוד עם אירועי WMI (יותר על זה אחר כך). אך, יש להם כמה הבחנות, בעיקר בדרך שבה מנהלי המערכת מתקשרים איתם מרחוק.

WMI התחיל עם Windows NT4 והיה הדרך המקורית (והיחידה) להתקשר עם המאגר. כאשר אתה מנהל מערכת Windows עם WMI, Windows משתמשת ב־Distributed Component Object Model (DCOM). DCOM הוא פרוטוקול רחוק ש-WMI משתמשת בו כדי לחשוף מידע בתוך מאגר הנתונים במחשב Windows.

כדי לעבוד מעל רשת, DCOM משתמשת ב־Remote Procedure Call (RPC). כדי לתקשר מעל רשת, RPC משתמשת בטווחי פורט דינמיים, שזה לפעמים אתגר לגדר חומות אש והתקני Network Address Translation (NAT).

אם יש לך בעיות עם RPC, תבדוק את המאמר בדיקת חיבורי RPC עם פורטים דינמיים.

microsoft החליטה לנצל את cim כדי לספק גישה מודרנית יותר לאינטראקציה עם מאגר הנתונים ב-windows. במקום rpc, cim משתמשת ב־ws-man (web-service for management), פרוטוקול http המתאים הרבה יותר לניהול מרחוק.

במהלך מאמר זה ומאמרים אחרים, wmi ו-cim עשויים להיות בשימוש באופן חליפי. השיטות לניהול שבהן פועלים שני הכלים נקראות באופן כללי מאגר wmi. כמעט כל המונחים מתייחסים ל-wmi, בעוד ש-cim נקראת בדרך כלל בקודי powershell.

wmi נגד cim ו-powershell

מזל שיש לך אפשרויות כשמדובר ב-wmi ו-cim עם powershell. powershell תומך בשתי הדרכים לאינטראקציה עם מאגר הנתונים. כאשר אתה מפעיל את הפקודה get-command ב-powershell, ייתכן ותזהה פקודות שונות כמו get-wmiobject, invoke-wmimethod, remove-wmiobject, register-wmievent ו־set-wmiinstance.

אם אתה מפעיל powershell בגרסה 3 או יותר (שכן כדאי!), תראה גם פקודות בשמות דומים כמו get-ciminstance, get-cimclass ו־remove-ciminstance.

אילו פקודות powershell כדאי לך להשתמש בהן? התשובה פשוטה; פקודות cim. cim היא התקן חדש שבו מתמקדת microsoft. פקודות wmi אפילו לא זמינות ב-powershell core!

שאילתא ב-WMI: היסודות

לפני שתוכל להיכנס לאירועי WMI, עליך להבין איך לשאול שאילתות ב-WMI עם PowerShell. שאילתא של מידע ממאגר ה-WMI היא השימוש הנפוץ ביותר בנתוני WMI.

כדי לשאול נתוני WMI בעולם ה-PowerShell, ה-Get-CimInstance cmdlet הוא חברך. ל-cmdlet הזה יש כמה דרכים שונות לשאול נתוני WMI. אבל, המדריך הזה יתמקד בפרמטר Query. הפרמטר Query מאפשר לך לספק שאילתא של שפת שאילתא של Windows (WQL) לשאילתא ב-WMI.

לדוגמה, אולי תרצה למצוא את כל המופעים של WMI במחלקה Win32_Service. בדומה ל-SQL, היית משתמש בשאילתא Select * from Win32_Service, כמו שמוצג למטה. הכוכבית (*) אומרת ל-WMI להחזיר את כל התכונות של כל מופע שנמצא.

Get-CimInstance -Query 'Select * from Win32_Service'
Getting Windows Services using WMI Query

בדוגמה למעלה, מצאת את כל המופעים של כל שירות במחלקה Win32_Service, אבל מה אם אתה רוצה למצוא רק כמה? במקרה זה, היית משתמש במשפט WHERE. המשפט WHERE יוצר מסנן להחזיר רק מופעים שמתאימים לתנאי מסוים.

המילות WHERE מגידים ל-Get-CimInstance להחזיר רק מופעים שבהם מאפיין המופע תואם ערך מסוים. לדוגמה, אולי ברצונך למצוא רק את מופעי השירות שבהם המאפיין State הוא Running. אם כן, עליך להגדיר את מילת ה-WHERE Where State='Running', כפי שמוצג למטה.

Get-CimInstance -Query "Select * from Win32_Service Where State='Running'"

ניתן לראות מתחת כי Get-CimInstance החזיר רק את מופעי השירות שבהם המאפיין State שווה ל-Running.

Returning only service that are in Running state

אירועי WMI: הפעולות של WMI

WMI מכיל כספרייה גדולה של מידע על אלפי פריטים במערכת ההפעלה Windows. ניתן להשיג את המידע הזה על ידי שאילתתו כפי שעשית קודם, אך יש לו גם תכונה נוספת פחות ידועה; אירועי WMI.

במערכת ההפעלה Windows, בכל נקודה בזמן, עשרות אירועים עשויים להתרחש. כאשר אתה משתמש בתכונות שונות של Windows כגון יצירת קבצים, עצירה והתחלת שירותים, התקנת תוכנות או כל פעולה אחרת, כנראה שאירוע WMI מתקבל.

כמעט כל פעולה שנעשית במערכת ההפעלה Windows יכולה להיות גלויה דרך אירוע WMI. כאשר פעולה נעשית במערכת ההפעלה Windows, Windows מפעיל אירוע דרך התשתית הפנימית שלו. באופן ברירת מחדל, אין אפשרות לראות את האירועים הללו; הם קורים ברקע. כדי לראות את האירועים הללו, עליך להירשם אליהם.

בניית סקריפט לניטור שירות עם PowerShell

כדי להדגים איך פעולות WMI עובדות, במקום לשעמם אותך עם המון מידע, נבנה במקום כלי שימושי. מאחר שאירועי WMI מתרחשים כאשר אירוע מתרחש במערכת ההפעלה Windows, ניתן ליצור כלים לניטור שימושיים באמצעותם.

אולי תרצה לכתוב הודעה לקובץ לוג כאשר מצב שירות Windows משתנה בשרת קריטי. לאחר מכן, תוכל להירשם לאירועי WMI שמפעילים פעולות כאשר הן קורות. כאשר אתה נרשם לאירוע והאירוע מפעיל, תוכל לבצע פעולה כמו התעדכות לקובץ, שליחת אימייל או כל דבר אחר שאתה יכול לעשות עם PowerShell.

במקום לקנות פתרון יקר לניטור, סקריפט פשוט של PowerShell יכול להיות כלי יעוץ יומיומי נהדר! אם אתה מוכן, פתח את חלון הפקודה של PowerShell שלך, ובוא נתחיל!

מציאת כיתת CIM

בתוך WMI, כמו המופעים הסטטיים, האירועים מכילים מחלקות. אלו המחלקות מכילות את כל הנתונים הסטטיים ששאלת למעלה והמקום שבו מתרחשים שינויים למופעים אלו. ניתן למצוא רשימת כל מחלקות CIM במסמכי Microsoft.

כדי למצוא את כל מחלקות CIM, הפעל את Get-CimClass בלעדי פרמטרים. הפקודה Get-CimClass, כברירת מחדל, מחזירה את כל המחלקות באזור השמור ROOT/cimv2. האזור ROOT/cimv2 הוא האזור "הראשי" שבו נשמרות כמעט כל המחלקות המעניינות של Windows.

Get-CimClass

אפשר לראות למטה אולם, שמחזירות הרבה מחלקות.

Finding the CIM Class

אולי עשית קצת חקירה וסוף סוף הבנת ששירותי Windows נשמרים כולם בתוך Win32_Service. אז, כשאתה יודע את שם המחלקה, השתמש בפרמטר ClassName כדי לציין את השם, כפי שמוצג למטה.

Get-CimClass -ClassName Win32_Service
Get CimClass Parameter

מציאת מאפייני המחלקה CIM

כשאתה יודע לאיזה מחלקה לגשת, אתה חייב להבין איזה מאפיין לחפש. כאשר ערך של מאפיין מצב שונה (או שהתקבל או הוסרה כל המופע), אירוע מתרחש. עליך ללכוד את שינוי המצב הזה. כדי לעשות זאת, עליך לדעת איזה מאפיין זה אתה רוצה למפוקח.

כדי למצוא את המאפיין הזה, בדוק את המאפיינים של אובייקט התכנה PowerShell CimClassProperties על המופע של מחלקת CIM ששאלת עליה בחלק הקודם.

(Get-CimClass -ClassName win32_Service).CimClassProperties

שים לב שמתוך המאפיינים הללו ניתן לראות שהמאפיין הוא State.

Some of the Win32_Service Properties

עכשיו שאתה יודע איזו מחלקת CIM ואיזה מאפיין אתה רוצה למפוקח, זמן להירשם לאירוע WMI!

בניית הרשמה לאירוע WMI: מבט כללי

לבניית הרשמה לאירוע WMI יכול להיות משימה מבלבלת אם לא יצרת כזו לפני. כדי לעזור לך לשמור על הפעולות ישרות, נתחיל תחילה בלסכם את השלבים הבסיסיים.

יצירת הרשמה לאירוע WMI דורשת ארבעה שלבים גסים:

  1. יצירת שאילתת WQL – בדיוק כמו בעת שאילתת נתונים סטטיים, עליך ליצור שאילתת WQL שתתאים לסוג של אירוע WMI שתרצה לראות. אך, להבדיל משאילתת האחסון, עליך להשתמש בכמה מרכיבים מורכבים יותר בשאילתה, כמו מחלקות מערכת ובדיקת מחזורים (עוד על כך מאוחר יותר).
  2. יצירת מסנן האירוע – לאחר שיצרת את שאילתת ה-WQL, עליך ליצור את מסנן האירוע. מסנן האירוע מרשה את שאילתת ה-WQL ב-CIM.
  3. יצירת הצרכן – הצרכן מגדיר את הפעולה שיש לבצע כאשר שאילתת מסנן האירוע מחזירה שינוי במחלקה. לדוגמה, בכל פעם שמצב השירות מתחיל, מופסק, נוצר או מוסרק, הצרכן מפעיל פעולה.
  4. חיבור מסנן האירוע לצרכן – הדבק שמחבר את שאילתת WMI של Windows לצרכן. הקישור הוא מה שמודיע לצרכן כאשר מסנן האירוע קיבל התאמה.

כאשר אתה מצרף כל אחד מהפריטים הללו יחד, אתה יוצר מינוי.

Basic example of a WMI event subscription

יצירת שאילתת WQL

A WQL query for a WMI event looks a bit different than performing a simple query with Get-CimInstance. Below you’ll find a typical WMI event query.

Select * from <system class> within <checking cycle> where TargetInstance ISA '<class name>'

מאחר ששאילתת ה-WQL עשויה להיראות מפחידה בתחילה, בואו נפרק אותה ונבין כיצד כל רכיב פועל.

מחלקת המערכת

בדוגמת Get-CimInstance, גילית שתרצה לקבל התראה כאשר שינוי במופע במחלקת Win32_Service נעשה. עדיין נדרשת לך מחלקה זו, אך במקום שאילתת WQL שנראית כמו זו:

Select * from Win32_Service

במקום זאת, השאילתה תתחיל כך. המחלקה הראשית שאתה שואל עליה אינה המחלקה שמכילה את המופע שברצונך לקבל הודעה עליו. במקום זאת, המחלקה היא מחלקת מערכת.

Select * from <system class>

מחלקות המערכת הן מחלקות פנימיות שמייצגות את הסוג של שינוי שהאירוע גורם. ל-WMI יש ארבעה סוגי מחלקות מערכת:

  • InstanceModificationEvent בודקת שינויים בערכי מאפיינים של מופע במחלקה. זו המחלקה שבה תשתמש מכיוון שברצונך למונוטר ערך מאפיין בשם Status במופע (שירות) של מחלקה Win32_Service.
  • InstanceCreationEvent – בודקת יצירת מופעים חדשים. לדוגמה, אם ברצונך למונוטר יצירת שירותות חדשות, יש להשתמש במחלקה זו.
  • InstanceDeletionEvent – בודקת הסרת מופעים. לדוגמה, אם ברצונך למונוטר שירותות שהוסרו, יש להשתמש במחלקה זו.
  • InstanceOperationEvent – מחלקה זו בודקת לכל סוגי האירועים, שינוי, יצירה ומחיקה.

לסקריפט המוניטורינג שלנו, ההתחלה של שאילתת ה-WQL תיראה כך:

Select * from __InstanceModificationEvent

שמות כיתות מערכת WMI תמיד מתחילים בשני מקפים תחתונים (__) ואחריהם שם הכיתה.

מחזור הבדיקה

לאחר מכן, יש לך את מחזור הבדיקה. מחזור הבדיקה כולל את המילה המפתחית בתוך וערך המייצג אינטרוול סקר שמיוצג בשניות.

within <checking cycle>

אירועי WMI אינם בזמן אמת, לכן עליך להגדיר אינטרוול מסוים להרשמה שלך כדי לבדוק שינויים. אם, לדוגמה, אתה מגדיר את מחזור הבדיקה ל-10, ההרשמה תבדוק לשינוי מהמחזור הקודם לסקירה כל 10 שניות. אם נמצא שינוי, זה יפעיל את הצרכן.

אם מופע משתנה, נוצר או מוסר תלוי בכיתת המערכת בתוך אינטרוול הסקירה, השינוי לא יזוהה! שקול את התדירות שאתה זקוק אליה אך ורק וודא שהיא ידידותית למעבד ולזיכרון!

לדוגמת שירות המדריך לניטור שירותי Windows, נגדיר את מחזור הבדיקה ל-10 כדי לסקור WMI כל 10 שניות לשינוי בשירות Windows. שאילתת WQL מתרחבת!

Select * from __InstanceModificationEvent within 10

המסנן

לסיום שאילתת WQL, עליך להגדיר מסנן כדי להגביל את המופעים המוחזרים מכיתת המערכת. עליך להגדיר את המסנן הזה בצורתה שלמטה. במקרה זה, הכיתה CIM שבה תרצה לנטור נקראת ה- TargetInstance.

where Targetinstance ISA '<class name>'

ISA הוא אופרטור שמחליט שאילתה לתת פעולה לכיתות המשנה של כיתה מסוימת.

מאחר שהמדריך בונה מינוי כדי לנטור שירותי Windows, תיצור את המסנן כך:

where Targetinstance ISA 'Win32_Service'

כפי שהוא, המסנן מחפש את כל המופעים של Win32_Service. אם תרצה לנטר רק תכונה יחידה, אולי שירות מסוים, היית משתמש באופרטור AND.

where Targetinstance ISA 'win32_Service' AND Targetinstance.name='bits'

האופרטורים AND או OR מוסיפים תנאים נוספים לקבלת תוצאות מדויקות יותר.

מסנן המדריך (והשאילתא כולה) כעת הושלם כפי שנראה בקטע הקוד למטה.

Select * from __InstanceModificationEvent within 10 where Targetinstance ISA 'win32_Service' AND Targetinstance.name='bits'

יצירת מסנן האירועים

כעת, כאשר יש לך את מסנן השאילתא, שאר התהליך הרבה יותר קל להבנה! עכשיו אתה חייב ליצור את מסנן האירועים כדי להשתמש בשאילתא זו. מסנן אירועים הוא למעשה מופע CIM נוסף שהוא חלק מהכיתה __EventFilter בתוך המרחב השמות Root/subscription.

למטה תוכל לראות קטע קוד עם כל מה שאתה צריך. הסקריפט מתייחס לשאילתת WQL ומשייך אותה למשתנה $FilterQuery. לאחר מכן, הוא יוצר hashtable הכוללת כל אחת מהמאפיינים והערכים הדרושים למסנן האירועים. לבסוף, הוא מפעיל את New-CimInstance cmdlet כדי ליצור את מסנן האירועים.

המופע התוצאתי של CIM נשמר במשתנה ($CIMFilterInstance) לשימוש מאוחר יותר.

$FilterQuery="Select * from __InstanceModificationEvent within 10 where TargetInstance ISA 'Win32_Service'"
$CIMEventFilterProperties = @{
	## שם המסנן אירועים. יכול להיות כל דבר קשור.
	Name="MyServiceFilter"
	## הכתובת של המחלקה הממוקדת, לדוג, המחלקה הממוקדת עבור
	## **Win32_Service** היא Root/CIMv2
	EventNameSpace="Root/CIMV2"
	## שפת השאילתא, רגילה **WQL** בדרך כלל.
	QueryLanguage="WQL"
	## השאילתא לשימוש.
	Query=$FilterQuery
}

$CIMFilterInstance=New-CimInstance -ClassName __EventFilter -Namespace "Root/SubScription" -Property $CIMEventFilterProperties

עכשיו, הרץ Get-CimInstance כדי לוודא שנוצר מופע CIM חדש של __EventFilter.

Get-CimInstance -Namespace root/subscription -ClassName __EventFilter
Event Filter Created Successfully and registered the Windows WMI Query

יצירת הצרכן

בשלב הבא, יש ליצור את הצרכן או הפעולה שתתרחש כשווינדוס מפעילה את האירוע של WMI. בעת יצירת הצרכן, יש לך מספר אפשרויות תלויות בסוג הפעולה שתרצה להפעיל.

ודא ש-ACL של הקובץ הניתן להפעלה מוגדרת כראוי כדי למנוע מישהו להחליף את ה-EXE עם קובץ תוכנה זדוני.

לצורך המדריך הזה, נשתמש בסוג צורך LogFileEventConsumer כדי לכתוב לקובץ יומן כאשר השירות המתאים בשאילתת WQL משתנה.

$CIMCOnsumerProperties = @{
	## שם הסקריפט שירשום בשטח השמות **Root/Subscription**
	Name="MyServiceConsumer"
	## נתיב הקובץ והשם שבו יוקלט הלוג כאשר האירוע נפעל.
	FileName="C:\\MyCIMMonitoring.txt"
	## הטקסט שייכתב בלוג. ניתן להוסיף משתנה באמצעות השימוש
	## ב-%TargetInstance.WMIProperty%. בדוגמה זו, משתמשים ב-%Caption% וה-%State
	##**.
	Text = "The Service %TargetInstance.Caption% has been Changed: %TargetInstance.State%"
}
$CIMEventConsumer=New-CimInstance -ClassName LogFileEventConsumer -Namespace 'ROOT/subscription' -Property $CIMCOnsumerProperties

## דוגמאות לצרכנים אחרים
######################
## NTEventLogEventConsumer
######################
## $Template = @(
##	השירות %TargetInstance.Caption% שונה: %TargetInstance.State%'
##)
##$CIMCOnsumerProperties=@{
## ## שם הצרכן
##	Name="MyEventLogConsumer"
## ## מזהה האירוע לשימוש
##	EventID =[UInt32] 7040
##  EventType יכול להחזיק את אחת הערכים הבאים
##    ## - **0**: אירוע מוצלח
##    ## - **1**: אירוע שגיאה
##    ## - **2**: אירוע אזהרה
##    ## - **4**: אירוע מידע
##    ## - **8**: אירוע הצלחה בפעם הבאה
##    ## - **16**: אירוע כשלון בפעם הבאה
##  EventType=[UInt32] 1 #מידע
## ## שם מקור האירוע.
##  SourceName="מנהל שליטה של שירות"
##  Category=[UInt16] 0
##  ## מספר שורות של **InsertionStringTemplates**
##  NumberOfInsertionStrings =[UInt32] $Template.Length
##  ## הודעת הטקסט שתוצג ברשומת Windows EventLog.
##  InsertionStringTemplates = $Template
##}
## $CIMEventConsumer=New-CimInstance -ClassName NTEventLogEventConsumer -Namespace 'ROOT/subscription' -Property $CIMCOnsumerProperties

######################
## CommandLineEventConsumer
######################
## $CIMCOnsumerProperties=@{
##  ## שם ייחודי לצרכן.
##	Name="MyStartAppConsumer"
##  ## הנתיב והפרמטרים ליישום שמיועד להתחיל כאשר האירוע נפעל.
##	CommandLineTemplate ='pwsh.exe c:\\myscript.ps1 -ServiceName %TargetInstance.name% -NewState %TargetInstance.State%'
##  ## (אופציונלי) לסיים את היישום לאחר מספר שניות מוגדר. זה מועיל להגנה על משאבי השרת שלך.
##  ## KillTimeout = 5 
##}
##$CIMEventConsumer=New-CimInstance -ClassName CommandLineEventConsumer  -Namespace 'ROOT/subscription' -Property $CIMCOnsumerProperties

######################
## SMTPEventConsumer
######################
## גוף ההודעה בדוא"ל
## $Message= 'שינוי בשרת הקבצים %Targetinstance.Name%, %TargetInstance.Status%'

## $CIMCOnsumerProperties=@{
##	Name="MyService-EmailConsumer"
##	## כתובת הדוא"ל של השולח.
##	FromLine ='[email protected]'
##	## כתובת הדוא"ל של הנמען.
##	ToLine = '[email protected]'
##	## שרת SMTP להעברת ההודעה אליו.
##	SMTPServer = 'MySMTPServer.MyDomain.Com'
##	## נושא ההודעה
##	Subject = 'שינוי בשרת הקבצים...'
##	Message= $Message
##}
##$CIMEventConsumer=New-CimInstance -ClassName SMTPEventConsumer   -Namespace 'ROOT/subscription' -Property $CIMCOnsumerProperties

כל מחלקת צרכן יש את הפרמטרים שלה, לכן יש לבדוק את CimClassProperties לקבלת מידע נוסף על כל מחלקה, לדוג: (Get-CimClass -ClassName __NTEventLogEventConsumer).CimClassProperties.

ברגע שיצרת את הצרכן, שוב, יש לוודא את קיומו באמצעות Get-Ciminstance.

Get-CimInstance -Namespace Root/Subscription -ClassName LogFileEventConsumer
Consumer Registered with the required parameters

קישור של מסנן האירועים והצרכן יחד

לבסוף, הגיע הזמן להשלים את ההרשמה הזו ולקשור את מסנן האירועים והצרכן יחד! כפי שתיהיה לך תחושה, יצירת הקישור משמעה יצירת מופע CIM נוסף. הפעם עליך ליצור מופע חדש במחלקת __FilterToConsumerBinding.

קטע הקוד למטה משתמש בשני המופעים שנוצרו לפני כן (המסנן והצרכן) כקובץ רשות שמגדיר את המאפיינים הנחוצים ליצירת מופע חדש. לאחר מכן הוא מועבר ל־New-CimInstance כפי שעשינו קודם כן כדי ליצור את הקישור.

$CIMBindingProperties=@{
	Filter = [Ref]$CIMFilterInstance
	Consumer = [Ref]$CIMEventConsumer
}

$CIMBinding = New-CimInstance -ClassName __FilterToConsumerBinding -Namespace "root/subscription" -Property $CIMBindingProperties

כמו תמיד, יש לוודא שהקישור נוצר על ידי הרצת Get-CimInstance שוב.

Get-CimInstance -Namespace Root/Subscription -ClassName __FilterToConsumerBinding

כפי שניתן לראות, לקישור יש מידע על שני המרכיבים – ה־Filter וה־Consumer.

Binding Details

בדיקת ההרשמה

סוף סוף סיימת! הגיע הזמן לבדוק את פרות יגיעך! הדבר היחיד שעליך לעשות כעת הוא לשנות את מצב שירות ה-BITS כדי לראות אם PowerShell יכתוב ערך לקובץ הלוג ב־C:\MyCIMMonitoring.txt.

תלוי במצב של שירות ה-BITS, יש לעצור אותו, להתחיל אותו או פשוט לאתחל אותו באמצעות הפקודה Restart-Service.

Get-Service -Name BITS | Restart-Service

המתן כ-10 שניות ובדוק את C:\MyCIMMonitoring.txt. כעת אתה אמור לראות את הText בקובץ הלוג שהגדרת בעת יצירת הצרכן שלך.

Get-Content -Path C:\MyCIMMonitoring.txt
Service Changes are detected

כדי לצפות בכל הפעילות של אירועי WMI, בדוק את לוג האירועים של Windows בנתיב "יישומים ושירותים\Microsoft\Windows\WMI-Activity\Operational".

עצירה וניקוי ההרשמה

כאשר סיימת עם ההרשמה, זה הזמן לנקות אותה. כדי לעצור ולהסיר את ההרשמה לאירועי WMI, עליך להסיר את המסנן, הצרכן וההתחברות לכללי האירוע.

הסר את המסנן או הצפנה ראשית על ידי מציאת המופע עם Get-CimInstance.

Get-CimInstance -Namespace Root/Subscription -ClassName __EventFilter | Remove-CimInstance

## למספר רב של מופעים
Get-CimInstance -Namespace Root/Subscription -ClassName __EventFilter | where {$.name -like "MyServiceFilter"} | Remove-CimInstance
Registered EventFilter

בשלב הבא, הסר את הצרכן באותו אופן.

Get-CimInstance -Namespace Root/Subscription -ClassName LogFileEventConsumer | Remove-CimInstance

## למספר רב של מופעים
Get-CimInstance -Namespace Root/Subscription -ClassName LogFileEventConsumer | where {$_.Name -like "MyServiceConsumer"} | Remove-CimInstance
Getting Consumer from the LogFileEventConsumer Class

לבסוף, הסר את הצמיג. המאפיין למציאת הצמיג הוא קצת שונה. במקום המאפיין Name, לצמיג יש מאפיין Filter שכן בעצם אובייקט עם מאפיין Name.

Get-CimInstance -Namespace Root/Subscription -ClassName __FilterToConsumerBinding | Where-Object {$_.Filter.Name -like "MyServiceFilter"} | Remove-CimInstance
Getting the Binding information.

סיכום

WMI/CIM הוא מערכת שימושית ועוזרת למערכת הפעלה Windows ולניטור אותה עם אירועי WMI. ניטור שינויים עם אירועי WMI נותן לך דמיה טובה ותגובה מהירה לבעיות אפשריות, ומקל על האוטומציה של תגובה לכל אירוע.

לדוגמה מצוינת בעולם האמית: בדוק את איך למעקב אחרי שינויים ב-Active Directory עם אירועי WMI.

Source:
https://adamtheautomator.com/your-goto-guide-for-working-with-windows-wmi-events-and-powershell/