אחת מהבעיות הנפוצות ביותר בעת שאילתת Active Directory עם PowerShell היא כיצד לבנות בצורה תקינה תחביר לסינון. משתני ה-Filter
ו- LDAP Filter בפקודות ה- cmdlets של מודול ה-ActiveDirectory ב-PowerShell הם קופסה שחורה לרבים.
בפוסט הזה, אנו הולכים לחקור עמוק להבנה של כיצד להשתמש בפילטרים של Active Directory. אני מקווה שבסוף הפוסט, לא תנסו עוד להשתמש ב-Where-Object
ובסינון נכון!
דרישות קדם
כדי שכל הקוד שאני הולך להציג יעבוד, אני מניח כמה דברים:
- יש לך את מודול ה-ActiveDirectory של PowerShell מותקן
- אתה נמצא במחשב המצוטט לדומיין
- יש לך את היכולת להתחבר ולאמת לשרת של נוהל ה-AD
ישנם שני לשוני פילטר שאפשר להשתמש בהם כאשר מחפשים אובייקטים באמצעות רוב ה-cmdlets של 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-AdUser
מחזירה את מאפיין ה-Name
. אם תרצה למצוא את כל המשתמשים התואמים לשם מסוים, יש לך להשתמש ב:
שמות המאפיינים יכולים להיות השם או שם המסנן של המאפיין שמוחזר עם פקודת ה-AD.
ערכי המאפיינים מסתובבים בדרך כלל בין גרשיים יחידים או גרשיים כפולים. התו הכוכב (*) הוא התו הכללה היחיד שנקלט.אדם ברטרם מוקף בגרשיים יחידים למרות שהמסנן מוקף בגרשיים כפולים.
יש להפריד בין תווים מסוימים שחייבים להישאר 'מחולקים' כאשר הם בשימוש במסננים. אלו הם:
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, הפרוטוקול לגישה לספרייה קלה (Lightweight Directory Access Protocol). באמצעות הפרמטר LDAPFilter עם הפקודות האפשרות להשתמש בסינוני LDAP, כמו אלה שנוצרו ב-Active Directory Users and Computers.
התחביר של סינוני 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. אלה הם: assistant:
Character | Escaped As |
---|---|
* | \2a |
( | \28 |
) | \29 |
\ | \5c |
NUL | \00 |
ערכי הנכסים להשוואה לא צריכים להיות מסובכים בצורת מרכאות.
דוגמאות למסנני LDAP
בניית מסנני LDAP יכולה להיות אתגר. הנה כמה דוגמאות לשימוש במסנני קבוצות של Active Directory כנקודת התחלה ליצירת מסננים משלך.
- כל הקבוצות עם שם (cn) 'מחלקת שירותים מקצועיים'
'cn -eq "מחלקת שירותים מקצועיים"'
או `'(cn=מחלקת שירותים מקצועיים)'
- כל הקבוצות עם שם 'מחלקת שירותים מקצועיים' ותיאור 'חי'
'(cn -eq "מחלקת שירותים מקצועיים") -וגם (description -eq "חי")'
או'(&(cn=מחלקת שירותים מקצועיים)(description=חי))'
- כל הקבוצות עם שם 'מחלקת שירותים מקצועיים' או 'כל המחלקות חולקות גישה'
'(cn -eq "מחלקת שירותים מקצועיים") -או (cn -eq "כל המחלקות חולקות גישה")'
או'(|(cn=מחלקת שירותים מקצועיים)(cn=כל המחלקות חולקות גישה))'
- כל הקבוצות שאין להם תיאור של 'חי'. כולל אלה שאין להם שדה תיאור בכלל
'(!(description=חי))'
- כל הקבוצות שאין להם תיאור של 'חי'. מיילגר אלה שאין להם שדה תיאור בכלל
'description -ne "חי"'
- כל הקבוצות עם תיאור של 'חי' אך לא עם שם של 'מחלקת שירותים מקצועיים'
'(description -eq "חי") -and (cn -ne "מחלקת שירותים מקצועיים")'
או'(&(description=חי)(!(cn=מחלקת שירותים מקצועיים)))'
- כל הקבוצות שהתיאור שלהן הוא '\\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 מציג זאת; רק מחלקת שירותים מקצועיים מוצגת.
על ידי שימוש בכלל ההתאמה OID, או בפרמטר RecursiveMatch
תמצא שהם חברים באופן עקיף ב־כל המחלקות משתפות גישה. זה בגלל שקבוצת מחלקת שירותים מקצועיים היא חברה ב־כל המחלקות משתפות גישה.
שניהם מחזירים את הבא:
הפרמטרים SearchBase ו־SearchScope
בסביבות גדולות, ב־AD יכול להכיל אלפי עצמים. דרך לשפר את הביצועים ולהפחית את מספר העצמים המוחזרים לשאילתה כלשהי היא להגדיר את החיפוש.
הפרמטר SearchBase
מקבע איפה בהיררכיית ה־AD מתחיל כל חיפוש. בעת השימוש ב־cmdlets, זהו מיוצג מחרוזת של שם מסובך (וכברירת מחדל הוא ה'ראש' של התחום). יש שלושה רמות של SearchScope
:
- Base – העצם שצוין כ־SearchBase.
- OneLevel – מחפש עצמים המוכלים מיידית על ידי ה־SearchBase אך לא בכלי אחסון משניים.
- SubTree – מחפש עצמים המוכלים ב־SearchBase ובכלי אחסון משניים, באופן רקורסיבי בהיררכיית ה־AD.

בדוגמה שלמעלה, כאשר ה-SearchBase מוגדר ל-OU=כל החשבונות של המשתמש,DC=domain,DC=local, עם SearchScope
של בסיס
ינסה לשאול את אובייקט ה-OU עצמו, SearchScope
של OneLevel
יחפש את OU של כל החשבונות של המשתמש בלבד, ו-SearchScope
של SubTree
יחפש בשני ה-OUים, גם ב-כל החשבונות של המשתמש וגם ב-שירותים מקצועיים.
סיכום
כעת אמור לך להיות ברור איך לסנן באמצעות כלי כגון Active Directory PowerShell. ניתן לראות שיש הרבה בניית תחביר הסינון המושלמת הזו. זה קשה יותר לבנות את הסינון המתאים מאשר להשתמש ב-cmdlet של Where-Object
.
אך שווה להשקיע זמן בלמידה של הדרך 'נכונה' לסנן את אובייקטי ה-AD ולקבור את התמורות של ביצוע ויעילות מעולה!