PowerShell WMI: أتمم المهام في نظام Windows

وكانت إدارة نظام التشغيل (WMI) حاضرة لفترة طويلة في نظام التشغيل Windows. لقد استخدم العديد من محترفي تكنولوجيا المعلومات WMI سواء مباشرة أو باستخدام أدوات تقوم بقراءة المعلومات من WMI. هل تعلم أن Cmdlets PowerShell WMI مدمجة؟

WMI هو المكان الافتراضي لجمع المعلومات حول جهاز Windows وللتلاعب في مختلف الخدمات داخل Windows. بفضل مجموعة المعلومات الواسعة التي يوفرها WMI، يمكنك الوصول إليها باستخدام Powershell WMI. استخدام PowerShell لاستجواب WMI يتيح لك أتمتة الآلاف من المهام على أجهزة الكمبيوتر بنظام Windows.

لحسن الحظ، كانت واحدة من أولى الأنظمة في Windows التي كانت لديها أوامر PowerShell لـ WMI. نظرًا لأن لديك Cmdlets PowerShell WMI الأصلية، فإن هذا يعني أن مسؤول تكنولوجيا المعلومات يمكنه الاستفادة من بنية PowerShell سهلة الفهم بفعل استفهام WMI و، كما سترى، يمكن للمستخدمين المتقدمين أيضًا استدعاء أحداث وفئات WMI مباشرة فقط باستخدام أوامر PowerShell القياسية.

Cmdlets PowerShell WMI مقابل CIM

هناك “مجموعتان” من الأوامر عند استخدام WMI في PowerShell. يشير بعض الأشخاص إلى هذه “المجموعتين” كـ “الطريقة القديمة” للتفاعل مع WMI و Cmdlets CIM. عند استعلام المعلومات من WMI، يقوم كل منهما بإرجاع نفس المعلومات ولكن بطريقة مختلفة قليلاً. الطريقة “القديمة” لقراءة المعلومات من WMI هي باستخدام الأمر Get-WmiObject. تشمل Cmdlets WMI الأخرى مثل Invoke-WmiMethod، Register-WMIEvent وما إلى ذلك ولكننا لن نغطي هذه في مقالنا.

أمر cmdlet WMI لـ PowerShell Get-WmiObject يعمل ولكن لديه عيب خطير. عند الاستعلام عن أجهزة الكمبيوتر عن بُعد ، يعتمد على DCOM وكان DCOM في التاريخ نقطة هجوم للأشخاص السيئين. عادةً ما يتم حظر DCOM بواسطة مختلف جدران الحماية. لأن هذه هي الطريقة “القديمة” ، فلن نتطرق إلى هذه الطريقة. بدلاً من ذلك ، سنركز على cmdlets CIM: الأساسي ، Get-CimInstance.

DCOM Component Services

الفارق الكبير بين Get-WmiObject و Get-CimInstance هو أنه بدلاً من استخدام DCOM للوصول إلى أجهزة الكمبيوتر عن بُعد ، يستخدم Get-CimInstance بروتوكول WSMAN الذي هو النقل لميزة التحكم عن بعد في PowerShell.

cmdlets 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 في PowerShell. ومع ذلك، هناك طريقة عبر استعلام 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 في PowerShell وخصوصًا استخدام أداة cmdlet WMI لـ PowerShell Get-WmiObject التي لم يتم تغطيتها هنا، أشجعك على التحقق من Get-WmiObject: الاستعلام عن WMI على أجهزة الكمبيوتر المحلية وعن بعد حيث أقدم معلومات أعمق حول WMI واستخدام أداة cmdlet Get-WmiObject.

للحصول على تفصيل كامل لجميع أوامر CIM وكيفية عملها في PowerShell ، يُرجى الرجوع إلى مقالة مقدمة في أوامر CIM على Technet. هناك ستجد جميع أوامر CIM المختلفة وكيف يمكن استخدامها في النصوص الخاصة بك.

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