Centrum skryptów - Active directory

Jak policzyć liczbę użytkowników w grupie?

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 policzyć liczbę użytkowników w grupie?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak policzyć liczbę użytkowników w grupie Active Directory?

-- TP

Cześć Skrypciarze! Pytanie

Cześć, TP. Zdarzają mi się czasem takie dni, w których ogarnia mnie dziwny niepokój. Rano nic tego nie zapowiada, ale z czasem to uczucie dojrzewa i koło południa jest już naprawdę silne. Nigdy nie wiadomo, kiedy mnie to dopadnie, gdyby tak było, wcale nie wychodziłbym tego dnia z domu. Ostatnio, kiedy tak się czułem popsuł mi się samochód w drodze na zakupy. Wcześniej przegrałem z moim synem pojedynek na kosze, a jeszcze wcześniej… nie pamiętam, ale na pewno nie było to nic przyjemnego. Tak czy owak, dziś jest taki dzień, a ja siedzę sobie grzecznie i spokojnie w pracy, staram się nie wychylać i czekam, aż się wreszcie skończy. Wolę się nie zastanawiać, co mnie spotka tym razem. Wolę, ale to trochę silniejsze ode mnie i prawdę mówiąc ciągle się zastanawiam. Obmyślam plan. Co mam robić przez resztę dnia, żeby zminimalizować ryzyko wystąpienia jakiejś niechcianej sytuacji. Postanowiłem nie ryzykować i nie wsiadać do samochodu. Nie będę się dziś z nikim o nic zakładał i nie stanę do żadnych zawodów. Zastanawiam się, czy nie zrezygnować z obiadu, żeby nie kusić losu. Ale chyba nie ma co przesadzać. W końcu wycieczka do kantyny to jedna z niewielu rozrywek, jakie mamy w pracy, więc wolałbym z niej nie rezygnować. O rety, kiedy to się wreszcie skończy. Postanowiłem zająć się czymś, co odciągnie moje myśli od tego, co mnie może dzisiaj czekać i dlatego też nie będę odkładał odpowiedzi na pytanie TP na drugi koniec dnia. Im szybciej, tym lepiej.

Oto skrypt:

Set objGroup = GetObject("LDAP://CN=Finance Employees,OU=Finance,DC=fabrikam,DC=com")



i = 0



Set objDictionary = CreateObject("Scripting.Dictionary")



For Each strUser in objGroup.Member

    i = i + 1



    Set objMember = GetObject("LDAP://" & strUser)

    strType = objMember.Class



    If Not objDictionary.Exists(strType) Then

        objDictionary.Add strType, "1"

    Else

        objDictionary.Item(strType) = objDictionary.Item(strType) + 1

    End If

Next



Wscript.Echo "Total members in the group: " & i

Wscript.Echo



For Each objType in objDictionary

    Wscript.Echo objType & ": " & objDictionary.Item(objType)

Next

Zanim przejdziemy do sedna sprawy, powinniśmy zwrócić uwagę na dwie rzeczy. Po pierwsze, jedynym sposobem na określenie liczby uczestników grupy to ich policzenie; interfejs ADSI nie ma właściwości Count, która bezpośrednio przekazałaby nam liczbę elementów znajdujących się w kolekcji. (Lub przynajmniej nie ma działającej właściwości Count.)

Po drugie, mogliśmy napisać prostszą wersję tego skryptu, wyglądającą tak:

Set objGroup = GetObject("LDAP://CN=Finance Employees,OU=Finance,DC=fabrikam,DC=com")



i = 0



For Each strUser in objGroup.Member

    i = i + 1

Next



Wscript.Echo "Total members in the group: " & i

Wscript.Echo

Poprzedni skrypt naprawdę wywołuje echo liczby uczestników grupy. Dlaczego więc nie wykorzystać tego skryptu i na tym zakończyć sprawę? Cóż, chciałem pójść trochę dalej i wywołać echo nie tylko liczby uczestników grupy, ale także zapisu typu uczestnictwa w grupie, w taki oto sposób:

Total members in the group: 840



group: 5

contact: 595

user: 240

Możecie wykorzystać ten skrypt, który wam odpowiada, obydwa zadziałają bez zarzutu.

Jeżeli chodzi o pierwszy skrypt (ten dłuższy), rozpoczyna się on od połączenia z daną grupą, w tym przypadku z grupą o nazwie Finance Employees, znajdującej się w jednostce Finance OU domeny fabrikam.com:

Set objGroup = GetObject("LDAP://CN=Finance Employees,OU=Finance,DC=fabrikam,DC=com")

Po utworzeniu połączenia z kontem grupy w usłudze Active Directory, ustawiamy wartość zmiennej licznika i na 1; wykorzystamy tę zmienną do policzenia uczestników grupy. W tym momencie możemy utworzyć wystąpienie obiektu Scripting.Dictionary, który wykorzystamy do śledzenia różnych typów uczestnictwa (przykładowo: użytkownik, kontakt, grupa)

Set objDictionary = CreateObject("Scripting.Dictionary")

Teraz przechodzimy do poniższego wiersza kodu:

For Each strUser in objGroup.Member

Jak się okazuje, grupy Active Directory mają wielowartościową właściwość o nazwie Member; ta właściwość zawiera kolekcję wszystkich uczestników tej grupy. Aby dobrać się do uczestników tej grupy wystarczy ustawić pętlę For Each, która przejdzie przez wszystkie wartości zachowane we właściwości Member.

Tak się składa, że dokładnie to robimy w naszym skrypcie.

Wewnątrz tej pętli najpierw zwiększamy wartość naszej zmiennej licznika. Przy każdym przejściu pętli zwiększamy wartość i. Dlaczego? No cóż, przypuśćmy, że mamy 37 uczestników w grupie. W takim przypadku pętla przejdzie 37 razy; po jej zakończeniu zmienna licznika i będzie miała wartość 37. Oznacza to, że dzięki temu i będzie mogła nam powiedzieć ilu uczestników należy do grupy.

Mam dzisiaj jednak szczęście, czy co?

Być może wiecie, że poszczególni uczestnicy grupy są wymienieni w atrybucie Member przez oddzielną nazwę (przykładowo, CN= Ken Myer, OU=Finance, dc=fabrikam, dc=com). Czy to się nam na coś przyda? Oczywiście, że tak; oznacza to, że możemy połączyć się z kontem indywidualnego użytkownika za pomocą poniższego wiersza kodu:

Set objMember = GetObject("LDAP://" & strUser)

Dlaczego chcemy połączyć się z kontami poszczególnych użytkowników? Cóż, oprócz obliczenia liczby uczestników w grupie chcemy określić typ uczestnictwa; jedynym sposobem, żeby to zrobić jest połączenie się z kontem i pobranie wartości właściwości Class. Robimy to w ten oto sposób:

strType = objMember.Class

Teraz wiemy, że uczestnikiem grupy jest użytkownik (lub kontakt, grupa lub coś w tym stylu). A teraz co? Cóż, jak już mówiłem, zastosujemy obiekt Dictionary, aby uzyskać rejestr typów uczestnictwa. Mając to na uwadze, naszym następnym posunięciem jest sprawdzenie czy ten typ uczestnictwa znajduje się już w obiekcie Dictionary:

If Not objDictionary.Exists(strType) Then

Przypuśćmy, że poprzedni wiersz kodu da nam wynik True; będzie to oznaczać, że ten typ uczestnictwa nie znajduje się w obiekcie Dictionary. (Zwróćcie uwagę na składnię If Not.) W takim przypadku stosujemy poniższy wiersz kodu w celu dodania tego rodzaju do obiektu Dictionary i nadajemy nowemu elementowi wartość 1:

objDictionary.Add strType, "1"

Wszystko jasne? Jeżeli nie, zachęcam do zajrzenia do artykułu przewodnika Microsoft Windows 2000 Scripting Guide (j.ang.), w którym znajduje się bardziej szczegółowy opis obiektu Dictionary.

A co, jeżeli ten typ uczestnictwa znajduje się w obiekcie Dictionary? Wszystko w porządku; jeżeli typ uczestnictwa już jest w Dictionary, stosujemy poniższy wiersz kodu w celu zwiększenia wartości elementu o 1:

objDictionary.Item(strType) = objDictionary.Item(strType) + 1

Teraz kontynuujemy działanie pętli i powtarzamy ten proces dla następnego uczestnika grupy.

Po przejściu pętli przez całą grupę uczestników wywołujemy echo całkowitej liczby uczestników grupy (reprezentowanej przez naszą zmienną licznika i), z następującym po niej pustym wierszem:

Wscript.Echo "Total members in the group: " & i

Wscript.Echo

Teraz uruchamiamy pętlę For Each, która przejdzie przez wszystkie elementy obiektu Dictionary, wywołując echo typu uczestnictwa oraz wartości elementu:

For Each objType in objDictionary

    Wscript.Echo objType & ": " & objDictionary.Item(objType)

Next

I jak się można spodziewać, to już wszystko.

Zaraz, jeszcze jedna rzecz: jeżeli chcecie policzyć liczbę uczestników w grupie lokalnej, zastosujcie ten skrypt:

strComputer = "atl-fs-01"



i = 0



Set objGroup = GetObject("WinNT://" & strComputer & "/Administrators")



For Each strMember in objGroup.Members

    i = i + 1

Next



Wscript.Echo "Total members in the group: " & i

Nie wyjaśnię działania tego skryptu, przynajmniej nie dzisiaj. Nie powinno to jednak stanowić żadnego problemu, w końcu istnieją także inne źródła informacji, które wyjaśniają, jak pracować z grupami lokalnymi.

Co ja mam teraz robić, żeby nie myśleć o tym, co mnie dzisiaj jeszcze czeka?

  Do początku strony  Do początku strony

Centrum skryptów - Active directory