Centrum Skrypciarzy - Active Directory

Jak skonfigurować konto Active Directory w taki sposób, by hasło nigdy nie wygasało?

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 skonfigurować konto Active Directory w taki sposób, by hasło nigdy nie wygasało?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! W jaki sposób skonfigurować konto użytkownika Active Directory w taki sposób, by konto nigdy nie wygasało?

-- BB

Cześć Skrypciarze! Odpowiedź

Cześć, BB. Zanim zaczniemy, chcemy jedno pytanie zadać Tobie, BB. Czy zgadzasz się, że Paragraf 22 to jedna z najlepszych książek w historii? Otóż, widzisz, Syn Skrypciarza piszącego te słowa miał niedawno za zadanie wybrać i przeczytać jedną książkę z listy przygotowanej przez nauczyciela. Zwrócił się więc do Skrypciarza piszącego te słowa po fachową poradę. Tak się składa, że był tam między innymi Paragraf 22, jedna z najlepszych książek w historii. Syn Skrypciarza poszedł więc za radą ojca i zabrał się za lekturę. Od tego czasu Skrypciarz piszący te słowa musi wysłuchiwać niekończącej się litanii narzekań:

  • Ta książka jest jakaś dziwna.
  • Ta książka jest bez sensu!
  • Ta książka miała być dobra!
  • To wszystko twoja wina!
Uwaga. Ostania kwestia nie ma nic wspólnego z Paragrafem 22. To standardowe, codzienne narzekanie bez żadnego powodu.

Ponieważ Skrypciarz piszący te słowa jest kiepski w dyskusjach, postanowił zebrać opinie jak największej liczby osób, które go poprą. Jeśli to nie przekona Syna, że Paragraf 22 to dobra książka, to nic go nie przekona…

Tak czy inaczej, oto skrypt, który skonfiguruje konto użytkownika Active Directory w taki sposób, by jego hasło nigdy nie wygasało:

Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000

 

Set objUser = GetObject("LDAP://cn=Ken Myer, ou=Finance, dc=fabrikam, dc=com")



intUserAccountControl = objUser.Get("userAccountControl")

 

If Not objUser.userAccountControl AND ADS_UF_DONT_EXPIRE_PASSWD Then

    objUser.Put "userAccountControl", _

        objUser.userAccountControl XOR ADS_UF_DONT_EXPIRE_PASSWD

    objUser.SetInfo

End If

Jak widać, skrypt zaczyna się od zdefiniowania zmiennej o nazwie ADS_UF_DONT_EXPIRE_PASSWD, której przypisujemy szesnastkową wartość &h10000. Zmienna ta będzie nam potrzebna już za chwilę.

Teraz łączymy się z kontem naszego dobrego kumpla Kena Myera w Active Directory. Ponieważ nazwa CN konta to Ken Myer, a konto znajduje się w jednostce OU Finance, w domenie Fabrikam.com, aby się z nim połączyć potrzebny jest kod wyglądający tak:

Set objUser = GetObject("LDAP://cn=Ken Myer, ou=Finance, dc=fabrikam, dc=com")

Teraz zaczyna się robić trochę dziwnie (ale tylko trochę). Jak się okazuje, właściwość Active Directory określająca, czy hasło wygasa, znajduje się wewnątrz właściwości userAccountControl property. Właściwość userAccountControl jest właściwością typu „maska bitów”, co oznacza, że zawiera ona więcej niż jedną wartość. Jakie to ma znaczenie? Otóż takie, że nie możemy tej wartości ustawić po prostu na True albo False. Musimy przełączyć odpowiednią wartość, tę, która odpowiada za wygasanie haseł. To właśnie dlatego niektóre fragmenty kodu, które zaraz omówimy, wyglądają niezwykle.

Uwaga. Nie będziemy dziś szczegółowo wyjaśniać operacji na maskach bitów. Zainteresowanych odsyłamy do przewodnika Microsoft Windows 2000 Scripting Guide (j.ang.).

Kolejnym krokiem jest sprawdzenie, czy przypadkiem dany użytkownik już nie ma hasła, które nie wygasa – wtedy nie musielibyśmy nic robić. Używamy więc poniższego wiersza kodu, który sprawdzi, czy właściwość „hasło nie wygasa” (oznaczone stałą: ADS_UF_DONT_EXPIRE_PASSWD) nie jest włączona (zwróćmy uwagę na składnię If Not):

If Not objUser.userAccountControl AND ADS_UF_DONT_EXPIRE_PASSWD Then

Tak jak mówiliśmy, właściwość userAccountControl składa się z kilku osobnych wartości; można to sobie wyobrazić jako zespół przełączników czy guzików. My chcemy sprawdzić, czy przełącznik odpowiedzialny za niewygasanie hasła (oznaczony, przypomnijmy, stałą ADS_UF_DONT_EXPIRE_PASSWD) jest włączony. Jeśli tak, to nic więcej nas nie obchodzi. Jeśli nie, musimy goi włączyć.

Właśnie do tego posłużą nam poniższe dwa wiersze kodu. W pierwszym z nich używamy metody Put, by zmienić wartość userAccountControl w buforze lokalnym. (Czemu akurat w buforze lokalnym? Szczegółowe informacje na ten temat znajdują się w tej zagadce skrypciarskiej (j.ang.)) Zwróćmy uwagę, że przekazujemy metodzie Put dwa parametry:

  • userAccountControl, czyli właściwość, którą chcemy zmodyfikować.
  • objUser.userAccountControl XOR ADS_UF_DONT_EXPIRE_PASSWD, czyli kod bitowy przełączający bieżącą wartość właściwości „hasło nie wygasa”. Mówimy tu coś takiego: jeśli przełącznik (czyli właściwość) oznaczony zmienną ADS_UF_DONT_EXPIRE_PASSWD jest włączony, wyłącz go; jeśli jest wyłączony, włącz go. Nie jest to trudne, ponieważ operator XOR po prostu przełącza wartości bitowe. Dlatego właśnie musieliśmy najpierw sprawdzić, czy hasło Kena Myera obecnie wygasa, czy nie – gdyby było niewygasające, XOR przestawiłby je na wygasające.

W kolejnym wierszu wywołujemy metodę SetInfo, która zapisze zmiany w Active Directory. I to już wszystko.

Domyslamy się, że wielu z Was bardziej ucieszyłoby się z odwrotnego skryptu – takiego, który zmieni hasło niewygasające na wygasające. Tak się składa, że mamy taki pod ręką:

Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000

 

Set objUser = GetObject("LDAP://cn=Ken Myer, ou=Finance, dc=fabrikam, dc=com")



intUserAccountControl = objUser.Get("userAccountControl")

 

If objUser.userAccountControl AND ADS_UF_DONT_EXPIRE_PASSWD Then

    objUser.Put "userAccountControl", _

        objUser.userAccountControl XOR ADS_UF_DONT_EXPIRE_PASSWD

    objUser.SetInfo

End If
 Do początku strony Do początku strony

Centrum Skrypciarzy - Active Directory