2.16.1 Szûrés AD objektumokra

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



Word To HTML Converter