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