Centrum skryptów - Active Directory

Jak pobrać listę aktywnych grup usługi Active Directory, które posiadają maksymalnie 1 uczestnika?

Udostępnij na: Facebook

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.

Jak pobrać listę aktywnych grup usługi Active Directory, które posiadają maksymalnie 1 uczestnika?

Cześć, Skrypciarze! Próbuję uporządkować naszą usługę Active Directory i w tym celu chcę utworzyć listę wszystkich grup zawierających maksymalnie 1 uczestnika. Jak napisać skrypt, który przekaże mi te informacje?

-- DR

Cześć, DR. Zanim odpowiem na to pytanie, chciałbym podzielić się z Wami pewnymi refleksjami natury kulinarnej.

Myślałem sobie ostatnio o wegetarianach i w ogóle o wszelkiego rodzaju rzeczach do jedzenia, których nie lubię. Moim zdaniem istnieją pewne rzeczy, których ludzie nigdy nie powinni brać do ust. Na pierwszym miejscu tej listy powinna być wątróbka zaraz obok tofu. Dochodzą do tego jeszcze warzywa. Pobuszowałem trochę po Internecie, chcąc dowiedzieć się, jakich warzyw ludzie nie lubią najbardziej. Nie wiem, na ile wyniki moich poszukiwań mogą być wiarygodne, ale okazało się, że młodzież najbardziej nie lubi następujących warzyw:

  1. Szparag
  2. Szpinak
  3. Brukselka
  4. Kabaczek
  5. Buraki

Ja mam nieco inne wyobrażenie na ten temat. W końcu szparagi są bardzo dobre, kiedy się je odpowiednio przyrządzi. A poza tym, czy można sporządzić listę niezjadliwych warzyw i nie umieścić na niej kalafiora? Oczywiście, że nie.

Pewnie mógłbym dorzucić tam jeszcze kilka rzeczy. Ale skupię się może już lepiej na pracy. Od tego myślenia o jedzeniu zrobiłem się głodny. Tak głodny, że mógłbym nawet zjeść kawałek kalafiora, gdyby ktoś go dobrze przyrządził.

Przejdźmy więc do skryptu, który określa grupy usługi Active Directory mające maksymalnie 1 uczestnika:

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



Set objRecordSet = objCommand.Execute



objRecordSet.MoveFirst



Do Until objRecordSet.EOF

    Set objGroup = GetObject(objRecordSet.Fields("ADsPath").Value)



    i = 0



    For Each strUser in objGroup.Member

        i = i + 1

        If i > 1 Then

            Exit For

        End If

    Next



    If i <= 1 Then

        Wscript.Echo objRecordSet.Fields("Name").Value & " -- " & i

    End If



    objRecordSet.MoveNext

Loop

Jak się okazuje, grupy usługi Active Directory nie mają właściwości mówiącej o tym, ilu uczestników znajduje się w danej grupie. Będziemy musieli przeszukać usługę Active Directory w celu uzyskania listy wszystkich grup. Następnie połączymy się z każdą grupą indywidualnie i „ręcznie” policzymy liczbę uczestników każdej grupy. Jeżeli grupa ma jednego uczestników lub mniej (czyli 0 uczestników), wywołamy echo nazwy tej grupy i liczbę uczestników. To trochę kłopotliwe, ale i tak lepsze, niż krztuszenie się podczas próby przełknięcia kawałka wątróbki.

A wierzcie mi, to nic przyjemnego.

Wiemy już, co musimy zrobić, żeby otrzymać listę grup usługi Active Directory zawierających maksymalnie jednego użytkownika. Żeby wykonać te czynności, zaczynamy - to już wiemy - od przeszukania usługi Active Directory. Nie możemy opisać dziś czynności związanych z przeszukiwaniem usługi katalogowej Active Directory, ale zawsze możecie zajrzeć do naszego dwuczęściowego artykułu Opowieści skrypty (j. ang.) na ten temat. Ten artykuł nie tylko wyjaśni Wam wszystko, co powinniście wiedzieć na temat skryptów wyszukiwania usługi Active Directory, ale wyjaśni także zastosowanie około 10 pierwszych wierszy naszego skryptu.

Jedyną rzeczą, o której opowiem w dzisiejszym artykule jest kwerenda używana w celu pobrania kolekcji wszystkich grup Active Directory:

objCommand.CommandText = _

    "SELECT ADsPath, Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='group'"

Poszukujemy tutaj dwóch atrybutów - ADsPath oraz Name – z domeny fabrikam.com. Oczywiście nie chcemy uzyskać tych informacji dla wszystkich obiektów w domenie; nam chodzi tylko o konta grup. Dlatego też dodajemy klauzulę Where, która ograniczy pobierane dane do tych obiektów, które maja kategorię objectCategory równą group.

Po wykonaniu kwerendy otrzymujemy zbiór rekordów zawierający kolekcję wszystkich grup znajdujących się w naszej domenie. W celu określenia liczby użytkowników w każdej z tych grup musimy ustawić pętlę Do Until, która będzie działać dopóki właściwość EOF (end-of-file) zbioru rekordów się nie zmieni (innymi słowy, pętla działa dopóki nie skończą się nam rekordy):

Do Until objRecordSet.EOF

Wewnątrz tej pętli pobieramy wartość właściwości ADsPath dla pierwszej grupy w zbiorze rekordów, a następnie używamy poniższego wiersza kodu w celu połączenia się bezpośrednio w grupą w usłudze Active Directory:

Set objGroup = GetObject(objRecordSet.Fields("ADsPath").Value)

Jak zauważyłem wcześniej, jedynym sposobem na określenie liczby uczestników w grupie jest ich policzenie. Dlatego też, ustawiamy teraz wartość zmiennej licznika o nazwie i jako 0:

i = 0

Po wykonaniu tej czynności uruchamiamy pętlę For Each, która przejdzie przez wszystkich uczestników w grupie (lub, używając bardziej technicznego języka, wszystkich elementów w atrybucie Member grupy):

For Each strUser in objGroup.Member

    i = i + 1

    If i > 1 Then

        Exit For

    End If

Next

Jak widzimy, po każdym przejściu pętli wartość zmiennej i zwiększa się o 1. Następnie sprawdzamy, czy wartość zmiennej i jest większa niż 1. Dlaczego? Cóż, pamiętajmy, że interesują nas tylko grupy mające maksymalnie 1 uczestnika. Jeżeli zmienna i ma wartość 2, oznacza to, że dana grupa nie ma maksymalnie 1 uczestnika. W tym momencie możemy przestać liczyć, nie jest to grupa, o którą nam chodziło. Dlatego zatrzymujemy liczenie używając do tego instrukcji Exit For kończącej działanie pętli For Each.

Co robimy po zakończeniu działania pętli (tak, wiem: Skrypciarze powinni być zawodowcami w takich sprawach)? Cóż, jeżeli zmienna i jest mniejsza lub równa 1, wywołujemy echo wartości atrybutu Name oraz wartości zmiennej i (liczby uczestników w grupie – czyli 1 albo 0):

If i <= 1 Then

    Wscript.Echo objRecordSet.Fields("Name").Value & " -- " & i

End If

Innymi słowy jeżeli grupa ma maksymalnie 1 uczestnika, wywołujemy echo jej nazwy. Jeżeli dana grupa ma więcej niż 1 uczestnika, nie robimy nic.

Teraz wywołujemy metodę MoveNext w celu przejścia do następnego rekordu w zbiorze rekordów, a następnie wracamy na początek pętli Do i powtarzamy ten proces dla następnej grupy w kolekcji. Po zakończeniu powinniśmy otrzymać raport wyglądający mniej więcej tak:

Finance Managers –– 1

Web Site Managers –– 1

People Who Like Okra -- 0

I to już wszystko, DR.

Właśnie się dowiedziałem, że wiele osób lubi wątróbkę. Co za okropność...

 Do początku strony Do początku strony


Centrum skryptów - Active Directory