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ó.