Centrum skryptów - Systemy operacyjne

Jak zmienić hasło do konta lokalnego administratora na wszystkich komputerach?

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 zmienić hasło do konta lokalnego administratora na wszystkich komputerach?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak zmienić hasło do konta lokalnego administratora na wszystkich komputerach w mojej domenie?

-- AO

Cześć Skrypciarze! Odpowiedź

Cześć, AO! Jak powszechnie wiadomo, w Internecie nigdy do końca nie wiadomo jakiej kto jest płci, ani nawet czy ktoś nie jest przypadkiem jakimś futrzakiem, człowiekiem-kotem, czy chociażby R2D2. Tak w sumie to ciekawe, czy księżniczka Leia flirtowała z Hanem Solo przez Internet, bo film pomija cały ten wątek… Mniejsza jednak o księżniczkę Leię. Was na pewno obchodzi tylko i wyłącznie, jak wyglądamy MY. Jeżeli byliście na konferencji Tech Ed 2007, to na pewno pamiętacie dwóch skejtów ze stoiska CMP Media. To byli właśnie Skrypciarze (tak, niestety). Jeżeli nie pamiętacie, lub jesteście po prostu ciekawi, to wyczerpujący opis znajdziecie w zapierającym dech w piersiach artykule Jak dodać numerację strony „X z Y” do stopki programu Word. Co oczywiście nie oznacza, ze opis ten musi być prawdziwy.

Jeżeli jednak zupełnie nie interesuje Was, jak świetnie wyglądamy, to na pewno chętnie się dowiecie, jak wyśmienicie wygląda skrypt, o który prosił (prosiła, lub wręcz prosiło, nie wiemy przecież) nas AO:

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.CommandText = _

    "Select Name From 'LDAP://DC=fabrikam,DC=com' Where objectClass='computer'"  

objCommand.Properties("Page Size") = 1000

objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 

Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst



Do Until objRecordSet.EOF

    strComputer = objRecordSet.Fields("Name").Value



    Set objUser = GetObject("WinNT://" & strComputer & "/Administrator")

    objUser.SetPassword "x%tY7iu8%4f"



    objRecordSet.MoveNext

Loop

Skrypt wprawdzie wyśmienity, lecz dość skomplikowany, trzeba przyznać. Na szczęście dla nas, większość jego kodu standardowego może być używana bez zmian w prawie każdym skrypcie służącym do wyszukiwania w usłudze Active Directory. Więcej na temat działania takich skryptów można znaleźć w dwuczęściowym artykule Dude, Where's My Printer? (j.ang.) z serii Tales From the Script. To dzięki tej publikacji tak łatwo idzie nam pisanie skryptów dla usługi Active Directory.

Uwaga: Zdajemy sobie sprawę, że oszustewkiem trochę jest odwoływać kogoś do artykułu, który ukazał się zaledwie kilkanaście dni temu. Na szczęście w Internecie takie małe oszustewka łatwo zatuszować. Chyba że ktoś otwarcie się do nich przyznaje, ale aż trudno uwierzyć, że ktoś mógłby być aż tak mało błyskotliwy...

Innymi słowy, nie będziemy właściwie omawiać fragmentu skryptu odpowiedzialnego za wyszukiwanie. Rzucimy tylko okiem na kwerendę SQL, zwracającą kolekcję wszystkich komputerów znajdujących się w domenie fabrikam.com:

objCommand.CommandText = _

    "Select Name From 'LDAP://DC=fabrikam,DC=com' Where objectClass='computer'"

To całkiem prosta kwerenda, pytamy po prostu o nazwę (Name) każdego obiektu i danej domeny, pod warunkiem jednak, że interesujący nas obiekt ma wartość właściwości objectClass równą computer. Jedyne obiekty, które mają wartość własciwości objectClass równą computer, to po prostu komputery.

Po uruchomieniu kwerendy uzyskujemy zestaw rekordów zawierający wszystkie konta komputerów w danej domenie. Aby zmienić hasło do konta administratora na każdym stanowisku, musimy utworzyć pętlę Do Until, która będzie działać do momentu, kiedy dotrze do końca danego zestawu rekordów (lub, jeżeli chcecie błysnąć – dopóki wartość EOF zestawu rekordów nie osiągnie wartości True):

Do Until objRecordSet.EOF

Wewnątrz pętli pobieramy pole Name (właściwość tę wywoływaliśmy w naszej kwerendzie SQL) i przypisujemy ją do zmiennej strComputer:

strComputer = objRecordSet.Fields("Name").Value

Kiedy nazwę komputera mamy już zachowaną w zmiennej strComputer, używając poniższego wiersza kodu łączymy się z kontem administratora lokalnego:

Set objUser = GetObject("WinNT://" & strComputer & "/Administrator")

Jest to bardzo prosta operacja, należy jednak pamiętać, aby wpisać nazwę dostawcy WinNT dokładnie tak, jak podano. Jeżeli wpiszemy WinNT w jakiejkolwiek innej wersji, np. winnit czy WINNT, nasz skrypt nie zadziała. Po połączeniu się z kontem lokalnego administratora trzeba juz tylko wywołać metodę SetPassword i ustalić dla niego nowe hasło:

objUser.SetPassword "x%tY7iu8%4f"

Ot, cała filozofia. Po zmianie hasła pozostało nam juz tylko przejście do następnego zestawu rekordów za pomocą metody MoveNext. Powtarzamy ten proces z każdym kolejnym komputerem w naszej kolekcji, i tak aż do ostatniego komputera w naszej domenie.

Wszystko pięknie, co jednak zrobić, jeżeli niektóre z komputerów będą w trybie offline, wyłączone lub niedostępne z tego czy innego powodu? Bardzo proste, należy jedynie zmodyfikowac nasz skrypt. Dlatego też warto utworzyć spis wszystkich nazw komputerów i sprawdzić, czy połączenie z daną maszyną się powiodło. Można to zrobić, zapisując te informacje w pliku tekstowym (jeżeli nie wiecie, jak to zrobić, polecamy ten rozdział (j.ang.) przewodnika Microsoft Windows 2000 Scripting Guide.)

Dobrym pomysłem może być też wysłanie sygnału ping do wszystkich komputerów jeszcze przed połączeniem z kontem lokalnego administratora. Dzięki temu skrypt będzie działał o wiele sprawniej, nie będzie bowiem próbował łączyć się z komputerami, które są w danym momencie niedostępne.

To chyba na tyle od najprzystojniejszego skrypciarskiego skejta. Teraz do boju, może księżniczka Leia jest online…

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne