Sunday, June 17th, 2007...10:33 pm

Użycie LDAP_MATCHING_RULE_IN_CHAIN w praktyce

Jump to Comments

Jakiś czas temu pisałem o nowej funkcjonalności filtra LDAP dostępnej w Windows 2003 SP2 lub po poprawce KB 914828 czyli LDAP_MATCHING_RULE_IN_CHAIN. W skrócie reguła ta pozwala na wyszukanie rekursywnie w atrybutach o składni distinguished name. Dzisiaj mały przykład praktycznego użycia.

Na grupie dysusyjnej zadane zostało pytanie jak przenieść do wskazanego OU wszystkie konta komputerów będące członkami określonej grupy Active Directory.

W zasadzie wydaje siÄ™ proste – trzeba przeszukać zawartość member dla danej grupy, dla wszystkich obiektów w niej znajdujÄ…cych siÄ™ sprawdzić czy to sÄ… komputery i ewentualnie przenieść do innego OU.

Inne podejście to przeszukać memberOf wszystkich obiektów klasy computer, sprawdzić czy występuje tam określona grupa i ewentualnie przenieść odpowiednie konta do OU.

Maly problem – grupy mogÄ… być zagnieżdżone a caÅ‚ość trzeba oskryptować. W sukurs przychodzi tutaj nowa reguÅ‚a możliwa do użycia w filtrze LDAP. Tradycyjnie użyjemy szwajcarskich scyzoryków dla AD czyli ADFIND i ADMOD.

Najpierw wyszukajmy wszystki konta komputerów należące do grupy TestGroup:

adfind -b dc=w2k,dc=pl -s subtree -f “(&(objectClass=computer)(objectCategory=computer) (memberOf:1.2.840.113556.1.4.1941:=CN=TestGroup,OU=Location1,OU=E
mployees,DC=w2k,DC=pl))”

Otrzymujemy w wyniku:

Using server: DC1.w2k.pl:389
Directory: Windows Server 2003

dn:CN=MIIS,CN=Computers,DC=w2k,DC=pl

1 Objects returned

Teraz trzeba te konta przenieść do odpowiedniego OU co z użyciem ADMOD jest raczej proste:

adfind -b dc=w2k,dc=pl -s subtree -f “(&(objectClass=computer)(objectCategory=computer)
(memberOf:1.2.840.113556.1.4.1941:=CN=TestGroup,OU=Location1,OU=E
mployees,DC=w2k,DC=pl))”
-adcsv | admod -move OU=Komp,OU=Employees,DC=w2k,DC=pl

i mamy wynik zgodny z oczekiwaniami:

DN Count: 1
Using server: DC1.w2k.pl:389
Directory: Windows Server 2003

Moving CN=MIIS,CN=Computers,DC=w2k,DC=pl to OU=Komp,OU=Employees,DC=w2k,DC=pl….

Żeby tylko jeszcze sprawdzić, że faktycznie nasza reguła poprawnie działa sprawdźmy zawartość member dla grupy TestGroup i memberOf dla konta komputera MIIS.

adfind -b CN=TestGroup,OU=Location1,OU=Employees,DC=w2k,DC=pl -s base member

Using server: DC1.w2k.pl:389
Directory: Windows Server 2003

dn:CN=TestGroup,OU=Location1,OU=Employees,DC=w2k,DC=pl
member: CN=NestedGroup,OU=Location1,OU=Employees,DC=w2k,DC=pl
(…)

i dla użytkownika:

adfind -b CN=MIIS,CN=Computers,DC=w2k,DC=pl -s base memberof

Using server: DC1.w2k.pl:389
Directory: Windows Server 2003

dn:CN=MIIS,CN=Computers,DC=w2k,DC=pl
memberOf: CN=NestedGroup,OU=Location1,OU=Employees,DC=w2k,DC=pl

Czyli jak widać konto komputera należało do grupy, która była zagnieżdzona w grupie która nas interesowała. Miłe :).

Teraz część dla neXoRa, który w komentarzu do mojej informacji o tej funkcjonalności napisał że nie działa mu to w VB Script.

Biorę przykład z mojego artykułu o VBScript i zamieniam filtr na ten użyty powyżej:

(…)

strSQLStmt = “<LDAP://” & strDomain & “>;(&(objectClass=computer)(objectCategory=computer)
(memberOf:1.2.840.113556.1.4.1941:=CN=TestGroup,OU=Location1,
OU=Employees,DC=w2k,DC=pl));
distinguishedName, samAccountName”

(…)

Działa jak złoto :).

C:\Temp>cscript /nologo 1.vbs
Sam=MIIS$;DN=CN=MIIS,CN=Computers,DC=w2k,DC=pl

Dla Twojego przykładu użycia czyli wyszukiwania grup, w których użytkownik jest członkiem:

(…)

strSQLStmt = “<LDAP://” & strDomain & “>;(&(objectClass=group)(objectCategory=group)
(member:1.2.840.113556.1.4.1941:=CN=MIIS,CN=Computers,DC=w2k,DC=pl));
distinguishedName, samAccountName”

(…)

Jak powyżej – SOA#1.

C:\Temp>cscript /nologo 1.vbs
Sam=TestGroup;DN=CN=TestGroup,OU=Location1,OU=Employees,…
Sam=NestedGroup;DN=CN=NestedGroup,OU=Location1,OU=Employees,…

PS: W ramach ciekawostki – funkcjonalność ta zostaÅ‚a dodana na proÅ›bÄ™ grupy produktowej Exchange, która to dosyć czÄ™sto korzysta z funkcjonalnoÅ›ci sprawdzenia czy użytkownik jest w danej grupie. W zasadzie zakÅ‚adane zastosowanie tej funkcjonalnoÅ›ci to sprawdzenie czy konkretny użytkownik jest w konkretnej grupie. Grupa produktowa nie zakÅ‚adaÅ‚a użycia tego do szerokiego wyszukiwania danych, w zwiÄ…zku z tym Å‚atwo można siÄ™ przekonać, że korzystajÄ…c chociażby z .NET można napisać kawaÅ‚ek kodu który wykona te same operacje szybciej. Cóż … ale to jest dostÄ™pne w systemie i nie musimy nic pisać :).

1 Comment

Leave a Reply