Centrum skryptów - Systemy operacyjne

Jak pobrać listę wszystkich kont na moim komputerze, pogrupowanych według jednostki OU? 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 pobrać listę wszystkich kont na moim komputerze, pogrupowanych według jednostki OU?

Cześć, Skrypciarze! Jak uzyskać listę wszystkich komputerów w domenie, grupując te komputery według jednostki OU, w której znajduje się dane konto komputera?

-- TA

Cześć, TA. Zapewne wielu z Was bardzo się ostatnio martwiło o moje zdrowie. Mogę Was jednak zapewnić, że jest już dużo lepiej i nie muszę siedzieć w biurze w rękawiczkach i czapce na głowie.

Ciężko było? Powiem to tak: rzadko choruję, ale jak już mnie coś dopadnie to rozkłada na części. Tak się stało tym razem. Na szczęście jest naprawdę lepiej, nie mam gorączki, przeszły dreszcze i w ogóle lepiej się czuję. Za oknem też jest lepiej. Wreszcie mam poczucie, że idzie wiosna, bo słońce zaczęło mocniej przygrzewać.

Uwaga. Zazwyczaj o tej porze roku jest o wiele cieplej, niż teraz. Nie wiem, co mam sobie o tym myśleć. Czasem wydaje mi się, że termometr się popsuł.

Mam nadzieję, że w przyszłym roku pogoda będzie trochę bardziej odpowiadać kalendarzowym porom roku. Ale jak to mówią, kwiecień plecień, więc może nie powinienem aż tak narzekać. Z uwagi na moją ostatnią niedyspozycję nazbierało mi się trochę zaległości, które muszę teraz skrupulatnie ponadrabiać. Zatem darujcie mi dzisiejszy krótki wstęp i pozwólcie, że przejdę od razu do skryptu, który przekaże nam listę wszystkich jednostek OU, a następnie określi, które konta komputera znajdują się w każdej z nich.

Oto on:

On Error Resume Next



Const ADS_SCOPE_SUBTREE = 2



Set objConnection = CreateObject("ADODB.Connection")

Set objCommand =   CreateObject("ADODB.Command")

objConnection.Provider = "ADsDSOObject"

objConnection.Open "Active Directory Provider"

Set objCommand.ActiveConnection = objConnection



objCommand.Properties("Page Size") = 1000

objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 



objCommand.CommandText = _

    "SELECT ADsPath FROM 'LDAP://dc=fabrikam,dc=com' WHERE " & _

        "objectCategory='organizationalUnit'"  



Set objRecordSet = objCommand.Execute



objRecordSet.MoveFirst



Do Until objRecordSet.EOF

    Set objOU = GetObject(objRecordSet.Fields("ADsPath").Value)

    Wscript.Echo objOU.distinguishedName



    objOU.Filter = Array("Computer")

    

    For Each objItem in objOU

        Wscript.Echo "  " & objItem.CN

    Next



    Wscript.Echo

    Wscript.Echo

    objRecordSet.MoveNext

Loop

Jak widzimy, pierwsza połowa skryptu dotyczy wyszukiwania w usłudze Active Directory. Zgodnie z naszym zwyczajem nie będę dziś szczegółowo omawiał wyszukiwania w usłudze Active Directory. Więcej informacji na ten temat można znaleźć w dwuczęściowym artykule Opowieści skrypty Dude, Where’s My Printer (j.ang.) (pierwsza część tego artykułu znajduje się tutaj, a część druga tutaj). Poświęcę jednak chwilę na omówienie kwerendy wymaganej do wykonania wyszukiwania:

objCommand.CommandText = _

    "SELECT ADsPath FROM 'LDAP://dc=fabrikam,dc=com' WHERE " & _

        "objectCategory='organizationalUnit'"

Tak naprawdę nie ma w niej nic szczególnego. Informujemy skrypt, że ma przeszukać domenę fabrikam.com i przekazać nam atrybut ADsPath dla każdego obiektu o kategorii objectCategoryorganizationalUnit. Tak, macie rację: wszystko, co ma kategorię objectCategory o wartości organizationalUnit jest jednostką organizacyjną.

Po wykonaniu kwerendy otrzymujemy zestaw rekordów składający się z wszystkich jednostek organizacyjnych OU w tej domenie. Teraz musimy sprawdzić, które komputery znajdują się w każdej z tych jednostek OU. W tym celu uruchamiamy pętlę Do Until, która będzie działać, dopóki nie przejdzie przez każdą jednostkę OU z osobna (lub, używając bardziej technicznego języka, dopóki wartość True właściwości EOF (end-of-file) zestawu rekordów się nie zmieni).

Aby pobrać listę wszystkich komputerów należących do danej jednostki OU musimy najpierw połączyć się z tą jednostką OU. Możemy to zrobić za pomocą atrybutu ADsPath, tego samego, który uzyskaliśmy podczas konfigurowania naszej kwerendy wyszukiwania:

Set objOU = GetObject(objRecordSet.Fields("ADsPath").Value)

Po utworzeniu połączenia wywołujemy echo wartości atrybutu distinguishedName jednostki OU. Będzie to coś podobnego do poniższego wiersza:

OU=Administration,DC=fabrikam,DC=com

Domyślnie połączenie z jednostką OU powoduje przywołanie kolekcji wszystkich obiektów zawartych w tej jednostce OU. To oznacza, że możemy wywołać echo listy tych obiektów uruchamiając pętlę For Each, podobną do poniższej:

For Each objItem in objOU

    Wscript.Echo "  " & objItem.CN

Next

Jednakże nie chcemy tego robić w tej chwili. Dlaczego? Ponieważ otrzymalibyśmy listę wszystkich obiektów w jednostce OU, a nam nie chodzi o wszystkie obiekty. Chcemy uzyskać tylko konta komputerów. Dlatego też, zanim zrobimy cokolwiek innego, ustawiamy filtr Filter, który ograniczy pobierane dane do obiektów komputer:

objOU.Filter = Array("Computer")

Teraz możemy uruchomić naszą pętlę For Each, wcinając dwie spacje (z przyczyn estetycznych), a następnie wywołujemy echo wartości atrybutu CN każdego z tych komputerów. Dzięki temu otrzymamy następujący wynik:

OU=Administration,DC=fabrikam,DC=com

  atl-ws-001

  atl-ws-002

  atl-ws-003

  atl-ws-004

Jest to dokładnie to, o co nam chodziło.

Po załatwieniu pierwszej jednostki OU w zestawie rekordów stosujemy dwie instrukcje Wscript.Echo w celu wstawienia kilku pustych wierszy w otrzymanym wyniku, a następnie wywołujemy metodę MoveNext, aby przejść do następnego rekordu w zestawie rekordów. Teraz powtarzamy po prostu cały proces dla następnej jednostki OU.

To podejście może wydać się działaniem w odwrotnej kolejności. Ale prawda jest taka, że działa: na koniec otrzymujemy listę wszystkich jednostek OU znajdujących się w domenie, jak również listę wszystkich kont komputera znajdujących się w każdej z tych jednostek OU. Jakieś pytania? Wiecie, gdzie mnie znaleźć.

Do początku strony

Centrum skryptów - Systemy operacyjne