Czy mogę wysłać do Active Directory kwerendę o użytkownikach, których hasła nie wygasają?
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 |