Centrum skryptów - Active directory

Jak określić, do jakiej jednostki organizacyjnej OU należy lokalny komputer?

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ć, do jakiej jednostki organizacyjnej OU należy lokalny komputer?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! W skrypcie logowania, jakiego atrybutu użyć, żeby określić jednostkę organizacyjną OU do której należy lokalny komputer?

-- JP

Cześć Skrypciarze! Odpowiedź

Hej, JP. Prawie wszyscy znają Amora, rzymskiego boga miłości. Właściwie cieżko byłoby znaleźć kogoś, kto nie wie, że Amor nosi ze sobą kołczan złotych strzał. Dostań strzałą Amora, a od razu zakochasz się we wskazanej przez niego osobie.

Ale jest coś o czym większość osób nie wie: oprócz złotych strzał, Amor ma też w kołczanie kilka ołowianych. Co się stanie, gdy trafi cię jedna z tych strzał? Proszę: natychmiast znienawidzisz osobę wskazaną przez Amora. Warto o tym pamiętać następnym razem, gdy Amor będzie przelatywał koło okna.

Dlaczego właściwie marnujemy cenną przestrzeń sieci Web opowiadając o mitologii Rzymian? To proste: Skrypciarze złożyli uroczystą przysięgę, by mówić ludziom o rzeczach, których jeszcze nie wiedzą. Większość ludzi nie wie, że Amor może wzbudzić w człowieku nienawiść równie łatwo jak miłość; jest więc naszym obowiązkiem powiedzieć o tym. Podobnie, naszym obowiązkiem jest powiadomić, że - z jakiegoś powodu - nie istnieje atrybut Active Directory, informujący do jakiej jednostki OU należy dany komputer. Jeśli mieliście więc nadzieję, że wystarczy wiersz kodu taki jak ten, żeby określić OU komputera, to niestety, ale macie pecha:

Wscript.Echo objComputer.OU

Poczekajcie, nie idźcie jeszcze. Koniec końców, Skrypciarze złożyli mnóstwo uroczystych przysięg. Zobaczmy, czy któraś mogłaby tu pomóc. Zobaczmy: "Zawsze wyrzucać śmieci noc przed wywózką." Dobra rada, ale tu chyba się nie przyda.

To może ta: "Zawsze żartować z Oakland Raiders, nawet jeśli nie ma najmniejszego powodu o nich wspominać". Właściwie, to nigdy byśmy tego nie zrobili - fani Oakland Raiders są i tak wystarczająco żałośni.

O, moment, mamy: "Zawsze gdy nie ma oczywistej metody zrobienia czegoś, i tak próbować znaleźć jakiś sposób".

Zgodnie z tą przysięgą:

Set objSysInfo = CreateObject("ADSystemInfo")

strComputer = objSysInfo.ComputerName



Set objComputer = GetObject("LDAP://" & strComputer)



arrOUs = Split(objComputer.Parent, ",")

arrMainOU = Split(arrOUs(0), "=")



Wscript.Echo arrMainOU(1)

Tak, to jest dość dziwaczny skrypt; między innymi, kto mógłby przypuszczać, że w tak krótkim fragmencie kodu można tyle razy użyć funkcji Split? Sprawdźmy, czy uda nam się wyjaśnić jak to działa.

Na początek, tworzymy egzemplarz obiektu ADSystemInfo. Jest to obiekt, który zwraca różne pożyteczne informacje o komputerze lokalnym i zalogowanym użytkowniku. Teraz użyjemy tego wiersza kodu, by zachować wartość właściwości ComputerName w zmiennej o nazwie strComputer:

strComputer = objSysInfo.ComputerName

Jak się okazuje, właściwość ComputerName zwraca nazwę wyróżnioną komputera. Oznacza to, że dostaniemy wartość tego rodzaju:

CN=ATL-WS-01,OU=Accounting,OU=Finance,DC=fabrikam,DC=com

Jak widzimy jednostka OU komputera – Accounting – stanowi część nazwy wyróżnionej. Pozostało tylko wykombinować, jak wyizolować nazwę OU.

Szczerze mówiąc, jest kilka sposobów. Po chwili namysłu, zdecydowaliśmy rozpocząć proces od użycia następującego wiersza kodu do połączenia z kontem komputera w katalogu Active Directory:

Set objComputer = GetObject("LDAP://" & strComputer)

To z kolei, przenosi nas do tego fragmentu skryptu:

arrOUs = Split(objComputer.Parent, ",")

Co do diaska tu się dzieje? To co robimy, to używamy funkcji Split, żeby wyizolować poszczególne składniki atrybutu Parent komputera i umieścić je w tablicy. Czym jest atrybut Parent? W tym przypadku będzie to ścieżka ADsPath kontenera, w którym znajduje się obiekt komputera. Innymi słowy, ma on wartość:

LDAP://OU=Accounting,OU=Finance,DC=fabrikam,DC=com

Gdy rozdzielimy wartość atrybutu Parent według przecinków, dostaniemy tablicę (o nazwie arrOUs) zawierającą następujące elementy:

LDAP://OU=Accounting

OU=Finance

DC=fabrikam

DC=com

Jak widać, jesteśmy już blisko. Właściwie, to pierwszy element tablicy (element 0) jest tym, czego potrzebujemy, zakładając, że pozbędziemy się LDAP://OU=. Dlaczego więc nie pozbyć się LDAP://OU=? Następujący wiersz kodu bierze element 0 z tablicy arrOUs - LDAP://OU=Accounting - i dzieli wartość w miejscu znaku równości (=):

arrMainOU = Split(arrOUs(0), "=")

Efekt końcowy? Kolejna tablica (arrMainOU) zawierająca dwa elementy:

LDAP://OU 

Accounting

Jedyne co pozostało, to zwrócić za pomocą funkcji Echo drugi element tablicy (element 1) i gotowe:

Wscript.Echo arrMainOU(1)

Jak wspominaliśmy, to nieco okrężny sposób uzyskania OU komputera, ale czy się to nam podoba, czy nie, nie ma żadnej bezpośredniej metody pobrania OU komputera. No ale działa, nie?

Teraz, zanim skończymy, czy jest coś jeszcze, o czym wiedzą Skrypciarze i Wy też powinniście wiedzieć? Może historia Amora i Psyche, w komplecie z szaloną owcą zabijającą ludzi, gadającymi wieżami i pudełkiem pełnym wiecznego snu?

Ach. No dobrze, powiedzmy, że zostawimy tę opowieść na kiedy indziej. Hej, co robicie jutro?

 Do początku strony Do początku strony

Centrum skryptów - Active directory