ما هو Windows PowerShell وماذا يأكل؟ الجزء 5: الوصول إلى كائنات خارجية



تدعم أنظمة تشغيل Windows مجموعة متنوعة من البنى التحتية للكائنات. يمكنك استخدام واجهات برمجة التطبيقات (APIs) للوصول إليها ، ولكن تطوير التطبيقات الكاملة ليس مبررًا دائمًا. يحتوي PowerShell على أوامر cmdlets خاصة تسمح لك بالوصول إلى كائنات .NET و COM و WMI (CIM) و ADSI بشكل تفاعلي. في الجزء الرابع من السلسلة ، تعلمنا الأساسيات مع التركيز على فئات .NET Core ، والآن نريد تعميق الموضوع وفهم ميزات تفاعل PowerShell مع الكائنات الخارجية.

جدول المحتويات:


العمل مع JSON، XML وCSV
العمل مع WMI وCIM
العمل مع COM كائنات
العمل مع خدمة الدليل ADSI
تنسيق الإخراج

العمل مع JSON و XML و CSV


في البرامج النصية لـ PowerShell ، غالبًا ما يتعين عليك تحليل بيانات JSON و XML و CSV. عادة ما تنشأ هذه الحاجة عند العمل مع خدمات الإنترنت أو مع ملفات التكوين. يحاول بعض المسؤولين تحليل البيانات باستخدام التعبيرات العادية ، ولكن ليس من الضروري تقديم مثل هذه التضحيات: لدى PowerShell أوامر cmdlets خاصة للتحويل ، علاوة على ذلك ، في كلا الاتجاهين.



يتيح لك تنسيق JSON وصف مجموعة متنوعة من العناصر ، وهو في الأساس قابل للتجزئة يمكن تضمينه. من السهل تحويل كائن JSON إلى كائن .NET وفقًا لذلك باستخدام PowerShell. نظرًا لأن خدمات الإنترنت عادة ما تعطي سطرًا طويلًا جدًا بدلاً من ملف منسق بشكل جميل ، يمكن أن يكون هذا التحويل مفيدًا أيضًا للعمل في الوضع التفاعلي. في المثال أدناه ، استخدمنا متغير نص متعدد الأسطر لوصف كائن JSON:

$user = @"
{
   "firstName": "Ivan",
   "lastName": "Danko",
   "address": {
       "streetAddress": "Kremlin",
       "city": "Moscow"
   },
   "phoneNumbers": [
       "+7 495 1234567",
       "+7 499 1234567"
   ]
}
"@ | ConvertFrom-Json



يتم حل المشكلة العكسية بطريقة مماثلة:

$file = Get-ChildItem C:\Windows\System32\notepad.exe
$file.VersionInfo | ConvertTo-Json



من السهل إرسال سلسلة تنسيق JSON الناتجة إلى تطبيق آخر عبر الشبكة. يمكن أن تكون ، على سبيل المثال ، بعض الخدمات RESTful. تم تصميم العمل مع ConvertFrom-Csv و ConvertTo-Csv و ConvertTo-Xml cmdlets بالطريقة نفسها تقريبًا ، نقترح على القراء دراستها بشكل مستقل.

للعمل مع XML و CSV ، سنحتاج إلى أوامر cmdlets أخرى:



باستخدام هذه الأدوات ، عليك أن تفهم أن تحويل كائن ثنائي إلى تنسيق نصي يحفظ فقط قيمة خصائصه ، ولكن ليس الطرق. لا يمكن تحويل بيانات JSON أو XML أو CSV إلى كائن .NET باستخدام PowerShell إلا إذا كانت صالحة.

العمل مع WMI و CIM


يعد Windows Management Instrumentation (WMI) تطبيقًا مطورًا من قبل Microsoft ومتكيفًا مع Windows لمعيار WBEM (إدارة المشاريع المستندة إلى الويب). ويستند إلى فكرة إنشاء حل عالمي لرصد بيئة المعلومات الموزعة للمؤسسة وإدارة مكوناتها. ويعتمد هيكل بيانات WBEM بدوره على نموذج المعلومات المشتركة (CIM) ، الذي يطبق نهجًا موجهًا نحو الكائنات لتمثيل أنظمة الكمبيوتر. تم إيقاف المزيد من التطوير والدعم لـ WMI في Windows ؛ توصي Microsoft باستخدام آلية مماثلة لإدارة البنية التحتية - كائنات CIM. للعمل معهم ، ظهرت أوامر cmdlets الخاصة في PowerShell 3.0 ، والتي سننظر فيها بالتوازي مع نظيرات WMI. إذا احتوى الرمز على مكالمات cmdlet للعمل مع WMI ، فيجب إعادة كتابته إن أمكن.



في إطار نموذج CIM (يتم استخدامه أيضًا في WMI) ، يتم تقديم بيانات نظام التشغيل في شكل فئات ذات خصائص وطرق. يتم تجميع الفصول بترتيب هرمي وترتبط منطقياً بتقنية مساحة الاسم أو منطقة الإدارة. توجد مساحة اسم جذر الجذر تحتوي على مسافات فرعية: CIMv2 و Default و Secutiry و WMI. من أجل التعرف الواضح على مثيل لفئة (كائن) ووصف لحالة المورد المقابل ، يتم استخدام خصائص الفئة ، والتي عادة ما تكون للقراءة فقط. يتم استخدام الأساليب لإدارة المورد.

يمكن الوصول إلى مثيل الفئة من خلال المسار الكامل ، الذي يحتوي على النموذج التالي:

[\\ComputerName\NameSpace][:ClassName][.KeyProperty1=Value1][,KeyProperty2=Value2]…]

حيث
ComputerName هو اسم الكمبيوتر ؛
NameSpace - مساحة الاسم ؛
ClassName - اسم الفئة ؛
KeyProperty1 = Value1، KeyProperty2 = Value2 - خصائص الكائن والقيم التي يتم من خلالها تحديده.

قبل PowerShell ، لم تكن هناك أداة WMI بسيطة. للوصول إلى الكائنات ، كان عليك كتابة برامج معقدة إلى حد ما بلغات عالية المستوى (C ++ ، Visual Basic ، Java Script) أو دراسة قذيفة WMIC (سطر أوامر WMI ، والتي تم إيقافها أيضًا) بلغتها الخاصة. من خلال PowerShell ، يمكن الوصول إلى كائنات WMI للمستخدم العادي من سطر الأوامر أو في البرامج النصية. أولاً ، اتصل بالنظام الفرعي WMI واحصل على قائمة بالفئات المتاحة باستخدام Get-WmiObject cmdlet (الاسم المستعار gwmi). للحصول على قائمة بفصول CIM ، استخدم Get-CimClass cmdlet.

Get-CimClass
Get-WmiObject -List



قمنا بإدراج الفئات على الكمبيوتر المحلي ، ولكن يمكنك الاتصال بجهاز التحكم عن بُعد:

Get-CimClass -ComputerName IP- 
Get-CimClass -ComputerName _

أو

Get-WmiObject -ComputerName IP- -List
Get-WmiObject -ComputerName _ -List

بشكل افتراضي ، يتصل cmdlets Get-CimClass و Get-WmiObject بمساحة الاسم Root \ CIMV2 ، التي تخزن عددًا كبيرًا من الفئات لإدارة النظام. لتغيير مساحة الاسم ، استخدم المعلمة -Namespace:

Get-CimClass -Namespace Root
Get-WmiObject -Namespace Root -List

بمعرفة اسم الفصل ، ليس من الصعب الحصول على أمثلة منه. يقوم الأمر التالي بإرجاع كافة مثيلات Win32_Service ، أي الخدمات المسجلة على الجهاز المحلي:

Get-WmiObject Win32_Service

كما هو الحال مع الأنواع الأخرى من الكائنات ، يتم عرض قائمة الخصائص والأساليب باستخدام Get-Member. يمكن الوصول إلى طرق كائن WMI مباشرة أو باستخدام Invoke-WmiMethod cmdlet. يمكنك أيضًا استخدام أوامر cmdlets لكائنات WMI للفرز والتصفية والتجميع وما إلى ذلك.

Get-WmiObject Win32_Service | Get-Member



للحصول على كائنات CIM (مثيلات الفئات) ، استخدم Get-CimInstance cmdlet. على عكس WMI ، لا تحتوي كائنات CIM الناتجة (كائن ناتج أو مثيلات فئة) على أساليب فئة. نظرًا لأنه لا يمكنك استخراج طريقة مباشرة ، يجب عليك استدعاء الأمر Invoke-CimMethod cmdlet. خذ بعين الاعتبار فئة Win32_Service - الخدمات التي تعمل على النظام) ومثيلها لخدمة التخزين المؤقت على الجهاز المحلي:

Get-CimInstance Win32_service -filter "Name='spooler'" 



دعونا نلقي نظرة على بنية الكائن الناتج:

Get-CimInstance Win32_service -filter "Name='spooler'" | Get-Member



عند هذه النقطة ، فوائد cmdlets للعمل مع كائنات CIM ليست واضحة. تتعلق في المقام الأول بالعمل عن بعد في بيئة موزعة وسيتم مناقشتها بالتفصيل في المقالة الأخيرة في السلسلة المخصصة لحل المشاكل العملية للإدارة.

هناك أيضًا مجموعة أدوات خاصة بـ WMI: لغة الاستعلام WMI (WQL) ، وهي لغة استعلام شبيهة بـ SQL. يبدو استعلام WQL للبحث عن كافة الشركات الناشئة عند بدء تشغيل نظام الخدمة كما يلي:

select * from win32_service where startmode="Auto"

من PowerShell ، يتم تنفيذها على النحو التالي:

Get-WmiObject -Query 'select * from win32_service where startmode="Auto"'



العمل مع كائنات COM


لضمان التفاعل بين التطبيقات في Windows ، تم تطوير تقنية لربط الكائنات وتضمينها (ربط الكائنات وتضمينها أو OLE). في وقت لاحق ، ظهرت تقنية أتمتة OLE ، بمساعدة تطبيقات عملاء الأتمتة التي يمكنها استدعاء وظائف التطبيقات الأخرى - خوادم الأتمتة. اعتمد كل من OLE و OLE Automation على التقنية الأساسية لنموذج كائن المكون (COM) ، الذي يقدم معيارًا ثنائيًا واحدًا لمكونات البرامج. يمكن استخدام الكائنات التي تم إنشاؤها باستخدامها وتسجيلها في نظام التشغيل في تطبيقات أخرى باستخدام ملفات قابلة للتنفيذ أو مكتبات ديناميكية.

حول منتصف التسعينات ، بدلاً من OLE ، بدأ استخدام مصطلح آخر - ActiveX. قبل ظهور النظام الأساسي .NET ، كانت تقنية ActiveX تعتبر أساسية ، ولا تزال كائنات COM تستخدم بنشاط لدمج التطبيقات في Windows - العديد من منتجات Microsoft والجهات الخارجية هي خوادم الأتمتة وتوفر الوصول إلى خدماتها من خلالهم. للوصول إلى الكائنات ، يتم استخدام ProgID - معرف رمزي يتم تعيينه لها عند التسجيل في سجل Windows. لديها الشكل التالي:

_..

عادة لا يتم الإشارة إلى الإصدار:

_.

بعض الأمثلة على ProgIDs المتاحة هي: InternetExplorer.Application (تطبيق Internet Explorer) ، Word.Application (تطبيق Microsoft Word) ، WScript.Shell (فئة Shell من Windows Script Host أو WSH طراز كائن خادم البرنامج النصي).

يمكنك إنشاء مثيل للكائن باستخدام أمر cmdlet New-Object الذي تمت مناقشته في المقالة السابقة ، والاطلاع على هيكله باستخدام Get-Member:

$myshell = New-Object -ComObject WScript.Shell
$myshell | Get-Member



للعمل مع الأشياء ، يتم استخدام الخصائص والأساليب. لنفترض ، لإنشاء اختصار على سطح مكتب المستخدم ، تحتاج إلى استدعاء الأسلوب CreateShortcut ():

$link = $myshell.CreateShortcut("$Home\Desktop\Home.lnk")

لاحظ أن الاختصار هو أيضًا كائن COM:

$link | Get-Member



يبقى لنا أن نملأ خصائصه ونوفر:

$link.TargetPath = $Home
$link.Save()

بهذه الطريقة ، أنشأنا اختصارًا على سطح مكتب المستخدم النشط ، والآن سنحلل العمل مع خدمات الأتمتة الخارجية باستخدام مثال كائن Shell.Application COM. باستخدامه ، يمكنك أتمتة بعض الإجراءات في مستكشف Windows:

$myshell=New-Object -ComObject Shell.Application

أو باختصار:

$myshell=New-Object -com Shell.Application
$myshell | Get-Member



يحتوي كائن Shell.Application على عدد قليل من طرق إدارة النوافذ المختلفة. على سبيل المثال ، لعرض محتويات دليل معين ، يتم استخدام Explore ():

$myshell.Explore("c:\")

يتم استدعاء نظام المساعدة باستخدام طريقة Help ():

$myshell.Help()


هناك أيضًا ثلاث طرق لاستدعاء مربعات حوار البحث: FindFiles () و FindComputer () و FindPrinter ().

$myshell.FindFiles()
$myshell.FindComputer()
$myshell.FindPrinter()

يمكنك فتح مربع حوار تشغيل البرنامج باستخدام طريقة FileRun () ، وللاتصال بنافذة إعداد التاريخ / الوقت ، تحتاج إلى طريقة SetTime (). هناك ، على سبيل المثال ، طرق لاستدعاء نافذة إعدادات شريط المهام ، وعناصر لوحة التحكم التي تشير إلى أحد ملفات cpl المتاحة ، لإدارة النوافذ المفتوحة:

$myshell.MinimizeAll()
$myshell.UndoMinimizeAll()
$myshell.TileHorizontally()
$myshell.TileVertically()

تتيح لك طريقة Windows () الوصول إلى مجموعة النوافذ المفتوحة في Explorer أو في Internet Explorer. دعونا نرى الخصائص والأساليب المتاحة لهذه المجموعة:

$myshell.Windows() | Get-Member



هناك كائنات COM أخرى مفيدة ، يعتمد عددها على البرنامج المثبت في النظام. ذات مرة ، كانت أداة الأتمتة الرئيسية في Windows هي خادم البرنامج النصي WSH ، والذي يتضمن نموذج الكائن أيضًا كائنات COM: تم تصميمه للعمل مع وظائف الشبكة لـ WScript.Network و WScript.Shell التي ذكرناها بالفعل. هذا الأخير لا يقوم فقط بإنشاء اختصارات على سطح المكتب ، بمساعدته يمكنك ، على سبيل المثال ، عرض نوافذ المعلومات مع الرسائل والأزرار ، والتبديل بين التطبيقات ، وتشغيل البرامج أو محاكاة ضغطات المفاتيح.

العمل مع خدمة ADSI Directory


بشكل عام ، يشير الكتالوج إلى مصدر المعلومات حيث يتم تخزين البيانات حول بعض الكائنات. من خلال خدمة الدليل ، نعني جزءًا من نظام كمبيوتر موزع يسمح لك بالوصول إلى الكائنات المخزنة ومعالجتها. يمكن أن تجمع خدمة الدليل بيانات حول كائنات الشبكة والخدمات التي تعالجها - فهي تمثل نقطة دخول واحدة للتفاعل مع موارد الشبكة. في شبكة الكمبيوتر غير المتجانسة ، يمكن أن يكون هناك العديد من هذه الخدمات: SAM محلي (مدير حساب الأمان) لأجهزة الكمبيوتر غير المتصلة بالمجال ، Active Directory ، إلخ.

يتطلب التفاعل مع خدمات الدليل المختلفة أدوات مختلفة ، مما يخلق بعض المضايقات. بدءًا من نظام التشغيل Windows 2000 ، قدمت Microsoft تقنية واجهة خدمة الدليل النشط الموحدة (ADSI) لأنظمة التشغيل التي لا تعتمد على بروتوكول وصول محدد للشبكة. للعثور على كائنات ، يتم تعريف مساحة اسم للدليل. لأن خدمات الدليل المختلفة تستخدم أساليب تسمية مختلفة ، يحدد ADSI اصطلاحًا يعرّف أي كائن بشكل فريد. تم تقديم مفهوم سلاسل الربط المكونة من جزأين أو ADsPath. يعرّف الجزء الأول من الاسم خدمة الدليل (موفر ADSI) ، والثاني - موقع الكائن في الدليل. فيما يلي أمثلة لتعيين موفري ADSI مختلفين:

LDAP: //تستخدم لخدمات الدليل المستندة إلى LDAP ، بما في ذلك لـ Active Directory ؛

ل WinNT: // المستخدم لأجهزة الكمبيوتر المحلية.

لا توجد أوامر cmdlets خاصة للعمل مع ADSI في PowerShell. بدلاً من ذلك ، يتم استخدام عامل الإرسال [ADSI] متبوعًا بسلسلة ربط. على سبيل المثال ، للاتصال بالمستخدم Ivanov من test.ru المجال ، هناك حاجة إلى البناء التالي:

$user = [ADSI]"LDAP://CN=Ivanov,DC=TEST,DC=RU"

للعمل مع الحسابات المحلية ، سيتعين عليك الاتصال بالكمبيوتر بالاسم المقابل (للاتصال بالكمبيوتر المحلي ، ما عليك سوى استخدام النقطة بدلاً من الاسم):

$computer = [ADSI]"WinNT://."

على سبيل المثال ، قم بإنشاء مستخدم جديد ، Ivanov ، على الجهاز المحلي:

$user = $computer.Create("user","Ivanov")
$user.Put("Description","  PowerShell")
$user.SetInfo()

الآن اتصل به:

$user1 = [ADSI]"WinNT://./Ivanov,user"
$user1.Description



تنسيق الإخراج


يتطلب العمل التفاعلي غالبًا عرض البيانات. في الأصداف الأخرى ، تعمل الأوامر والأدوات المساعدة نفسها في تنسيق الإخراج ، لكن الكائنات الثنائية التي يتم إرجاعها بواسطة الوظائف وأوامر cmdlets لا تعرف عادة كيفية القيام بذلك. في PowerShell ، يتم تنسيق الإخراج بواسطة أربعة أوامر cmdlets الخاصة التي تغذي الكائنات عبر خط الأنابيب. يمكن الحصول على مزيد من المعلومات التفصيلية باستخدام Get-Help:

Format-Table ينسق الإخراج على شكل جدول تحتوي أعمدته على قيم خصائص الكائن أو القيم المحسوبة. القدرة على تجميع البيانات مدعومة ؛ يعرض

تنسيق القائمة الكائن كقائمة خصائص ، يتم عرض كل منها على سطر جديد. القدرة على تجميع البيانات مدعومة ؛

تنسيق مخصصتنسيق الإخراج باستخدام طريقة عرض مخصصة ؛

تنسيق تنسيق واسع للكائنات في شكل جدول عريض يتم فيه عرض خاصية واحدة فقط لكل كائن.

إذا لم يتم استدعاء أي من أوامر cmdlets المدرجة ، يتم استخدام وحدة التنسيق المناسبة لنوع البيانات المعروضة. يتم تخزين قواعد العرض في ملفات التكوين بتنسيق XML بالملحق .ps1xml ، الموجود في دليل $ PSHome. يمكن الحصول على قائمة منهم باستخدام الأمر التالي:

dir $pshome\*format*.ps1xm

لا يُنصح بتحرير ملفات التكوين يدويًا ؛ من الأفضل إنشاء ملفاتك الخاصة وتضمينها في قائمة الملفات التي تم تنزيلها باستخدام الأمر Update-FormatData cmdlet. إذا لم يتم تعريف المنسق الافتراضي للنوع الذي تريده ، يعرض PowerShell خصائص الكائن على الشاشة في قائمة.

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



1: Windows PowerShell
2: Windows PowerShell
3: ,
4: ,


All Articles