Centrum skryptów - Active Directory

Jak określić najwyższą jednostkę organizacyjną dla obiektu Active Directory?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak określić najwyższą jednostkę organizacyjną dla obiektu Active Directory?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Cześć, Skrypciarze! Jeśli mam nazwę wyróżniającą, jak mogę określić “najwyższą” OU (jednostkę organizacyjną)?

-- HF

Cześć Skrypciarze! Odpowiedź

Cześć, HF. Gdy Skrypciarz piszący te słowa jechał rano do pracy, usłyszał reklamę kursów edukacyjnych dla dorosłych, która sugerowała, że nie tylko uczynią cię one mądrzejszym, ale również ułatwią podrywanie. Skrypciarzowi przypomniały się wtedy studia. Podczas zajęć z astronomii wykładowca wspomniał kiedyś, że nachylenie ekliptyki wynosi 23½ stopnia. Po chwili dodał, że jeśli studenci nie zapamiętają z zajęć nic innego, niech zapamiętają chociaż to. Ludzie uznają ich za seksownych jeśli będą wiedzieli, że nachylenie ekliptyki wynosi 23½ stopnia.

Jak się okazało, Skrypciarz pamiętał, że nachylenie ekliptyki wynosi 23½ stopnia. Czy ludzie uznali go za seksownego? Ujmijmy to w ten sposób: Nie wszystko, czego uczycie się na studiach okazuje się być prawdziwe. Zdecydowanie nie wszystko.

Innymi słowy, nie możemy zagwarantować, że dodatkowa wiedza sprawi, że będziecie bardziej atrakcyjni. Na pewno jednak pomoże wam określić najwyższą OU dla obiektu Active Directory.

Set objSysInfo = CreateObject("ADSystemInfo")

strDN = objSysInfo.UserName



arrDN = Split(strDN, ",")



For i = UBound(arrDN) to 0 Step -1

    If Left(arrDN(i), 3) = "OU=" Then

        arrOU = Split(arrDN(i), "=")

        Wscript.Echo arrOU(1)

        Exit For

    End If

Next

Zanim zaczniemy wyjaśniać działanie skryptu, wyjaśnijmy najpierw scenariusz. Mamy nazwę wyróżniającą obiektu (na przykład konta użytkownika). Będzie to wyglądać mniej więcej tak:

cn=Ken Myer,OU=Level4,OU=Level3,OU=Level2,OU=Level1,DC=fabrikam,DC=com

Jak widzicie, konto Ken Myer znajduje się w OU Level4. Level4, jest OU-dzieckiem OU Level3, która jest dzieckiem OU Level2, która jest dzieckiem OU Level1. (W nazwie wyróżniającej element po prawej jest zawsze rodzicem elementu po lewej.) Level1 jest również “najwyższą” OU; nie jest dzieckiem żadnej innej OU. To właśnie OU, którą musimy zidentyfikować.

W jednym z poprzednich artykułów (j. ang.) pokazaliśmy wam, jak zidentyfikować OU-„dziadka” dla danego kontenera. Nie możemy teraz użyć tego podejścia dlatego, że nie wiemy, ile poziomów wyżej musimy się wznieść, aby znaleźć najwyższą OU. OK, jeśli chcecie wdawać się w szczegóły techniczne, moglibyśmy użyć tego podejścia, ale z pewnymi modyfikacjami. Znaleźliśmy jednak trochę łatwiejsze do wdrożenia rozwiązanie.

Oczywiście żadne z tych podejść nam się nie przyda o ile nie mamy atrybutu distinguishedName, z którym możemy pracować. Aby zająć się tym problemem i dla celów poglądowych, użyjemy następującego fragmentu kodu aby pobrać nazwę wyróżniającą zalogowanego użytkownika:

Set objSysInfo = CreateObject("ADSystemInfo")

strDN = objSysInfo.UserName

Tworzymy tu jedynie wystąpienie obiektu ADSystemInfo, który pobiera informacje o zalogowanym użytkowniku i jego komputerze (I zanim spytacie, przykro nam, ale obiektu ADSystemInfo można użyć jedynie lokalnie. Oznacza to, że tego skryptu nie można łatwo zmodyfikować, aby otrzymać informacje o użytkowniku zalogowanym na zdalnym komputerze. Ale nie rozpaczajcie. Omówimy tę kwestię w nadchodzącym wydaniu TechNet Magazine.) Po utworzeniu obiektu ADSystemInfo przydzielamy wartość właściwości UserName zmiennej strDN. Co ciekawe, wartością właściwości UserName okazuje się być nazwa wyróżniająca zalogowanego użytkownika:

cn=Ken Myer,OU=Level4,OU=Level3,OU=Level2,OU=Level1,DC=fabrikam,DC=com

Fajnie, prawda? Oprócz jednej rzeczy: jak mamy określić najwyższą OU na podstawie takiej wartości?

Są na to różne sposoby. Z różnych powodów (z których najważniejszym jest prostota) zdecydowaliśmy się na rozpoczęcie od użycia funkcji Split aby zmienić tę nazwę wyróżniającą w tablicę o nazwie arrDN:

arrDN = Split(strDN, ",")

Rozdzielając ciąg znaków w miejscach, gdzie są w nim przecinki, otrzymamy tablicę składającą się z następujących elementów:

cn=Ken Myer

OU=Level4

OU=Level3

OU=Level2

OU=Level1

DC=fabrikam

DC=com

Jak zapewne wiecie, w nazwie wyróżniającej najwyższą OU zawsze będzie OU najbliższa komponentów domeny (oznaczonych DC= ). W tym wypadku jest to OU Level1 OU, znajdująca się najbliżej komponentów domeny: cn=Ken Myer,OU=Level4,OU=Level3,OU=Level2,OU=Level1,DC=fabrikam,DC=com. Czy istnieje więc prosty sposób na określenie, która OU jest najbliżej komponentów domeny? Jasne, że tak:

For i = UBound(arrDN) to 0 Step -1

Utworzyliśmy tu pętlę For Next która przejdzie przez wszystkie elementy tablicy arrDN. Ale nie jest to zwyczajna pętla For Next, która zaczyna od pierwszego elementu w tablicy i kończy na ostatnim. Zamiast tego zaczniemy od ostatniego elementu tablicy (co możemy określić przy użyciu funkcji UBound) i będziemy się cofać aż do pierwszego elementu. W naszym przykładzie mamy tablicę z 7 elementami, co oznacza, że ostatni element w tablicy ma numer indeksu 6 (ponieważ pierwszy element w tablicy ma zawsze numer 0, ostatni będzie miał numer równy liczbie elementów minus 1). Oznacza to, że zaczniemy od elementu z numerem indeksu 6. Co zrobimy, gdy skończymy już z tym elementem? To proste. Zajmiemy się elementem 6. Po to jest parametr Step -1. Będziemy kontynuować aż przetworzymy element 0. Wtedy pętla będzie zakończona i przejrzymy już wszystkie elementy w tablicy.

Uwaga. OK, ściśle rzecz biorąc, zapewne nie będziemy przeglądać wszystkich elementów tablicy. Ale wyjaśnimy to za chwilę.

Wewnątrz pętli zaczynamy od sprawdzenia, czy pierwsze trzy znaki w danym elemencie to OU=. Do tego właśnie używamy następującego wiersza kodu i funkcji Left:

If Left(arrDN(i), 3) = "OU=" Then

W naszym przykładzie element 6 (pierwszy, na jaki patrzymy) wygląda tak: DC=com. Czy pierwsze trzy litery w DC=com to nasza pożądana wartość (OU=)? Nie. Dlatego zapętlamy ponownie i sprawdzamy kolejny element tablicy, DC=fabrikam. Pasuje? Nie bardzo. Znowu wracamy i sprawdzamy kolejny element: OU=Level1. Kto by pomyślał? Mamy zwycięzcę!

Jako że znaleźliśmy już najwyższą OU, praktycznie skończyliśmy. W zasadzie moglibyśmy po prostu wyświetlić wartość OU=Level1 i skończyć pracę. Postanowiliśmy jednak pozbyć się OU=, aby wszystko wyglądało schludniej i jaśniej. To właśnie robimy tu:

arrOU = Split(arrDN(i), "=")

Wscript.Echo arrOU(1)

W pierwszym z powyższych wierszy używamy funkcji Split aby utworzyć kolejną tablicę o nazwie arrOU. Tym razem znakiem podziału jest znak równości (=), co daje nam tablicę z dwoma elementami:

OU=

Level1

A następnie w wierszu 2 wyświetlamy wartość drugiego elementu tablicy:

Level1

Teraz rzeczywiście skończyliśmy. Wywołujemy instrukcję Exit For aby opuścić pętlę For Next i wtedy kończymy skrypt. To powinno być wszystko, czego ci trzeba, HF, przynajmniej jeśli chodzi o określenie najwyższej OU w obiekcie Active Directory.

Tak przy okazji, Skrypciarz piszący te słowa był trochę zawiedziony, gdy dowiedział się, że nie stał się bardziej atrakcyjny dzięki zapamiętaniu, że nachylenie ekliptyki wynosi 23½ stopnia. Z drugiej strony, gdy piszący te słowa Skrypciarz zaczynał studia, ludzie wciąż wierzyli, że Słońce krąży wokół Ziemi. I tak miał szczęście, że nikt nie próbował go spalić na stosie za twierdzenie, że nachylenie ekliptyki wynosi 23½ stopnia.

Uwaga. Co jeśli kiedyś będzie chciał zostać spalony na stosie? Żaden problem. W Microsofcie jest sporo ludzi, którzy z chęcią się tym zajmą.
 Do początku strony Do początku strony

Centrum skryptów - Active Directory