Nézzük akkor, hogy hogyan lehet más azonosító alapján szûrni a felhasználókra a Filter paraméterrel:
[46] PS C:\> Get-ADUser -Filter "userprincipalname -eq 'soostibor@r2.dom'" -Pro
perties title, department | Format-Table name, department, title
name department title
---- ---------- -----
Soós Tibor Management oktató
Látható, hogy a filter egy PowerShell szintaxissal leírt szûrõfeltételt vár. Ezeket hívjuk OPATH szûrõnek. Valójában a háttérben a PowerShell az ezekben található tulajdonságneveket átfordítja LDAP nevekké, és a feltételeket és logikai kapcsolatokat meg átfordítja az LDAP szûrõkben használatos operátorokká. Nézzük meg, hogy milyen módon:
[47] PS C:\> get-help about_ActiveDirectory_Filter
TOPIC
Active Directory Filter
SHORT DESCRIPTION
Describes the syntax and behavior of the search filter supported by the
Active Directory module for Windows PowerShell.
Supported Operators
The following table shows frequently used search filter operators.
LDAP
Operator Description Equivalent
--------------- ------------------------------ ---------------------
-eq Equal to. This will =
not support wild card
search.
-ne Not equal to. This will !x = y
not support wild card
search.
-approx Approximately equal to ~=
-le Lexicographically less than <=
or equal to
-lt Lexicographically less than !x >= y
-ge Lexicographically greater >=
than or equal to
-gt Lexicographically greater than !x <= y
-and AND &
-or OR |
-not NOT !
-bor Bitwise OR :1.2.840.113556.1.4.804:=
-band Bitwise AND :1.2.840.113556.1.4.803:=
-recursivematch Use LDAP_MATCHING_RULE_IN_CHAIN :1.2.840.113556.1.4.1941:
=
(Note: This control only works
with Windows 2008 and later.)
-like Similar to -eq and supports =
wildcard comparison. The only
wildcard character
supported is: *
-notlike Not like. Supports wild !x = y
card comparison.
Note: PowerShell wildcards, other than "*", such as "?" are not
supported by the -Filter parameter syntax.
A fenti táblázatban tehát a PowerShell - LDAP operátorok szótárát láthatjuk.
Megjegyzés
Be kell valljam, hogy az approx vagy ~= operátor mûködéséhez semmi támpontot nem találtam. Sem az LDAP-ot definiáló RFC-ben, sem sehol másutt. Így én még nem mertem használni, mondjuk nem is igazán tudnék elképzelni olyan helyzetet, ahol ez nekem jól jönne.
Különösen a bitszintû ÉS, VAGY és a rekurzív keresés operátorainál spórolunk sokat. De természetesen LDAP formátumban is megadhatunk szûrõ feltételeket:
[63] PS C:\> Get-ADUser -LDAPFilter '(userPrincipalName=soostibor@r2.dom)' -pro
perties title, department | Format-Table name, department, title
name department title
---- ---------- -----
Soós Tibor Management oktató
Ugyanúgy megtaláltuk a felhasználót, mint a [46]-os sorban.
Megjegyzés
Fontos, hogy az LDAP filternél a zárójelpár az nem elhagyható, része az LDAP szintaxisnak. Ha elhagyjuk, akkor nem kapunk hibajelzést, hanem üres halmaz lesz a kimenet.
Nézzünk pár további szûrést. Idõre szûrök, keresem a 2010. január 1. után létrehozott Soós T-szerû felhasználókat:
[69] PS C:\> $date = [datetime] "2010.01.01"
[70] PS C:\> Get-ADUser -Filter {created -gt $date -and name -like "Soós T*"} |
Format-Table name
name
----
Soós Tamás
Soós Tibor
Soós Tímea
Nézzük meg ennek egy kicsit módosított változatát, az utóbbi 35 napban létrehozott felhasználók:
[71] PS C:\> Get-ADUser -Filter {created -gt $((get-date).adddays(-35)) -and na
me -like "Soós T*"} | Format-Table name
Get-ADUser :
Variable: '' found in expression: $ is not defined.
At line:1 char:11
+ Get-ADUser
<<<< -Filter {created -gt
$((get-date).adddays(-35)) -and name -
like "Soós
T*"} | Format-Table name
+ CategoryInfo : InvalidArgument: (:) [Get-ADUser],
ArgumentExce
ption
+ FullyQualifiedErrorId : Variable: ''
found in expression: $ is not defi
ned.,Microsoft.ActiveDirectory.Management.Commands.GetADUser
Ezt nem szerette.
Megjegyzés
A szûrõben a PowerShell nem bont ki összetett kifejezéseket, csak változókat. Így mindent számoljunk ki elõre egy változóba és csak azt szerepeltessük a szûrõben.
Azaz az elõzõ példa így már mûködik:
[72] PS C:\> $date = (get-date).adddays(-35); Get-ADUser -Filter {created -gt $
date -and name -like "Soós T*"} | Format-Table name
name
----
Soós Tamás
Soós Tibor
Soós Tímea
Természetesen hasonló módon lehet keresni például csoportokat is. A következõ példában keresem a Groups szervezeti egységben létrehozott globális biztonsági csoportokat:
[1] PS C:\> Get-ADGroup -SearchBase "ou=groups,dc=r2,dc=dom" -filter {grouptype
-band 0x80000002} -properties * | ft name, grouptype, samaccounttype, groupcat
egory, groupscope
name grouptype samaccounttype groupcategory groupscope
---- --------- -------------- ------------- ----------
GS -2147483646 268435456 Security Global
Ezt a szûrõt még az LDAP emlékeim alapján raktam össze, amikor is a GroupType attribútum 2. bitje jelentette a csoport Globális jellegét, és a 32. bitje jelentette azt, hogy ez egy biztonsági csoport. Ez a két bit egyidejûleg kell, hogy érvényre jusson, ezért használtam a band operátort. Azért, hogy ne a teljes címtár adatbázisban keressek, ezért a keresés kiindulópontját a SearchBase paraméterrel korlátoztam.
Ugyanez az ActiveDirectory modul segítségével sokkal egyszerûbben és érthetõbben is megfogalmazható:
[5] PS C:\> Get-ADGroup -SearchBase "ou=groups,dc=r2,dc=dom" -filter {groupcate
gory -eq "Security" -and groupscope -eq "Global"} -properties * | ft name, grou
ptype, samaccounttype, groupcategory, groupscope
name grouptype samaccounttype groupcategory groupscope
---- --------- -------------- ------------- ----------
GS -2147483646 268435456 Security Global
Nézzük, hogyan lehet csoporttagság alapján keresni. Keresem azokat a felhasználókat, akik benne vannak az Oktatók csoportban:
[10] PS C:\> Get-ADUser -Filter {memberof -eq "cn=g-oktatók,ou=IT Admins,dc=r2,
dc=dom"} | Format-Table name
name
----
Kovács Tímea
Bakai Viktor
Dolák Tamás
Ács Viktor
Látható, hogy a csoportra annak Distinguished Name nevével kell hivatkozni, ami kicsit megnehezíti a dolgot. Próbáljuk meg egyszerûsíteni:
[12] PS C:\> $g = Get-ADGroup g-oktatók
[13] PS C:\> Get-ADUser -Filter {memberof -eq $g} | Format-Table name
name
----
Kovács Tímea
Bakai Viktor
Dolák Tamás
Ács Viktor
Látható, hogy két lépésben egyszerûbben megoldható volt a feladat, elsõként a csoportot ragadtam meg és tettem a $g változóba, a második lépésben kerestem ki azokat a felhasználókat, akiknek a memberOf tulajdonsága megegyezik ezzel a csoporttal. Fontos, hogy nem kellett a csoport distinguished name tulajdonságára hivatkozni, ezt a háttérben megtette helyettünk a PowerShell.
Nézzük azt a problémát, amikor nem közvetlenül tagja egy felhasználó egy csoportnak, hanem egy másik csoport tagságán keresztül. Erre használhatjuk majd a recursivematch operátort, de elõször nézzük meg, hogy kik a dl-fullcontrol nevû csoportunk tagjai a Get-ADGroupMember cmdlet segítségével:
[26] PS C:\> Get-ADGroupMember dl-fullcontrol | Format-Table name
name
----
G-Oktatók
Látható, hogy a DL-FullControl csoportnak csak a G-Oktatók csoport a tagja. De vajon ezen keresztül melyik felhasználók?
[27] PS C:\> $g = Get-ADGroup dl-fullcontrol
[28] PS C:\> Get-ADuser -Filter {memberof -recursivematch $g} | Format-Table na
me
name
----
Kovács Tímea
Bakai Viktor
Dolák Tamás
Ács Viktor
Látható, hogy ugyanaz a négy ember, akiket már korábban láttunk.
Megjegyzés
A recursivematch operátor csak a Windows Server 2008, vagy afölötti verziójú tartományvezérlõknél érhetõ el.
Mivel ilyen jellegû rekurzív keresés nagyon gyakori, ezt már a Get-ADGroupMember cmdlet magától is tudja:
[29] PS C:\> Get-ADGroupMember dl-fullcontrol -Recursive | Format-Table name
name
----
Ács Viktor
Dolák Tamás
Bakai Viktor
Kovács Tímea
Hogyan lehet arra rákeresni, hogy egy tulajdonság ki van-e töltve, van-e értéke? Erre leggyakrabban a ‑like operátor használható a * paraméterrel:
[40] PS C:\> Get-ADUser -Filter {othertelephone -like "*"} -Properties othertel
ephone | Format-Table name, othertelephone
name othertelephone
---- --------------
Saly Judit {tel2, tel1}
Ebben a példában mindazon személyeket kerestem, akiknek ki van töltve az otherTelephone tulajdonságuk. Ez egy un. multivalued property, azaz olyan tulajdonság, ami önmagában is egy tömb. Látszik, hogy a like operátort ez nem zavarta, a hasonlatosságot elemenként nézte.
A leggyakrabban használatos AD objektumok lekérdezésére, kezelésére van külön fõnévvel ellátott cmdlet, de általános lekérdezõ fõnevünk is van, az ADObject. Ilyen általános lekérdezést a Get-ADObject-tel végezhetünk. Például keressük, az AD sémában azokat az attribútumokat, amelyek a Globális Katalógusba replikálódnak:
[64] PS C:\> Get-ADObject -Filter {objectClass -eq "AttributeSchema" -and ismem
berofpartialattributeset -eq $true} -SearchBase "cn=schema,cn=configuration,dc=
r2,dc=dom" -properties ismemberofpartialattributeset | ft name
name
----
Alt-Security-Identities
CA-Certificate
CA-Certificate-DN
Certificate-Templates
Common-Name
Country-Name
Description
Ez az általános lekérdezõ cmdlet ugyanúgy mûködik, mint az objektum-specifikus változatai, a szûrõnél érdemes az objectClass objektumtípust is meghatározni, hogy a találati lista mindenképpen megfelelõen szûrt legyen és a SearchBase paraméterrel olyan partíciókra is irányíthatjuk a keresést, ami nem az alaphelyzet szerinti tartományi partíció.