واحدة من أكثر العقبات شيوعًا عند الاستعلام عن Active Directory باستخدام PowerShell هي كيفية بناء بناء جملة البحث بشكل صحيح. يعتبر Filter
ومعلمات LDAP Filter على جميع أوامر وحدة ActiveDirectory PowerShell صندوقًا أسودًا للعديدين.
في هذه المدونة، سنقوم بالتنقيب بعمق في فهم كيفية استخدام فلاتر Active Directory. آمل أن تكون قد تجاوزت استخدام Where-Object
وتصفية بشكل صحيح بحلول نهاية هذه المقالة!
المتطلبات الأساسية
لأي من الشيفرات التي سأقدمها لك أن تعمل، سأفترض بعض الأمور:
- أنك قد قمت بتثبيت وحدة PowerShell ActiveDirectory
- أنك على كمبيوتر منضم إلى نطاق
- أنك تستطيع بنجاح الاتصال والمصادقة على مراقب نطاق AD
هناك لغتين مختلفتين للفلاتر يمكنك استخدامهما عند البحث عن الكائنات باستخدام العديد من أوامر 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
. إذا كنت ترغب في العثور على جميع المستخدمين المطابقين لاسم معين، يمكنك استخدام:
يمكن أن تكون أسماء الخصائص اسمًا أو اسم تصفية 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، يظهر ذلك بوضوح؛ فقط الخدمات المهنية معروضة.
عن طريق استخدام معرف قاعدة التوافق، أو معلمة RecursiveMatch
، ستجد أنهم أعضاء غير مباشرين في جميع الأقسام تتشارك في الوصول. وذلك لأن مجموعة الخدمات المهنية هي عضو في جميع الأقسام تتشارك في الوصول.
كلاهما يعيدان النتائج التالية:
معلمات SearchBase و SearchScope
في بيئات كبيرة، يمكن أن يحتوي AD على الآلاف من الكائنات. طريقة لتحسين الأداء وتقليل عدد الكائنات المسترجعة لأي استعلام هي تحديد نطاق البحث.
تحدد معلمة SearchBase
مكان بدء البحث في تسلسل AD. عند استخدام cmdlets، يكون هذا تمثيل سلسلة لاسم مميز (وبشكل افتراضي هو ‘أعلى’ النطاق). هناك أيضا ثلاثة مستويات لمعلمة SearchScope
:
- Base – الكائن الذي تم تحديده كـ SearchBase.
- OneLevel – يبحث عن الكائنات الموجودة فورًا بواسطة SearchBase وليس في أي حاويات فرعية.
- SubTree – يبحث عن الكائنات الموجودة بواسطة SearchBase وفي أي حاويات فرعية، بشكل تكراري عبر تسلسل AD.

في المثال أعلاه، عند تعيين “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 واجني ثمار الأداء الرائع والكفاءة!