פוורשל WMI: אוטומציה של משימות Windows

Windows Management Instrumentation (WMI) קיים כבר מזמן במערכת ההפעלה Windows. הרבה מומחי IT השתמשו ב-WMI באופן ישיר או השתמשו בכלים שקוראים מידע מה-WMI. הידעת שה-cmdlets של PowerShell WMI מובנים?

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

במזל רע, אחד המערכות הראשונות ב-Windows שהייתה ל-PowerShell פקודות עבורה הייתה WMI. מאחר שיש לך cmdlets טבעיים של PowerShell WMI, זה אומר שמנהל מערכת IT יכול לנצל את תחביר ה-verb/noun של PowerShell שקל להבין כדי לפעול עם WMI וכפי שתראה, משתמשים מתקדמים יכולים גם להפעיל אירועים ומחלקות של WMI ישירות רק באמצעות פקודות סטנדרטיות של PowerShell.

cmdlets של PowerShell WMI נגד CIM

ישנם שני "סטים" של פקודות כאשר מדובר בשימוש ב-WMI ב-PowerShell. חלק מהאנשים מתייחסים ל-"סטים" הללו כדרך "ישנה" לפעול עם WMI ול-cmdlets של CIM. כאשר משאירים מידע מ-WMI, שני הסטים מחזירים את אותו המידע אך מתקרבים אליו מעט בצורה שונה. הדרך "הישנה" לקרוא מידע מ-WMI היא על ידי שימוש בפקודת Get-WmiObject. cmdlets אחרים של WMI כוללים Invoke-WmiMethod, Register-WMIEvent וכו' אך לא נכסה על אלו במאמר שלנו.

פקודת ה- WMI של PowerShell Get-WmiObject עובדת אך יש לה מגבלה חמורה. בעת שאילתא למחשבים מרוחקים, היא מסתמכת על DCOM ו- DCOM היא נקודת התקפה היסטורית למתקפות. נקודת ה- DCOM נחסמת בדרך כלל על ידי מגני אש שונים. מכיוון שזו הדרך ה"ישנה", אנו לא נעמיק בשיטה זו. במקום זאת, נמקד בפקודות ה- CIM: ראשית, Get-CimInstance.

DCOM Component Services

ההבדל הגדול בין Get-WmiObject לבין Get-CimInstance הוא שבמקום שימוש ב- DCOM לגישה אל מחשבים מרוחקים, Get-CimInstance משתמשת בפרוטוקול WSMAN שהוא התחברות המוכרת לתכונת רימוטינג של PowerShell.

פקודות ה- CIM של PowerShell

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

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

PS> Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName DC | Select *
Status                                    : OK
Name                                      : Microsoft Windows 10 Pro|C:\WINDOWS|\Device\Harddisk0\Partition2
FreePhysicalMemory                        : 1802336
FreeSpaceInPagingFiles                    : 800308
FreeVirtualMemory                         : 1472916
Caption                                   : Microsoft Windows 2016
Description                               :
InstallDate                               : 7/5/2018 6:04:09 PM
CreationClassName                         : Win32_OperatingSystem
CSCreationClassName                       : Win32_ComputerSystem
--snip-

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

PS> Get-CimInstance -ClassName CIM_Process -ComputerName DC

ProcessId Name                                      HandleCount WorkingSetSize VirtualSize   PSComputerName
--------- ----                                      ----------- -------------- -----------   --------------
0         System Idle Process                       0           4096           65536         DC
4         System                                    631         212992         3465216       DC
232       smss.exe                                  52          823296         4325376       DC
328       csrss.exe                                 258   om      3346432        49483776      DC
392       csrss.exe                                 87          2789376        44507136      DC
400       wininit.exe                               80          3072000        2199065096192 DC
428       winlogon.exe                              119         4431872        2199079510016 DC

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

שימו לב למטה שאני משתמש בפרמטר Filter כדי לוודא שאני מקבל רק את תהליך ccmexec.exe. זה חשוב!

לאחר שלכדתם את המופע, תוכלו להפעיל את שיטת Terminate() כדי להרוג את התהליך באמצעות הפקודה Invoke-CimMethod כמו שמוצג למטה.

PS> $instance = Get-CimInstance -ClassName CIM_Process -ComputerName DC -Filter 'Name = "ccmexec.exe"'
PS> $instance

ProcessId Name        HandleCount WorkingSetSize VirtualSize PSComputerName
--------- ----        ----------- -------------- ----------- --------------
3528      CcmExec.exe 878         34246656       158261248   DC


PS> Invoke-CimMethod -InputObject $instance -MethodName Terminate

ReturnValue PSComputerName
----------- --------------
          0 DC

סיכום

אם ברצונכם ללמוד עוד על שימוש ב-WMI בפוורשל, ובמיוחד בשימוש בcmdlet של PowerShell WMI Get-WmiObject שלא נכלל כאן, אני מציע לכם לבדוק Get-WmiObject: שאילתת WMI על מחשבים מקומיים ומרוחקים שבו אני נכנס לעומק יותר ב-WMI ומשתמש בcmdlet Get-WmiObject.

לקבלת פירוט מלא של כל פקודות ה-CIM ואיך הן פועלות בפוורשל, יש להפנות למאמר Introduction to CIM Cmdlets ב-Technet. שם תוכל לראות את כל פקודות ה-CIM השונות ואיך ניתן להשתמש בהן בתסריטים שלך.

Source:
https://adamtheautomator.com/powershell-wmi/