Centrum skryptów - Active directory

Jak wyszukać w katalogu Active Directory nazwy użytkowników z arkusza Excel?

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 wyszukać w katalogu Active Directory nazw użytkowników z arkusza Excel?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak pobrać nazwy użytkowników z arkusza Excel, wyszukać je w katalogu Active Directory, a następnie zaznaczyć, czy dany użytkownik został znaleziony?

--SD

Cześć Skrypciarze! Odpowiedź

Hej, SD. Jedną z wad pisania do rubryki poświęconej skryptom jest fakt, że ludzie nigdy ci nie wierzą. Po pierwsze, nie wierzą, że codziennie piszesz do tej rubryki. (No dobrze: sporo z nich wierzy, że piszesz, nie mogą jedynie domyślić się po co piszesz).

Po drugie, nie zawsze są przekonani, że wiesz o czym piszesz, przynajmniej jeśli chodzi o rubrykę. Do tego wszystkiego, rubryka zajmuje się różnorodnymi tematami - począwszy od wyczynów Franka "Home Run" Bakera poprzez kota Schrodingera do genezy Dnia Dziadka. Wszystko to w porządku, ale czy coś z tego jest właściwie prawdą?

Przykładowo, nie ma wątpliwości, że sporo czytelników wykazało sceptyczne podejście, gdy w tej rubryce pierwszy raz poruszono temat turduckena: indyka nadzianego kaczką nadzianą kurczakiem. "Kurczak w kaczce w indyku?" - kręcili nosami. "Dlaczego w takim razie nie nadziać indykiem sarny, sarną niedźwiedzia, a niedźwiedziem hipopotama?"

Hmmm…. Myślicie to samo, co my?

Jak się jednak okazało, tym razem tworzący rubrykę Skrypciarz wiedział, o czym pisze. Spójrzmy na wiadomość e-mail, jaką otrzymał od Bannona O'Leary'ego:

“Tak, żebyście wszyscy wiedzieli, że turducken istnieje naprawdę i jest piekielnie dobrym żarciem." Jako świeży przeszczep do Nashville, TN z Nowego Orleanu, myślałem, że to będzie moje pierwsze od dłuższego czasu Święto Dziękczynienia bez turduckena. Na szczęście podróż w interesach przywiodła mnie z powrotem do Nowego Orleanu. Szybki wypad do delikatesów Gourmet Butcher Block na zachodnim brzegu i miałem zagwarantowaną wspaniałą potrawę na Dziękczynienie."

Widzicie: ten Skrypciarz, który pisze do tej rubryki miał rację! Czy teraz wierzycie mu, gdy mówi, że Skryptujący Redaktor lata na miotle do pracy? (Uwaga redaktora: biorąc pod uwagę, że piszący do tej rubryki Skrypciarz oskarżył także Skryptującego Redaktora obycie mugolem, najwyraźniej nie może miećzawsze racji.)

Morał z tej opowieści płynie taki, że zawsze możecie wierzyć rubryce Cześć Skrypciarze!, przynajmniej gdy chodzi o głupoty, którymi nikt inny nie zawraca sobie głowy. A co, gdy chodzi o odpowiedzi dotyczące skryptów, zwłaszcza na pytania typu: jak pobrać nazwy użytkowników z arkusza Excel, wyszukać tych użytkowników w katalogu Active Directory, a potem zaznaczyć, czy danego użytkownika odnaleziono, czy też nie? To już będziecie musieli ocenić sami:

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 



Set objExcel = CreateObject("Excel.Application") 

Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls") 

objExcel.Visible = True



i = 1



Do Until objExcel.Cells(i, 1).Value = "" 

    strName = objExcel.Cells(i,1) 

    objCommand.CommandText = _ 

            "SELECT * FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _ 

                "AND samAccountName='" & strName & "'" 

    Set objRecordSet = objCommand.Execute



    If objRecordset.RecordCount = 1 Then 

        objExcel.Cells(i,2) = "Znaleziono" 

    Else 

        objExcel.Cells(i,2) = "Nie znaleziono" 

    End If

    

    i = i + 1 

    objRecordset.Close 

Loop



objConnection.Close

Macie rację: to jest ciut dłuższe, niż skrypty zazwyczaj tu omawiane. Czy to jakiś problem dla Skrypciarzy? Jasne, że nie. Zwłaszcza, że większą część skryptu i tak zignorujemy. W szczególności nie będziemy w ogóle omawiać przeszukiwania katalogu Active Directory; ten temat jest po prostu zbyt skomplikowany dla rubryki Cześć Skrypciarze! Ale nie rozpaczajcie: jeśli nie znacie wszystkich szczegółów pisania skryptów przeszukujących katalogi Active Directory, wystarczy spojrzeć na dwuczęściowy artykuł Stary, gdzie moja drukarka? (j.ang.)

Pamiętając o tym, po prostu ominiemy pierwsze osiem wierszy kodu i zaczniemy od tego miejsca, od trzech wierszy w których tworzymy egzemplarz obiektu Excel.Application , używamy metody Open, żeby otworzyć plik C:\Scripts\Test.xls, a następnie nadajemy właściwości Visible obiektu Excel wartość True:

Set objExcel = CreateObject("Excel.Application")

Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls")

objExcel.Visible = True

Co to właściwie robi? Dostajemy działący egzemplarz arkusza Test.xls, którzy możemy zobaczyć na ekranie, egzemplarz - który dla naszych celów - wygląda tak:

Jak widać, w naszej wersji Test.xls nie ma zbyt wiele. W kolumnie A mamy listę elementów samAccountNames; w kolumnie B mamy, no cóż, nic nie mamy. Ale nie ma co się martwić: zanim skończymy, użyjemy kolumny B do zaznaczenia, czy dane elementy sam AccountNames znajdują się w katalogu Active Directory.

Po uruchomieniu programu Excel naszym kolejnym zadaniem jest przydzielenie wartości 1 zmiennej i, która będzie służyła jako licznik wskazujący naszą pozycję w arkuszu. Następnie tworzymy pętlę Do Until, która jest wykonywana do napotkania pustej komórki w kolumnie A:

Do Until objExcel.Cells(i, 1).Value = ""

I tak, słuszna uwaga: skrypt zakłada, że wprowadzając nazwy użytkowników nie pominiemy żadnego wiersza. Przykładowo, załóżmy, że mamy wprowadzone nazwy samAccountNames w wierszach 1 i 3, ale z jakiegoś powodu w rzędzie 2 jest pusta komórka. Po uruchomieniu, skrypt poszuka tylko nazwy z rzędu 1. Dlaczego? Dzieje się tak, ponieważ po dotarciu do pustej komórki w drugim rzędzie, skrypt zakłada, że dotarł do końca danych i automatycznie opuszcza pętlę Do Until.

Wystarczy tylko pilnować, żeby nie opuszczać rzędów podczas wprowadzania danych.

Co więc dzieje się wewnątrz pętli Do Until? Na początku przydzielamy wartość komórki w pierwszym rzędzie i pierwszej kolumnie zmiennej o nazwie strName (pamiętajmy, i ma na początku wartość 1):

strName = objExcel.Cells(i,1)

Po przydzieleniu pierwszej wartości samAccountName zmiennej strName tworzymy zapytanie SQL, żeby przeszukać fabrikam.com pod kątem obiektów, których: 1) element objectCategory ma wartość user; i, 2) ich element samAccountName ma taką samą wartość jak strName:

objCommand.CommandText = _

"SELECT * FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _

"AND samAccountName='" & strName & "'"

Następnie wywołujemy metodę Execute, by wywołać zapytanie i w wartości zwrotnej dostajemy zbiór rekordów, w skład którego wchodzą wszyscy użytkownicy dla których składowa samAccountName ma wartość równą wartości strName:

Set objRecordSet = objCommand.Execute

Jak zapewne wiecie, wartości samAccountNames muszą być niepowtarzalne wewnątrz domeny. Oznacza to, że nasz zbiór rekordów będzie zawierał albo 0 rekordów (bo nie udało się znaleźć konta użytkownika o danej nazwie), albo 1 rekord (bo skrypt znalazł użytkownika o danej nazwie). To zaś oznacza, że możemy określić, czy dana nazwa została znaleziona po prostu sprawdzając wartość właściwości RecordCount zbioru rekordów (jak sama nazwa wskazuje, wartość ta wskazuje na liczbę rekordów w zbiorze rekordów).

If objRecordset.RecordCount = 1 Then

Jeśli RecordCount ma wartość 1, ustawiamy wartość rzędu 1, kolumny 2 na Znaleziono; w przeciwnym wypadku rząd 1, kolumna 2 przybiera wartość Nie znaleziono. To właśnie robimy tutaj:

If objRecordset.RecordCount = 1 Then 

    objExcel.Cells(i,2) = "Znaleziono" 

Else 

    objExcel.Cells(i,2) = "Nie znaleziono" 

End If

Następnie zwiększamy wartość zmiennej i o 1, co oznacza, że w kolejnym przejściu pętli będziemy sprawdzać wartość rzędu 2, kolumny 1. Po tym zamykamy zbiór rekordów i zaczynamy pętlę od nowa, powtarzając całą procedurę dla kolejnego rzędu arkusza. Po zakończeniu zamykamy połączenie z katalogiem Active Directory i wyświetlamy gotowe wyniki:

Nie najgorzej, przyznajcie.

OK, gdy już pozbyliśmy się skryptów, możemy wrócić do naprawdę ważnego tematu: turduckena. Cytując Bannona: "Moim największym problemem jest: co z nim zrobić, moja żona jest wegetarianką, a syn dopiero pracuje nad pierwszym zębem. 16 funtów indyka, kaczki i kurczaka wystarczy na mnóstwo kanapek."

Tak, to jest prawdziwy problem, prawda? Wiesz co, Bannon: zawsze, kiedy zostaje ci 16 funtów odpadków ze Święta Dziękczynienia, wysyłaj je Skrypciarzowi, który tworzy tą rubrykę.

A, to się tyczy wszystkich, którym coś zostało po Święcie Dziękczynienia.

 Do początku strony Do początku strony

Centrum skryptów - Active directory