Centrum skryptów - Active directory

Jak skopiować właściwość numer telefonu do właściwości opis użytkowników?

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 skopiować właściwość numer telefonu do właściwości opis użytkowników?

Hey, Scripting Guy! Question

Cześć Skrypciarze! Jak skopiować numery telefonów użytkowników w katalogu Active Directory do ich opisów?

-- DL

Hey, Scripting Guy! Answer

Hej, DL. Wiecie co? Skrypciarz piszący do tej rubryki, uważa dzisiejszy odcinek za swój ulubiony. Dlaczego? Ponieważ gdy czytacie go w pracy, on jeszcze nie wstał z łóżka. (A nawet jeśli wstał, to kręci się po domu jedząc pączki i oglądając TV) To jest życie, nie?

A, tak, dobre pytanie: jak może pisać do rubryki, jeśli śpi o 10 rano? Kim on jest, mistrzem sztuk tajemnych, czy co?

Nie, jasne, że nie. Po prostu - momencik, tak, oczywiście, jest mistrzem sztuk tajemnych, złym czarnoksiężnikiem, który rzuci na was okropny urok, jeśli nie prześlecie mu 19.95$. Żadnych czeków, tylko karty kredytowe lub przekazy. Nasi operatorzy czekają.

Co jest? Mówicie, że troszkę się boicie, ale chcielibyście zobaczyć demonstrację jego mocy przed wpłatą pieniędzy? No dobrze, da się zrobić, ale pamiętajcie - sami się o to prosiliście. Poczekajcie chwilę, wzywamy Demony Zaświatów (Bogu dzięki za wiadomości błyskawiczne).

OK, zaczynamy. Na potęgę Posępnego Czerepu, nakazujemy wam skopiować właściwość numer telefonu do opisu, dla każdego z użytkowników w domenie:

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 FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user'"  



Set objRecordSet = objCommand.Execute



objRecordSet.MoveFirst



Do Until objRecordSet.EOF

    strUserPath = objRecordSet.Fields("AdsPath").Value

    Set objUser = GetObject(strUserPath)

    strTelephone = objUser.telephoneNumber

    objUser.Description = strTelephone

    objUser.SetInfo

    objRecordSet.MoveNext

Loop

Przepraszamy za to. Dym zaraz opadnie, ale zapach siarki może się utrzymywać trochę dłużej.

OK. Jak się okazuje, nie mamy czasu by dokładnie omówić ten skrypt, przy najmniej nie część wyjaśniającą przeszukiwanie katalogu Active Directory. W końcu zaraz będzie Oprah w telewizji. Ale nie wpadajcie w rozpacz, jeśli chcecie poznać podstawy wyszukiwania w katalogu Active Directory, zobaczcie dwuczęściowy artykuł Stary, gdzie moja drukarka? dostępny teraz za jedyne 19.95$. Nasi operatorzy czekają.

Jak się nad tym zastanowić, to chyba ten artykuł jest dostępny za darmo. Ale możecie i tak wysłać pieniądze, tak na wszelki wypadek.

Właściwie, to jedyne co dziś zrobimy, to wyjaśnimy, że następujące zapytanie zostało użyte do wybrania wartości atrybutu ADsPath dla wszystkich użytkowników (objectCategory='user') w domenie fabrikam.com:

objCommand.CommandText = "SELECT AdsPath FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user'"

Dlaczego akurat atrybut ADsPath? No więc, ADsPath zwraca łańcuch połączenia, ułatwiający powiązanie z kontem użytkownika w Active Directory. Przykładowo:

LDAP://cn=Ken Myer,ou=Finance,dc=fabrikam,dc=com

To ważne, ponieważ podczas przeszukiwania katalogu Active Directory nasze kwerendy można tylko odczytywać, nie możemy napisać więc jakiejś kwerendy aktualizującej, która automatycznie skopiuje numer telefonu użytkownika do jego opisu. Zamiast tego, musimy stworzyć powiązanie z każdym pojedynczym kontem użytkownika i skopiować numer telefonu do opisu. (Wiemy, wydaje się to powolne i żmudne. Ale całą pracę wykona skrypt - i o ile nie mamy kilku milionów kont użytkowników - wszystko to potrwa dość krótko.)

Po wywołaniu metody Execute i przeprowadzeniu kwerendy uzyskujemy zbiór rekordów zawierający wartość ADsPath dla każdego użytkownika w domenie. Tworzymy wtedy pętlę Do Until, która będzie wykonywana, aż właściwość EOF (End-Of-File - koniec pliku) zbioru rekordów przyjmie wartość true. Czyli, aż przejdziemy przez wszystkie rekordy w zbiorze:

Do Until objRecordSet.EOF

Pierwszą rzeczą, którą robimy w pętli jest pobranie wartości atrybutu ADsPath i zapisanie go w zmiennej o nazwie strUserPath. Następnie użyjemy tej zmiennej do połączenia z obiektem konta danego użytkownika. To właśnie robią te dwa wiersze kodu:

strUserPath = objRecordSet.Fields("AdsPath").Value Set 

objUser = GetObject(strUserPath)

Po utworzeniu połączenia bierzemy wartość atrybutu telephoneNumber i zapisujemy w zmiennej strTelephone. Następne dwa wiersze kodu przypisują atrybutowi Description użytkownika jego numer telefonu:

objUser.Description = strTelephone 

objUser.SetInfo

Cokolwiek robicie, nie zapomnijcie o wywołaniu metody SetInfo - to ona właśnie zapisuje zmiany z powrotem do katalogu Active Directory. Jeśli nie wywołamy SetInfo zmiany zostaną dokonane w pamięci, ale nie w Active Directory.

Następnie, wywołujemy metodę MoveNext, by przejść do kolejnego rekordu w zbiorze i powtarzamy procedurę dla następnego użytkownika.

I tak, mogliśmy połączyć kilka wierszy kodu, aby zmniejszyć rozmiar skryptu. Jednak uznaliśmy, że ta metoda będzie łatwiejsza do zrozumienia.

Ponieważ czujemy na karku oddech prawników Microsoftu, powinniśmy prawdopodobnie powiedzieć całą prawdę i wyjaśnić, że piszący do tej rubryki Skrypciarz nie jest złym czarnoksiężnikiem i nie ma mocy magicznych. (Trochę kiedyś żonglował, ale to się chyba nie liczy.) Zamiast tego, piszący do tej rubryki Skrypciarz jest właśnie na urlopie do końca roku. Napisał jednak kilka dodatkowych rubryk, by pomóc wszystkim przetrwać ten tydzień i doczekać do jego powrotu. Cóż za wspaniałe i bezinteresowne poświęcenie, prawda?

Uwaga: OK, tak naprawdę nie zrobił tego z uprzejmości. Napisał te kilka rubryk, bo tak mu kazał Skryptujący Redaktor. A zawsze robimy cokolwiek Skryptujący Redaktor powie, ponieważ jak wszyscy redaktorzy, jest ona naprawdę adeptką sztuk tajemnych. Co, myśleliście, że Peter Constantini od urodzenia jest żabą?

Odwagi, Peter: nie będzie się wiecznie gniewać.

 Do początku strony Do początku strony

Centrum skryptów - Active directory