Centrum skryptów - Active Directory

Czy mogę wysłać do Active Directory kwerendę o użytkownikach, których hasła nie wygasają?

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.

Czy mogę wysłać do Active Directory kwerendę o użytkownikach, których hasła nie wygasają?

Cześć, Skrypciarze! Chcę wysłać kwerendę do Active Directory przy użyciu Windows PowerShell. W naszej domenie wdrożyliśmy system Windows Server 2008 R2 i uaktualniliśmy jeden z kontrolerów domeny. Zależy mi na możliwości wysłania kwerendy zwracającej wszystkich użytkowników, których hasła nie wygasają. Dzięki wyszukiwaniu w Bing znalazłam stary artykuł z serii „Cześć, Skrypciarze”, w którym omówiliście wyszukiwanie użytkowników o niewygasających hasłach, ale użyliście tam języka VBScript, a skrypt wydawał się skomplikowany. Czy jest jakiś prosty sposób na dostosowanie tego skryptu do Windows PowerShell 2.0?

-- VN

Cześć, VN! Czołem, tutaj skrypciarz Ed Wilson. Pochwalę się, że Skrypciarska Żona kupiła mi niedawno nowy, stalowy czajnik. To dlatego, że — wstyd powiedzieć — tłukłem wszystkie porcelanowe czajniki, które do tej pory mi kupowała. A czajnik to ważna rzecz w pracy skrypciarza. Przetestowałem go na spotkaniu z przedstawicielami witryny PoshCode.org, z którymi rozmawiałem o zapewnieniu hostingu Igrzysk Skrypciarskich 2010. Zaparzyłem wspaniałą zieloną herbatę z laską cynamonu i trawą cytrynową. Chyba im posmakowała, bo udało nam się dogadać. Możemy więc mieć nadzieję, że Igrzyska Skrypciarskie 2010 zostaną zorganizowane bez przeszkód. Wkrótce rozpoczniemy rejestrację zawodników. W tym roku ponownie stawiamy na konkurencję — skrypciarze to najwyraźniej krwiożercze bestie i chcą wiedzieć, kto jest najlepszy. Szykujemy różne świetne nagrody, a także nagrodę główną dla najlepszego zawodnika. Przygotujemy certyfikaty, a także dogrywkę na wypadek, gdyby igrzyska zakończyły się remisem. Nasze partnerstwo ze specjalistami Microsoft MVP z witryny PoshCode.org zaczyna przynosić znakomite rezultaty. Wkrótce podamy dalsze informacje. Użytkownicy serwisu Twitter (j.ang.) mogą utworzyć filtr #2010sg, aby szybko wyszukiwać nowe informacje o Igrzyskach Skrypciarskich 2010.

Aby wyszukać wszystkich użytkowników w jednostce organizacyjnej (OU) i w jej jednostkach podrzędnych, należy określić bazę wyszukiwania. W artykule z serii „Cześć, Skrypciarze” sprzed paru lat (j.ang.) przedstawiliśmy skrypt w języku VBScript, podający listę wszystkich użytkowników w jednostce OU i łącznie z jednostkami podrzędnymi. Wysłanie kwerendy przy użyciu tamtego skryptu wymagało 17 wierszy kodu. W Windows PowerShell 2.0 moduł Active Directory z pakietu Narzędzia administracji zdalnej Windows Server 2008 R2 (RSAT) umożliwia wykonanie tego zadania za pomocą jednego wiersza. Po zaimportowaniu modułu ActiveDirectory przy użyciu cmdletu Import-Module można użyć cmdletu Get-ADUser do wyszukania i pobrania wszystkich użytkowników z określonej jednostki OU.

Więcej informacji o instalowaniu pakietu narzędzi RSAT w Windows 7 i korzystania z modułu ActiveDirectory można znaleźć w artykule „Cześć, Skrypciarze” z zeszłego poniedziałku (j.ang.).

Aby pobrać wszystkich użytkowników z określonej lokalizacji, należy dodać symbol wieloznaczny („*”) do parametru -filter. Aby przeprowadzić rekursywne wyszukiwanie, zaczynając w określonej lokalizacji w Active Directory, należy użyć paramteru –searchbase. Początkowa lokalizacja wyszukiwania musi zostać dodana do parametru –searchbase jako wartość nazwy wyróżniającej. Nazwę wyróżniającą danej jednostki OU można sprawdzić w narzędziu Edycja ADSI. Łącze do narzędzia Edycja ADSI powinno znajdować się w folderze narzędzi administracyjnych. Jeśli z jakiegoś powodu skrót jest niedostępny, można zawsze utworzyć zawierającą go niestandardową konsolę zarządzania firmy Microsoft MMC. Aby otworzyć pustą konsolę MMC, kliknij przycisk Start, wpisz mmc w polu wyszukiwania i naciśnij klawisz ENTER lub kliknij przycisk Start, kliknij polecenie Uruchom, wpisz mmc i kliknij przycisk OK.

Mając pustą konsolę MMC, kliknij polecenie Dodaj/Usuń przystawkę w menu Plik, wybierz pozycję Edycja ADSI z listy Dostępne przystawki, klinij przycisj Dodaj i kliknij przycisk OK. Po dodaniu narzędzia Edycja ADSI do konsoli MMC kliknij prawym przyciskiem myszy polecenie Edycja ADSI, kliknij polecenie Połącz z i wybierz pozycję Domyślny kontekst nazewnictwa. Za pomocą strzałek z lewej strony przejdź do jednostki OU, do której chcesz wysłać kwerendę. Po odszukaniu odpowiedniej jednostki OU kliknij ją prawym przyciskiem myszy, a następnie kliknij polecenie Właściwości w menu skrótów. Zostanie wyświetlone okno dialogowe podobne do widocznego poniżej.

Mając dostęp do wszystkich atrybutów powiązanych z obiektem organizationalunit w AD, można dwukrotnie kliknąć atrybut distinguishedName, aby dokładniej przyjrzeć się tej wartości. Zostanie wyświetlone okno dialogowe podobne do poniższego.

Aby uniknąć wpisywania długiej i skomplikowanej wartości atrybutu distinguishedname (DN), często kopiuję ją bezpośrednio z okna dialogowego i wklejam do konsoli Windows PowerShell, klikając prawym przyciskiem myszy. Pełne polecenie widać poniżej:

PS C:\> Get-ADUser -Filter * -SearchBase "ou=hsg_TestOU,DC=nwtraders,dc=com"





DistinguishedName : CN=HSG_TestChild,OU=HSG_TestOU1,OU=HSG_TestOU,DC=NWTraders,DC=Com

Enabled           : False

GivenName         :

Name              : HSG_TestChild

ObjectClass       : user

ObjectGUID        : 4ffd4a5a-74f3-41ee-ae89-bbb8bd1bd915

SamAccountName    : HSG_TestChild

SID               : S-1-5-21-3746122405-834892460-3960030898-1161

Surname           :

UserPrincipalName :



DistinguishedName : CN=hsgUserGroupTest,OU=HSG_TestOU,DC=NWTraders,DC=Com

Enabled           : False

GivenName         :

Name              : hsgUserGroupTest

ObjectClass       : user

ObjectGUID        : b18e4543-36d5-48e3-b477-389a84ef2d1e

SamAccountName    : hsgUserGroupTest

SID               : S-1-5-21-3746122405-834892460-3960030898-1193

Surname           :

UserPrincipalName :

Domyślnie cmdlet Get-ADUser dokona automatycznej rekursji przez wszystkie podrzędne jednostki OU. Jeśli nie chcemy, aby została wykonana rekursja przez podrzędne jednostki OU, ponieważ interesują nas tylko użytkownicy z określonej OU, należy zmodyfikować parametr –searchScope. Do parametru searchscope można dodać trzy wartości: base, onelevel i subtree. Domyślnie cmdlet Get-ADUser zastosuje parametr searchscope z wartością subtree (co oznacza rekursję); dlatego też nie ma potrzeby dodawania tej wartości. Parametr searchscope z wartością base oznacza, że kwerenda nie wejdzie do bazy wyszukiwania (searchBase). W naszym przykładzie nie zwraca to żadnych użytkowników. Parametr searchScope z wartością onelevel spowoduje, że wyszukiwanie wejdzie do jednostki OU SearchBase, co w naszym przykładzie zwróci jednego użytkownika:

PS C:\> Get-ADUser -Filter * -SearchBase "ou=hsg_TestOU,DC=nwtraders,dc=com" -searchscope onelevel



DistinguishedName : CN=hsgUserGroupTest,OU=HSG_TestOU,DC=NWTraders,DC=Com

Enabled           : False

GivenName         :

Name              : hsgUserGroupTest

ObjectClass       : user

ObjectGUID        : b18e4543-36d5-48e3-b477-389a84ef2d1e

SamAccountName    : hsgUserGroupTest

SID               : S-1-5-21-3746122405-834892460-3960030898-1193

Surname           :

UserPrincipalName :



PS C:\>

Przeszukiwana hierarchia, widziana z poziomu Użytkownicy i komputery usługi Active Directory, została ukazana poniżej.

Jedną z największych zalet cmdletów AD DS jest możliwość użycia parametru –LDAPFilter. Tak więc np. dzięki cmdletowi Get-ADUser można pobrać listę wszystkich użytkowników z niewygasającymi hasłami. Taki skrypt można znaleźć w artykule z serii „Cześć, Skrypciarze” sprzed kilku lat. W skrypcie tym była użyta dość złożona kwerenda LDAP, która zwracała listę użytkowników o niewygasających hasłach. Odpowiedni fragment skryptu podajemy poniżej:

objCommand.CommandText = _

    "<LDAP://dc=fabrikam,dc=com>;" & _

        "(&(objectCategory=User)(userAccountControl:1.2.840.113556.1.4.803:=65536));" & _

            "Name;Subtree"

Kwerenda dialektu LDAP składa się z czterech części. Pierwsza to lokalizacja kwerendy LDAP, druga to filtr LDAP, trzecia określa właściwości, które mają zostać zwrócone, a ostatnia to zakres wyszukiwania. W cmdlecie Get-ADUser mamy parametry dla każdej z nich. Dlatego też interesuje nas jedynie kwerenda filtra LDAP:

"(&(objectCategory=User)(userAccountControl:1.2.840.113556.1.4.803:=65536));"

Kopiując kwerendę filtra LDAP należy pominąć końcowy średnik. Jest to pozostałość po poprzedniej kwerendzie — poszczególne części kwerendy dialektu LDAP są oddzielone średnikami. Kwerenda ta trafia bezpośrednio do parametru. Nie ma potrzeby używania dodatkowych cudzysłowów ani innych znaków jako znaków ucieczki. Poniższe jednowierszowe polecenie ma taki sam skutek, jak starszy skrypt w języku VBScript, który wymagał 17 wierszy (polecenie zawinie się po wpisaniu do konsoli Windows PowerShell):

PS C:\> Get-ADUser -SearchBase "dc=nwtraders,dc=com" -searchscope subtree -ldapfilter _

    "(&(objectCategory=User)(userAccountControl:1.2.840.113556.1.4.803:=65536))"



DistinguishedName : CN=Guest,CN=Users,DC=NWTraders,DC=Com

Enabled           : False

GivenName         :

Name              : Guest

ObjectClass       : user

ObjectGUID        : 5b0b1ce3-808f-4976-b80e-356adc1dc7e6

SamAccountName    : Guest

SID               : S-1-5-21-3746122405-834892460-3960030898-501

Surname           :

UserPrincipalName :



DistinguishedName : CN=another User,OU=HSG_TestOU,DC=NWTraders,DC=Com

Enabled           : True

GivenName         : another

Name              : another User

ObjectClass       : user

ObjectGUID        : f8315b67-ee23-486d-9bfc-a5e118f0392a

SamAccountName    : anotherUser

SID               : S-1-5-21-3746122405-834892460-3960030898-1202

Surname           : User

UserPrincipalName : anotherUser@NWTraders.Com



DistinguishedName : CN=AHappy Camper,OU=HSG_TestOU,DC=NWTraders,DC=Com

Enabled           : True

GivenName         : AHappy

Name              : AHappy Camper

ObjectClass       : user

ObjectGUID        : 6852f2bc-37d5-46b5-b6da-4365c7009dfc

SamAccountName    : AHappyCamper

SID               : S-1-5-21-3746122405-834892460-3960030898-1203

Surname           : Camper

UserPrincipalName : AHappyCamper@NWTraders.Com



PS C:\>

I to już wszystkie sekrety wyszukiwania użytkowników przy użyciu cmdletów AD DS. Jutro przedstawimy kolejny skrypt z serii poświęconej przeszukiwaniu Active Directory.

Skrypciarze Ed Wilson i Craig Liebendorfer

 Do początku strony Do początku strony

Centrum skryptów - Active Directory