تقنيات الدليل النشط (LDAP) في باورشيل: تعلم الفلاتر الخاصة بها أثناء تعلم الإدارة النشطة (AD)

واحدة من أكثر العقبات شيوعًا عند الاستعلام عن Active Directory باستخدام PowerShell هي كيفية بناء بناء جملة البحث بشكل صحيح. يعتبر Filter ومعلمات LDAP Filter على جميع أوامر وحدة ActiveDirectory PowerShell صندوقًا أسودًا للعديدين.

في هذه المدونة، سنقوم بالتنقيب بعمق في فهم كيفية استخدام فلاتر Active Directory. آمل أن تكون قد تجاوزت استخدام Where-Object وتصفية بشكل صحيح بحلول نهاية هذه المقالة!

المتطلبات الأساسية

لأي من الشيفرات التي سأقدمها لك أن تعمل، سأفترض بعض الأمور:

هناك لغتين مختلفتين للفلاتر يمكنك استخدامهما عند البحث عن الكائنات باستخدام العديد من أوامر Active Directory: فلاتر PowerShell وفلاتر LDAP.

فلاتر PowerShell

تستخدم فلاتر PowerShell بناء جمل البحث بناءً على بنية تعبير PowerShell القياسية. يُشار إليها عادة باسم بنية فلتر البحث في Active Directory.

يتم استخدام هذه الفلاتر مع معلمة Filter. بنية معلمة Filter هي

المشغلين

أثناء بناء مرشح للمعلمة Filter، ستحتاج إلى استخدام مشغل واحد على الأقل. المشغلات المستخدمة هنا هي المشغلات المألوفة التي قد تكون معتادًا عليها عند استخدام أوامر مثل Where-Object.

داخل معلمة Filter، يمكنك استخدام المشغلات التالية.

Operator Explanation
-eq Equal to
-le Less than or equal to
-ge Greater than or equal to
-ne Not equal to
-lt Less than
-gt Greater than
-approx Approximately equal to
-bor Bitwise OR
-band Bitwise AND
-recursivematch Recursive match
-like Like
-notlike Not like
-and Boolean AND
-or Boolean OR
-not Boolean NOT

الرجوع إلى خصائص AD للكائن

داخل المرشح، ستقارن بين خصائص مختلفة لكائنات AD باستخدام المشغلات. على سبيل المثال، تُرجع الأمر Get-AdUserGet-AdUser خاصية Name. إذا كنت ترغب في العثور على جميع المستخدمين المطابقين لاسم معين، يمكنك استخدام:

PS51> Get-Aduser -Filter "Name -eq 'Adam Bertram'"

يمكن أن تكون أسماء الخصائص اسمًا أو اسم تصفية LDAP للخاصية المُرجعة باستخدام أمر AD.

تُلف أقيمة الخصائص عادة بعلامات اقتباس مفردة أو مزدوجة. النجمة (*) هي الرمز الوحيد المقبول كحركة مرنة. يمكنك أن ترى أعلاه أن المرشح محاط بعلامات اقتباس مزدوجة ومع ذلك تحيط Adam Bertram بعلامات اقتباس مفردة.

يجب ‘تهريب’ بعض الأحرف عند استخدامها في المرشحات. هذه هي:

Character Escaped As Notes
`” Only required if the data is enclosed in double quotes.
\’ Only required if the data is enclosed in single quotes.
NUL \00 This is a standard LDAP escape sequence.
\ \5c This is a standard LDAP escape sequence.
* \2a Automatically escaped. Only in -eq and -ne comparisons. You should use -like and -notlike operators for wildcard comparison.
( /28 Automatically escaped.
) /29 Automatically escaped.
/ /2f Automatically escaped.

ما هو LDAP في Active Directory؟

LDAP، أو Lightweight Directory Access Protocol، هو بروتوكول للوصول وتعديل البيانات في الدليل بشكل محايد للبائعين. قد تفكر في دليل الهاتف عند سماعك لكلمة “دليل”، ولكن في سياق Active Directory، يعني ذلك الكثير. يتم تخزين أنواع مختلفة من الكائنات وتوفير إمكانية الوصول إليها بواسطة Active Directory باستخدام بروتوكول LDAP كوسيلة للوصول إلى تلك البيانات.

نظرًا لأن Active Directory يمكنه تخزين العديد من أنواع البيانات المختلفة، فإن التطبيقات والمستخدمين بحاجة إلى وسيلة للاستعلام عن تلك الدليل بسهولة. تابع القراءة لمعرفة كيفية مساعدة تصفية LDAP في تصفية تلك البيانات!

تصفية LDAP

تقوم Active Directory بتنفيذ LDAP، وهو بروتوكول الوصول إلى الدليل بشكل خفيف. يسمح لك استخدام معلمة LDAPFilter مع أوامر cmdlets باستخدام تصفيات LDAP، مثل تلك التي تم إنشاؤها في أداة إدارة مستخدمي Active Directory.

تم تعريف بنية تصفيات LDAP في رقم RFC 4515.

يتم فصل كل قاعدة تصفية بين قوسين ( ). يمكن تجميع قواعد التصفية بتوسيع المجموعة بوضعها في قوسين وتضمين مقارن من بين:

Operator Function
& and
| or
! not

تحتوي تصفيات LDAP أيضًا على قاعدة تطابق خاصة بمعرفات الكائن (OIDs):

OID Purpose
1.2.840.113556.1.4.803 Bitwise AND
1.2.840.113556.1.4.804 Bitwise OR
1.2.840.113556.1.4.1941 Chain matching (for distinguished name attributes)

هناك أربعة أنواع لقواعد التصفية:

Operator Explanation
= Equal to
~= Approximately equal to
>= Greater than or equal to
<= Less than or equal to

هناك أربعة أنواع للعناصر:

Type Explanation
= Simple
=* Present
=something* Substring
Extensible varies depending on type

يجب استخدام قواعد تصفية LDAP مع أسماء LDAP للسمات، ويجب أن تتم “التعويض” عن قيم الأحرف المعينة إذا استخدمت في تصفية LDAP. هذه القيم هي:

Character Escaped As
* \2a
( \28
) \29
\ \5c
NUL \00

قيم الخصائص المستخدمة للمقارنة عادة لا تحتاج إلى أن تكون محاطة بعلامات اقتباس.

أمثلة على تصفية LDAP

بناء تصفيات LDAP يمكن أن يكون تحديًا. فيما يلي بعض الأمثلة باستخدام تصفيات مجموعة الدلائل النشطة التي يمكنك استخدامها كقاعدة للبدء في إنشاء تصفياتك الخاصة.

  • جميع المجموعات التي تحمل اسم (cn) ‘قسم الخدمات المهنية’

    'cn -eq "قسم الخدمات المهنية"' or `'(cn=قسم الخدمات المهنية)'

  • جميع المجموعات التي تحمل اسم ‘قسم الخدمات المهنية’ ووصفها ‘مباشر’

    '(cn -eq "قسم الخدمات المهنية") -and (description -eq "مباشر")' or '(&(cn=قسم الخدمات المهنية)(description=مباشر))'

  • جميع المجموعات التي تحمل اسم ‘قسم الخدمات المهنية’ أو ‘وصول مشترك لجميع الأقسام’

    '(cn -eq "قسم الخدمات المهنية") -or (cn -eq "وصول مشترك لجميع الأقسام")' or '(|(cn=قسم الخدمات المهنية)(cn=وصول مشترك لجميع الأقسام))'

  • جميع الفرق التي لا تحتوي على وصف ‘Live’. تشمل تلك التي ليس لديها حقل وصف على الإطلاق

    '(!(description=Live))'

  • جميع الفرق التي لا تحتوي على وصف ‘Live’. تستبعد تلك التي ليس لديها حقل وصف على الإطلاق

    'description -ne "Live"'

  • جميع الفرق التي تحتوي على وصف ‘Live’ ولكن ليس بأسم ‘Professional Services Department’

    '(description -eq "Live") -and (cn -ne "Professional Services Department")' أو '(&(description=Live)(!(cn=Professional Services Department)))'

  • جميع الفرق التي يكون وصفها ‘\\fileserver1\fileshare’

    'description -eq "\5c\5cfileserver1\5cfileshare"' أو '(description=\5c\5cfileserver1\5cfileshare)'

استخدام RecursiveMatch أو Chain Matching

استخدام قاعدة تطابق OID، أو معلمة RecursiveMatch هو وسيلة قوية لحل سؤال يُطرح كثيرًا حول استعلام AD: ‘كيف يمكنني معرفة جميع الفرق التي يعتبر فيها المستخدم عضوًا، سواء مباشرة أم غير مباشرة؟’ تستخدم خاصية Active Directory Search Filter memberOf للكشف عن ذلك.

باستخدام قاعدة توافق LDAP البسيطة يمكن أن يكون أكثر كفاءة من استخدام سكريبت كبير. باستخدام مثال النطاق لدينا domain.local، كريستين دياز هي عضو مباشر في مجموعة الأمان لقسم الخدمات المهنية. عند النظر إلى خاصية memberOf في AD، يظهر ذلك بوضوح؛ فقط الخدمات المهنية معروضة.

PS51> Get-ADUser -Identity Kristin.Diaz -Property memberOf

DistinguishedName : CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local
Enabled           : True
GivenName         : Kristin
MemberOf          : {CN=Professional Services Department,OU=All Groups,DC=domain,DC=local}
Name              : Diaz Kristin
ObjectClass       : user
ObjectGUID        : 04fe6336-c541-4e71-b7ed-6fee7db23482
SamAccountName    : Kristin.Diaz
SID               : S-1-5-21-447422785-3715515833-3878445295-1186
Surname           : Diaz
UserPrincipalName :

عن طريق استخدام معرف قاعدة التوافق، أو معلمة RecursiveMatch، ستجد أنهم أعضاء غير مباشرين في جميع الأقسام تتشارك في الوصول. وذلك لأن مجموعة الخدمات المهنية هي عضو في جميع الأقسام تتشارك في الوصول.

PS51> Get-ADGroup -LDAPFilter '(member:1.2.840.113556.1.4.1941:=CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local)'
PS51> Get-ADGroup -Filter 'member -RecursiveMatch "CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local"'

كلاهما يعيدان النتائج التالية:

DistinguishedName : CN=All Departments Share Access,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : All Departments Share Access
ObjectClass       : group
ObjectGUID        : 8ac0e0b7-9225-40a4-b168-a0330960e182
SamAccountName    : All Departments Share Access
SID               : S-1-5-21-447422785-3715515833-3878445295-1254

DistinguishedName : CN=Professional Services Department,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : Professional Services Department
ObjectClass       : group
ObjectGUID        : a8432583-7cac-4e8e-8d94-51e1c5bb1989
SamAccountName    : Professional Services Department
SID               : S-1-5-21-447422785-3715515833-3878445295-1255

معلمات SearchBase و SearchScope

في بيئات كبيرة، يمكن أن يحتوي AD على الآلاف من الكائنات. طريقة لتحسين الأداء وتقليل عدد الكائنات المسترجعة لأي استعلام هي تحديد نطاق البحث.

تحدد معلمة SearchBase مكان بدء البحث في تسلسل AD. عند استخدام cmdlets، يكون هذا تمثيل سلسلة لاسم مميز (وبشكل افتراضي هو ‘أعلى’ النطاق). هناك أيضا ثلاثة مستويات لمعلمة SearchScope:

  1. Base – الكائن الذي تم تحديده كـ SearchBase.
  2. OneLevel – يبحث عن الكائنات الموجودة فورًا بواسطة SearchBase وليس في أي حاويات فرعية.
  3. SubTree – يبحث عن الكائنات الموجودة بواسطة SearchBase وفي أي حاويات فرعية، بشكل تكراري عبر تسلسل AD.
Example OU Structure

في المثال أعلاه، عند تعيين “SearchBase” إلى OU=All User Accounts,DC=domain,DC=local، ستحاول SearchScope بقيمة Base الاستعلام عن كائن OU نفسه، وستقوم SearchScope بقيمة OneLevel بالبحث في OU All User Accounts فقط، وستقوم SearchScope بقيمة SubTree بالبحث في OU All User Accounts و OU Professional Services.

الملخص

يجب أن يكون لديك الآن فهم جيد لكيفية التصفية باستخدام أدوات سطر الأوامر لـ Active Directory PowerShell. يمكنك أن ترى أن هناك الكثير في صياغة بنية التصفية المثالية. إنه أصعب بكثير بناء تصفية مناسبة من استخدام cmdlet Where-Object.

ولكن قم بقضاء الوقت في تعلم الطريقة “الصحيحة” لتصفية كائنات Active Directory واجني ثمار الأداء الرائع والكفاءة!

قراءة إضافية

Source:
https://adamtheautomator.com/ldap-filter/