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