فهم System.DirectoryServices.ResultPropertyCollection في PowerShell

عند العمل مع PowerShell واستعلام Active Directory، قد تواجه سلوكًا محيرًا عند محاولة الوصول إلى الخصائص من System.DirectoryServices.ResultPropertyCollection. في هذا المنشور، سنفكك مشكلة شائعة يتم مواجهتها عند جلب المعلومات من خلال DirectorySearcher—بشكل محدد، لماذا تنتج مخرجات مختلفة نتائج غير متوقعة. دعنا نستكشف المشكلة وجذورها وكيف يمكنك حلها بفعالية.

المشكلة

لقد قمت بإعداد سكربت PowerShell يستخدم فئة DirectorySearcher للعثور على كائنات الكمبيوتر في Active Directory، لكنك تواجه تباينات في المخرجات. إليك نسخة مبسطة من الكود الخاص بك:

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher  
$objSearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry  
$objSearcher.Filter = ("(objectclass=computer)")  
$computers = $objSearcher.findall()  

عند محاولة طباعة أسماء الكمبيوترات، تلاحظ المخرجان التاليان:

$computers | %{
    "اسم الخادم داخل علامات اقتباس $_.properties.name" 
    "اسم الخادم بدون علامات اقتباس " + $_.properties.name 
}

ثم:

$computers[0] | %{"$_.properties.name"; $_.properties.name}

تظهر النتيجة اسم النوع للخاصية عند تضمينها في علامات اقتباس (System.DirectoryServices.SearchResult.properties.name) ولكن قيمة عند عدم استخدامها. فهم هذه الفروق هو مفتاح إتقان استرجاع الخصائص في PowerShell.

لماذا تختلف المخرجات؟

ينشأ التباين من كيفية تقييم PowerShell للمتغيرات والخصائص في السلاسل. عند تضمين $_ في سلسلة، ينظر PowerShell إليه ككائن كامل:

  • سياق الاقتباس: عند استخدام ";" في السلسلة، مثل "اسم الخادم داخل علامات اقتباس $_.properties.name"، لا يقوم PowerShell بتقييم الخاصية بل يشير إلى طريقة ToString الخاصة بالكائن، والتي في هذه الحالة، تُرجع اسم النوع الخاص بالخاصية.

  • سياق غير الاقتباس: على النقيض من ذلك، عند استخدامه بدون اقتباسات، مثل "اسم الخادم بدون علامات اقتباس " + $_.properties.name، يقوم PowerShell بتقييم الخاصية أولاً ثم يجمعها مع السلسلة. وبالتالي، يسترجع القيمة الفعلية المخزنة في الخاصية بدلاً من اسم النوع.

تصحيح الناتج

لاسترجاع قيمة الخاصية المقصودة أثناء وجودك داخل سلسلة مقتبسة، يمكنك استدعاء التقييم بشكل صريح باستخدام بنية التعابير الفرعية:

"اسم الخادم داخل علامات اقتباس $($_.properties.name)"  

هذا الاستخدام لـ $() يخبر PowerShell بتقييم ما هو داخلها قبل المتابعة مع بقية السلسلة، مما يؤدي إلى الناتج الصحيح الذي توقعته.

استكشاف مجموعة خصائص النتائج

تذكر، عند العمل مع ResultPropertyCollection، أنت تتعامل مع مجموعة من الخصائص. يمكنك دائمًا استكشاف نموذج الكائن مباشرة من سطر أوامر PowerShell. على سبيل المثال، تمرير $computers[0].properties إلى Get-Member يكشف المعلومات حول الأعضاء والخصائص المتاحة:

$computers[0].properties | Get-Member

يمكنك رؤية خاصية Values، التي تسترجع ICollection من قيم الخاصية. هذه الاستكشافات تعزز فهمك وتسمح لك بالتنقل بين الخصائص بشكل أكثر فعالية.

الخاتمة

عند العمل مع PowerShell وSystem.DirectoryServices في Active Directory، من الضروري فهم كيفية عمل تقييم السلاسل على الكائنات وخصائصها. من خلال التعرف على السياقات المختلفة التي يتم فيها الوصول إلى هذه الخصائص، يمكنك تجنب الارتباك واسترجاع المعلومات التي تحتاجها بالشكل الذي تتوقعه.

قد يبدو التنقل عبر تركيبات PowerShell المعقدة مثل ResultPropertyCollection شاقًا في البداية، لكن مع الممارسة والفهم الأعمق، ستجد أنه يصبح سلوكًا ثانيًا في رحلة البرمجة الخاصة بك.