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