האם ידעת שאתה יכול לפקוח על כמעט כל פעולה בווינדוס? לא, אין צורך לקנות תוכנה מתוחזקת. התשתית מפקחת על אירועים כמו התחלה ועצירה של שירותים, יצירת קובץ או תיקייה ועוד דרך אירועים ב-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 מול 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 להחזיר את כל התכונות של כל מופע שנמצא.

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

אירועי 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.
אפשר לראות למטה אולם, שמחזירות הרבה מחלקות.

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

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

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

יצירת שאילתת 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.
מאחר ששאילתת ה-WQL עשויה להיראות מפחידה בתחילה, בואו נפרק אותה ונבין כיצד כל רכיב פועל.
מחלקת המערכת
בדוגמת Get-CimInstance
, גילית שתרצה לקבל התראה כאשר שינוי במופע במחלקת Win32_Service
נעשה. עדיין נדרשת לך מחלקה זו, אך במקום שאילתת WQL שנראית כמו זו:
במקום זאת, השאילתה תתחיל כך. המחלקה הראשית שאתה שואל עליה אינה המחלקה שמכילה את המופע שברצונך לקבל הודעה עליו. במקום זאת, המחלקה היא מחלקת מערכת.
מחלקות המערכת הן מחלקות פנימיות שמייצגות את הסוג של שינוי שהאירוע גורם. ל-WMI יש ארבעה סוגי מחלקות מערכת:
- InstanceModificationEvent – בודקת שינויים בערכי מאפיינים של מופע במחלקה. זו המחלקה שבה תשתמש מכיוון שברצונך למונוטר ערך מאפיין בשם
Status
במופע (שירות) של מחלקהWin32_Service
. - InstanceCreationEvent – בודקת יצירת מופעים חדשים. לדוגמה, אם ברצונך למונוטר יצירת שירותות חדשות, יש להשתמש במחלקה זו.
- InstanceDeletionEvent – בודקת הסרת מופעים. לדוגמה, אם ברצונך למונוטר שירותות שהוסרו, יש להשתמש במחלקה זו.
- InstanceOperationEvent – מחלקה זו בודקת לכל סוגי האירועים, שינוי, יצירה ומחיקה.
לסקריפט המוניטורינג שלנו, ההתחלה של שאילתת ה-WQL תיראה כך:
שמות כיתות מערכת WMI תמיד מתחילים בשני מקפים תחתונים (__) ואחריהם שם הכיתה.
מחזור הבדיקה
לאחר מכן, יש לך את מחזור הבדיקה. מחזור הבדיקה כולל את המילה המפתחית בתוך
וערך המייצג אינטרוול סקר שמיוצג בשניות.
אירועי WMI אינם בזמן אמת, לכן עליך להגדיר אינטרוול מסוים להרשמה שלך כדי לבדוק שינויים. אם, לדוגמה, אתה מגדיר את מחזור הבדיקה ל-10, ההרשמה תבדוק לשינוי מהמחזור הקודם לסקירה כל 10 שניות. אם נמצא שינוי, זה יפעיל את הצרכן.
אם מופע משתנה, נוצר או מוסר תלוי בכיתת המערכת בתוך אינטרוול הסקירה, השינוי לא יזוהה! שקול את התדירות שאתה זקוק אליה אך ורק וודא שהיא ידידותית למעבד ולזיכרון!
לדוגמת שירות המדריך לניטור שירותי Windows, נגדיר את מחזור הבדיקה ל-10 כדי לסקור WMI כל 10 שניות לשינוי בשירות Windows. שאילתת WQL מתרחבת!
המסנן
לסיום שאילתת WQL, עליך להגדיר מסנן כדי להגביל את המופעים המוחזרים מכיתת המערכת. עליך להגדיר את המסנן הזה בצורתה שלמטה. במקרה זה, הכיתה CIM שבה תרצה לנטור נקראת ה- TargetInstance
.
ISA
הוא אופרטור שמחליט שאילתה לתת פעולה לכיתות המשנה של כיתה מסוימת.
מאחר שהמדריך בונה מינוי כדי לנטור שירותי Windows, תיצור את המסנן כך:
כפי שהוא, המסנן מחפש את כל המופעים של Win32_Service
. אם תרצה לנטר רק תכונה יחידה, אולי שירות מסוים, היית משתמש באופרטור AND
.
האופרטורים AND או OR מוסיפים תנאים נוספים לקבלת תוצאות מדויקות יותר.
מסנן המדריך (והשאילתא כולה) כעת הושלם כפי שנראה בקטע הקוד למטה.
יצירת מסנן האירועים
כעת, כאשר יש לך את מסנן השאילתא, שאר התהליך הרבה יותר קל להבנה! עכשיו אתה חייב ליצור את מסנן האירועים כדי להשתמש בשאילתא זו. מסנן אירועים הוא למעשה מופע CIM נוסף שהוא חלק מהכיתה __EventFilter
בתוך המרחב השמות Root/subscription
.
למטה תוכל לראות קטע קוד עם כל מה שאתה צריך. הסקריפט מתייחס לשאילתת WQL ומשייך אותה למשתנה $FilterQuery
. לאחר מכן, הוא יוצר hashtable הכוללת כל אחת מהמאפיינים והערכים הדרושים למסנן האירועים. לבסוף, הוא מפעיל את New-CimInstance
cmdlet כדי ליצור את מסנן האירועים.
המופע התוצאתי של CIM נשמר במשתנה ($CIMFilterInstance
) לשימוש מאוחר יותר.
עכשיו, הרץ Get-CimInstance
כדי לוודא שנוצר מופע CIM חדש של __EventFilter
.

יצירת הצרכן
בשלב הבא, יש ליצור את הצרכן או הפעולה שתתרחש כשווינדוס מפעילה את האירוע של WMI. בעת יצירת הצרכן, יש לך מספר אפשרויות תלויות בסוג הפעולה שתרצה להפעיל.
- ActiveScriptEventConsumer – מפעיל סקריפט בשפת סקריפטינג רעיונית כמו VBscript.
- CommandLineEventConsumer – מתחיל תהליך
ודא ש-ACL של הקובץ הניתן להפעלה מוגדרת כראוי כדי למנוע מישהו להחליף את ה-EXE עם קובץ תוכנה זדוני.
- LogFileEventConsumer – יוצר יומן טקסט.
- NTEventLogEventConsumer – כותב אירוע ליומן האירועים של Windows.
- SMTPEventConsumer – שולח דוא"ל.
לצורך המדריך הזה, נשתמש בסוג צורך LogFileEventConsumer
כדי לכתוב לקובץ יומן כאשר השירות המתאים בשאילתת WQL משתנה.
כל מחלקת צרכן יש את הפרמטרים שלה, לכן יש לבדוק את
CimClassProperties
לקבלת מידע נוסף על כל מחלקה, לדוג:(Get-CimClass -ClassName __NTEventLogEventConsumer).CimClassProperties
.
ברגע שיצרת את הצרכן, שוב, יש לוודא את קיומו באמצעות Get-Ciminstance
.

קישור של מסנן האירועים והצרכן יחד
לבסוף, הגיע הזמן להשלים את ההרשמה הזו ולקשור את מסנן האירועים והצרכן יחד! כפי שתיהיה לך תחושה, יצירת הקישור משמעה יצירת מופע CIM נוסף. הפעם עליך ליצור מופע חדש במחלקת __FilterToConsumerBinding
.
קטע הקוד למטה משתמש בשני המופעים שנוצרו לפני כן (המסנן והצרכן) כקובץ רשות שמגדיר את המאפיינים הנחוצים ליצירת מופע חדש. לאחר מכן הוא מועבר ל־New-CimInstance
כפי שעשינו קודם כן כדי ליצור את הקישור.
כמו תמיד, יש לוודא שהקישור נוצר על ידי הרצת Get-CimInstance
שוב.
כפי שניתן לראות, לקישור יש מידע על שני המרכיבים – ה־Filter
וה־Consumer
.

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

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

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

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

סיכום
WMI/CIM הוא מערכת שימושית ועוזרת למערכת הפעלה Windows ולניטור אותה עם אירועי WMI. ניטור שינויים עם אירועי WMI נותן לך דמיה טובה ותגובה מהירה לבעיות אפשריות, ומקל על האוטומציה של תגובה לכל אירוע.
לדוגמה מצוינת בעולם האמית: בדוק את איך למעקב אחרי שינויים ב-Active Directory עם אירועי WMI.
Source:
https://adamtheautomator.com/your-goto-guide-for-working-with-windows-wmi-events-and-powershell/