Centrum skryptów - Systemy operacyjne

Jak użyć powłoki Windows PowerShell w celu dodania użytkownika domeny do grupy lokalnej?

Udostępnij na: Facebook

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 użyć powłoki Windows PowerShell w celu dodania użytkownika domeny do grupy lokalnej?

Cześć, Skrypciarze! W tym artykule opisujecie, jak użyć skryptu VBScript do dodania użytkownika domeny do grupy lokalnej. Czy można zrobić to samo za pomocą powłoki Windows PowerShell?

-- KE

Cześć, KE. Zanim zacznę, chciałbym Wam powiedzieć, że mam nową ulubioną reklamę telewizyjną. W sumie to nie wiem nawet, co ta reklama reklamuje (poza może jakąż marką samochodu), ale przedstawia dwa identyczne samochody (z identycznymi kierowcami i pasażerami), jadące dwoma równoległymi drogami. Kiedy te dwie drogi się łączą, samochody się również łączą w magiczny sposób i w ten sposób dwa samochody stają się jednym.

Oczywiście to nic takiego. To, co jest najfajniejsze w tej reklamie to nie sama reklama, ale towarzyszące jej oświadczenie:

Zawodowy kierowca na zamkniętym torze. Nie próbuj tego samemu.

Szczerze mówiąc, to kawał dobrej rady. Weźmy na przykład taką sytuację: klonujemy się, my i nasze klony mamy takie same samochody. Czy moglibyśmy spróbować przejechać się równoległymi drogami i potem rozbić samochody o siebie zakładając, że połączą się one płynnie? Nie, nie moglibyśmy.

No, chyba że my i nasze klony jesteśmy zawodowymi kierowcami na zamkniętym torze. Wtedy to OK.

A przynajmniej tak mówią w TV. Prawdę mówiąc, to nie wydaje się być zbyt trudne. Może spróbujecie i dacie mi znać jak poszło?

Uwaga. Nie chcemy, żeby nasz Redaktorka dostała ataku serca, więc wycofujemy tę propozycję: nie próbujcie, nawet jeżeli jesteście zawodowymi kierowcami na zamkniętym torze. I nawet, jeżeli Wasz klon także jest zawodowym kierowcą.

Moja rada: o ile wiem, żaden sąd na świecie nie przyjmie twierdzenia „Skrypciarze kazali mi to zrobić" jako uzasadnionego wytłumaczenia zrobienia czegoś głupiego.

Bo niby dlaczego.

Ale nie martwcie się. To nie oznacza, że tylko zawodowi kierowcy na zamkniętym torze mogą się dobrze bawić. Oczywiście nie można rozbijać samochodów próbując jakoś je ze sobą scalić (chociaż może… zresztą nieważne. Nawet o tym nie myślcie. Lub przynajmniej nikomu nie mówcie, że to Skrypciarze kazali Wam o tym myśleć). Kogo to obchodzi? Możecie wierzyć lub nie, ale nie rozbijając samochodów też można się dobrze bawić. Nie trzeba być na przykład zawodowym kierowcą na zamkniętym torze, żeby napisać skrypt powłoki Windows PowerShell, który doda użytkownika domeny do grupy lokalnej. Wystarczy stworzyć coś takiego:

$objUser = [ADSI]("WinNT://fabrikam/kenmyer")

$objGroup = [ADSI]("WinNT://atl-fs-001/Administrators")



$objGroup.PSBase.Invoke("Add",$objUser.PSBase.Path)

Co się tutaj dzieje? Dobre pytanie. W pierwszym wierszu używamy adaptera typu [ADSI] w celu utworzenia odniesienia do obiektu dla konta użytkownika usługi Actove Directory. Dokładniej mówiąc tworzymy odniesienie do obiektu do konta użytkownika fabrikam\kenmyer. Co to jest adapter typu [ADSI]? To także jest dobre pytanie. W celu ułatwienia administratorom wykonywania niektórych czynności, powłoka PowerShell zawiera kilka „adapterów typu”, takich jak [ADSI]. W tym przypadku adapter typu ułatwia łączenie się z interfejsem ADSI, niezależnie od tego, czy używamy interfejsu ADSI do zarządzania usługą Actove Directory, czy do zarządzania kontami lokalnymi. Gdyby nie adapter typu, konieczne byłoby zastosowanie platformy .NET Framework i wywołanie wystąpienia klasy System.DirectoryServices.DirectoryEntry do pracy z interfejsem ADSI. Adapter typu tworzy ten interfejs za nas.

Hmmm, to kolejne dobre pytanie: jeżeli mamy do czynienia z usługą Active Directory, to dlaczego zastosowaliśmy dostawcę WinNT. Czy nie należałoby użyć dostawcy LDAP podczas pracy z usługą Active Directory?

Tak, należałoby, ale pod warunkiem, że pracujemy wyłącznie z usługą Active Directory. W tym przypadku jednak nie pracujemy wyłącznie z usługą Active Directory. Pracujemy natomiast także z kontami lokalnymi. Konta lokalne wymagają zastosowania dostawcy WinNT, a dostawca WinNT nie potrafi pracować z jednostkami organizacyjnymi OU i innymi składnikami usługi Active Directory. Z tego powodu musimy zastosować tradycyjną składnię domena/nazwa_użytkownika.

Po utworzeniu odniesienia do obiektu dla konta użytkownika powtarzamy ten proces w celu utworzenia drugiego odniesienia do obiektu, tym razem dla grupy lokalnej. W naszym przykładowym skrypcie jest to grupa Administrators na komputerze o nazwie atl-fs-001:

$objGroup = [ADSI]("WinNT://atl-fs-001/Administrators")

Po wykonaniu tej czynności możemy dodać użytkownika domeny Kena Meyera do lokalnej grupy Administratorów używając poniższego wiersza kodu:

$objGroup.PSBase.Invoke("Add",$objUser.PSBase.Path)

I jeszcze jedno dobre pytanie: o co chodzi z obiektem PSBase? Cóż, kiedy używamy powłoki Windows PowerShell do połączenia się z obiektem, powłoka PowerShell często z wyprzedzeniem decyduje o tym, które metody i właściwości zostaną nam udostępnione. Zazwyczaj nie ma z tym problemu, ale niekiedy zdarza się, że powłoka PowerShell się pomyli. Czasami nie wyświetli właściwości lub metody, która naprawdę jest nam potrzebna. Tak się dzieje tutaj. Jeżeli łączymy się z kontem grupy lokalnej (np. kontem Administratora), powłoka PowerShell wyświetli tylko kilka metod i właściwości:

Name                        MemberType

----                        ----------

ConvertDNWithBinaryToString CodeMethod

ConvertLargeIntegerToInt64  CodeMethod

Description                 Property

groupType                   Property

Name                        Property

objectSid                   Property

I tu do gry wkracza obiekt PSBase. Obiekt PSBase umożliwia dobranie się do „surowego” obiektu za obiektem domyślnie wyświetlanym przez powłokę PowerShell. Innymi słowy obiekt PSBase umożliwia otrzymanie wszystkich właściwości i metod obiektu:

Name                      MemberType

----                      ----------

Close                     Method

CommitChanges             Method

CopyTo                    Method

CreateObjRef              Method

DeleteTree                Method

Dispose                   Method

Equals                    Method

GetHashCode               Method

GetLifetimeService        Method

GetType                   Method

InitializeLifetimeService Method

Invoke                    Method

InvokeGet                 Method

InvokeSet                 Method

MoveTo                    Method

RefreshCache              Method

Rename                    Method

ToString                  Method

AuthenticationType        Property

Children                  Property

Container                 Property

Guid                      Property

Name                      Property

NativeGuid                Property

NativeObject              Property

ObjectSecurity            Property

Options                   Property

Parent                    Property

Password                  Property

Path                      Property

Properties                Property

SchemaClassName           Property

SchemaEntry               Property

Site                      Property

UsePropertyCache          Property

Username                  Property

W tym przypadku obiekt PSBase wyświetla metodę Invoke. Teraz z kolei możemy wywołać metodę Invoke, przekazując jej parametr Add oraz właściwość Path zawierającą konto użytkownika w usłudze Active Directory. Co dzięki temu uzyskamy? No właśnie: użytkownik o którym mowa (fabrikam\kenmyer) zostanie dodany do lokalnej grupy Administrators na komputerze o nazwie atl-fs-001.

Uwaga. Tak przy okazji, być może zauważyliście, że podczas wywoływania metody Invoke musieliśmy zastosować obiekt PSBase naszego konta użytkownika: $objUser.PSBase.Path. To dlatego, że domyślnie nie mamy dostępu do obiektu Path. Jedynym sposobem, żeby się do niego dostać jest zastosowanie obiektu PSBase.

Możecie wierzyć lub nie, ale to wszystko, co należało zrobić. Po uruchomieniu tego skryptu konto usługi katalogowej Active Directory użytkownika Ken Meyer zostanie dodane do lokalnego konta Administratorów. Sami spróbujcie.

Pamiętajcie, żeby nie próbować zderzać ze sobą samochodów. Skoro już o tym mówimy, nie próbujcie zderzać ze sobą niczego. Kilka lat temu Skrypciarze zrobili eksperyment, w którym Peter Costantini oraz Dean Tsaltas mieli za zadanie biec najszybciej jak mogą i potem zderzyć się ze sobą. Mieliśmy nadzieję na to, że łącząc tych dwóch Skrypciarzy, uda nam się stworzyć Super-Skrypciarza. A co otrzymaliśmy? Petera i Deana w takiej samej postaci.

Niech to będzie dla Was przestrogą.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne