Centrum Skrypciarzy - Active Directory

Jak dołączyć prefiks do numerów telefonów wszystkich użytkowników mojej domeny?

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 dołączyć prefiks do numerów telefonów wszystkich użytkowników mojej domeny?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak dołączyć prefiks do numerów telefonów wszystkich użytkowników mojej domeny?

-- JB

Cześć Skrypciarze! Odpowiedź

Cześć, JB. Piszący te słowa Skrypciarz dostał ostatnio zaproszenie na ślub. Tak, kolejny ślub w ciągu sześciu miesięcy. Pojechał oczywiście, a było to bardzo daleko i sporo go to kosztowało. Dosłownie i w przenośni. Nie żałuje jednak niczego, gdyż ceremonia ta była to najkrótsza z dotychczasowych. Skrypciarz piszący te słowa należy po prostu do osób, które nie lubią, kiedy ceremonia się wydłuża i uważa, że jeżeli coś ma zostać zrobione, należy to zrobić szybko. Dlatego też przygotowanie odpowiedzi nie zajęło mu dużo czasu:

On Error Resume Next



Const ADS_SCOPE_SUBTREE = 2



Set objConnection = CreateObject("ADODB.Connection")

Set objCommand =   CreateObject("ADODB.Command")

objConnection.Provider = "ADsDSOObject"

objConnection.Open "Active Directory Provider"

Set objCommand.ActiveConnection = objConnection



objCommand.Properties("Page Size") = 1000

objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 



objCommand.CommandText = _

    "SELECT ADsPath, telephoneNumber FROM " & _

        "'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user'"  

Set objRecordSet = objCommand.Execute



objRecordSet.MoveFirst

Do Until objRecordSet.EOF

    strUser = objRecordSet.Fields("ADsPath").Value

    strPhoneNumber = "425-" & objRecordSet.Fields("telephoneNumber").Value

    Set objUser =  GetObject(strUser)

    objUser.telephoneNumber = strPhoneNumber

    objUser.SetInfo

    objRecordSet.MoveNext

Loop

Jak każe wieloletnia tradycja Skrypciarzy, wyjaśniona zostanie tylko część tego skryptu. A to dlatego, że jakieś pierwsze 9 wierszy to standardowy kod stosowany do przeszukiwania usługi Active Directory; może on być używany w niezmienionej postaci praktycznie w każdym skrypcie wyszukiwania w Active Direktory. Ale nie musicie nam wierzyć na słowo, możecie się o tym przekonać, zaglądając do dwuczęściowego artykułu z serii Tales From the Script (j.ang.), gdzie znajduje się wyjaśnienie takich terminów, jak ADODB.Connection oraz ADsDSOObject.

Nie mamy jednak zamiaru całkiem wykręcać się od odpowiedzialności za wyjaśnienia. Dlatego też poświęcimy kilka chwil na omówienie poniższego wiersza kodu:

objCommand.CommandText = _

    "SELECT ADsPath, telephoneNumber FROM " & _

        "'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user'"

Jak można się było spodziewać, jest to wiersz kodu określający kryteria, które zostaną zastosowane podczas przeszukiwania Active Directory. Przeszukujemy teraz domenę o nazwie fabrikam.com. Czego dokładnie szukamy? Szukamy jedynie kont użytkowników; a wiemy o tym, ponieważ zastosowaliśmy wyrażenie WHERE, ograniczające uzyskane dane do obiektów, w przypadku których obiekt objectCategory ma wartość user. (Jak się można domyślić, wartość tę mają jedynie konta użytkowników.) A gdybyśmy tak, zamiast tego, chcieli wyszukać konta komputerów? Żaden problem; należałoby tylko zmienić właściwość CommandText, żeby wyglądała tak:

objCommand.CommandText = _

    "SELECT ADsPath, telephoneNumber FROM " & _

        "'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='computer'"

To było całkiem proste. A skoro już jesteśmy przy temacie uzyskanych danych, za każdym razem, gdy przeszukujemy Active Directory, musimy określić wartości atrybutów, które chcemy uzyskać. (Nie należy próbować polecenia „Select * FROM”; można się na tym nieźle zawieść). W naszym skrypcie chcemy pobrać wartości dwóch atrybutów: ADsPath, który z grubsza odpowiada ścieżce dostępu do usługi Active Directory (umożliwiając nam w ten sposób lokalizację indywidualnego konta użytkownika); oraz telephoneNumber, będącą akurat numerem telefonu użytkownika.

Określiwszy kryteria wyszukiwania, wywołujemy metodę Execute, która uruchomi zapytanie i przekaże nam zbiór rekordów składający się z użytkowników znalezionych w Active Directory, wraz ze ścieżką ADsPath oraz numerem telefonu:

Set objRecordSet = objCommand.Execute

Innymi słowy, otrzymamy listę użytkowników oraz ich aktualne numery telefonów. Teraz musimy tylko dodać do każdego z tych numerów telefonu prefiks.

Jak chcemy to zrobić? Na początek warto zauważyć, że wyszukiwania Active Directory mają charakter wyszukiwań tylko do odczytu; nie możemy napisać zapytania zmieniającego wartości atrybutów. (Gdyby ktoś się zastanawiał, dlaczego nie zastosowaliśmy zapytania SQL Update, cóż, teraz już wie.) Zamiast tego, musimy pojedynczo połączyć się z każdym kontem użytkownika, a następnie kolejno zmieniać numery telefonów. Wprawdzie mogliśmy odrobinę skrócić ten skrypt, łącząc kilka poniższych wierszy kodu, które omówimy za chwilę. Jednak chcąc przedstawić wszystko w sposób przejrzysty, zdecydowaliśmy się rozbić ten proces na kilka pomniejszych etapów, rozpoczynając od:

strUser = objRecordSet.Fields("ADsPath").Value

Pobieramy teraz ścieżkę ADsPath dla pierwszego użytkownika w zbiorze rekordów i zachowujemy ją w zmiennej o nazwie strUser; wartość ta będzie wyglądać podobnie do poniższej:

LDAP://CN=Ken Myer,OU=Finance,dc=fabrikam,dc=com

Po uzyskaniu ścieżki ADsPath, stosujemy następujący wiersz kodu w celu utworzenia nowego numeru telefonu dla pierwszego użytkownika:

strPhoneNumber = "425-" & objRecordSet.Fields("telephoneNumber").Value

W tym wypadku, dołączamy prefiks 425- na początku każdego numeru telefonu; jest to przykładowy kod rejonu. Jak widać, jest to bardzo prosty wiersz kodu: po prostu łączymy prefiks 425- z aktualnym numerem telefonu użytkownika (objRecordSet.Fields("telephoneNumber").Value), a następnie przypisujemy otrzymaną wartość do zmiennej o nazwie strPhoneNumber.

Należy zwrócić uwagę na fakt, iż dla prostoty zakładamy, że wszyscy użytkownicy mają numer telefonu oraz że nie zawierają one kodu rejonu. W zależności od naszych ustawień, takie założenie może okazać się zgubne. Ale to nic; w całkiem prosty sposób możemy stworzyć pewne zabezpieczenia w skrypcie, które pomogą zapobiec przypisaniu „numeru telefonu” 425– komuś, kto obecnie nie ma numeru telefonu lub przypisaniu komuś innemu numeru telefonu wyglądającego tak: 425-425-555-1981 (ponieważ numer telefonu tego użytkownika już wcześniej zawierał kod rejonu). Na przykład, zanim dodamy prefiks, możemy zastosować funkcję IsNull w celu sprawdzenia, czy użytkownik posiada numer telefonu:

If Not IsNull(objRecordSet.Fields("telephoneNumber").Value) Then

Innymi słowy, jeżeli telephoneNumber nie ma wartości Null (tzn., jeżeli ma jakąkolwiek wartość), możemy dodać prefiks. A co, jeżeli numer telefonu ma wartość Null, tzn. użytkownik nie ma telefonu? W takim wypadku należy skonfigurować skrypt tak, aby pominąć danego użytkownika i przejść od razu do kolejnego.

Jeżeli chodzi o sprawdzenie, czy kod rejonu został już dodany do numeru telefonu, no cóż, poniższy wiersz kodu powinien to załatwić:

If Left(objRecordSet.Fields("telephoneNumber").Value, 4) <> "425-" Then

Widzimy, jak to działa? Stosujemy tutaj funkcję Left w celu sprawdzenia czterech pierwszych znaków w numerze telefonu. Jeżeli te znaki to 425-, nie robimy nic; uruchamiamy pętlę i pracujemy z kolejnym rekordem w zbiorze. Jeżeli pierwsze cztery znaki są inne niż 425-, dodajemy prefiks. To naprawdę jest całkiem proste i nie powinniśmy mieć żadnych problemów z dodaniem kodu. Możemy teraz zmienić numer telefonu, do czego użyjemy następujących wierszy kodu:

Set objUser =  GetObject(strUser)

objUser.telephoneNumber = strPhoneNumber

objUser.SetInfo

W pierwszym wierszu łączymy się z kontem użytkownika w usłudze Active Directory. W drugim wierszu przypisujemy nowy numer telefonu (zachowany w zmiennej o nazwie strPhoneNUmber) do atrybutu telephoneNumber tego konta. Następnie, w wierszu trzecim, wywołujemy metodę SetInfo i zapisujemy nowy numer telefonu do Active Directory.

Czego byśmy nie robili, nie wolno nam opuścić metody SetInfo; jeżeli tak się stanie, numer telefonu się nie zmieni. Nie należy także opuszczać poniższego wiersza kodu:

objRecordSet.MoveNext

Jeżeli opuścimy ten wiersz, skrypt nigdy nie przejdzie do następnego rekordu w zbiorze; zamiast tego, będzie się ciągnął bez końca i nigdzie nas to nie doprowadzi.

I to już wszystko. Nie trwało dłużej niż ślub.

 Do początku strony Do początku strony

Centrum Skrypciarzy - Active Directory