Centrum Skryptów - Active Directory

Jak mapować dyski w oparciu o uczestnictwo w grupie usługi katalogowej Active Directory, jeśli użytkownik należy do kilku grup?

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 mapować dyski w oparciu o uczestnictwo w grupie usługi katalogowej Active Directory, jeśli użytkownik należy do kilku grup?

Cześć, Skrypciarze! We wczorajszym artykule omawialiście skrypt mapujący napęd w oparciu o uczestnictwo w grupie Active Directory; wspomnieliście też, że użytkownik może należeć do kilku grup. Pozwolę sobie zacytować: „Co się dzieje, jeżeli użytkownik jest uczestnikiem obydwu grup?”. I jeszcze: „Opowiem Wam innym razem”. Teraz jest inny raz, więc czekam na odpowiedź.

-- SR

Cześć, SR. No cóż, zacznijmy od tego, że Cię rozszyfrowaliśmy – jesteś Skrypciarską Redaktorką. Jak do tego doszedłem? To było elementarne. Po prostu przeanalizowałem użyte słownictwo i składnię, które doskonale odpowiadają stylowi Skrypciarskiej Redaktorki. Nie wiedzieliście, że jestem specjalistą od psycholingwistyki śledczej? Mam jeszcze wiele talentów, którymi się nie chwalę!

Kolejną poszlaką jest to, że Redaktorka siedzi przy biurku, ostrzy ołówek i łypie na mnie spod oka. W taki sam sposób, jak robi to zawsze, kiedy żąda ode mnie dotrzymania słowa.

No i wreszcie trzecia poszlaka – inicjały. Być może dwie poprzednie nie wystarczyłyby, ale Redaktorka nie do końca skutecznie zatarła ślady swojej intrygi, pozostawiając prawdziwe inicjały.

Tak więc, droga SE (SE jak Skrypciarska Redaktorka, łapiecie?), dziś będziemy kontynuować wątki z wczorajszego artykułu. Jak zauważyła SE, wczoraj omówiliśmy skrypt mapujący napęd w oparciu o uczestnictwo użytkownika w danej grupie Active Directory. Po wyjaśnieniu podstawowego skryptu rozbudowaliśmy go nieco, prezentując sposób mapowania napędu X z jednym udziałem, jeśli użytkownik jest uczestnikiem grupy A, a z innym, jeśli użytkownik jest uczestnikiem grupy B. Następnie wspomnieliśmy o tym, co interesuje Skrypciarską Redaktorkę – co zrobić, jeśli użytkownik jest uczestnikiem obu grup?

Oto jedno z możliwych rozwiązań:

On Error Resume Next



Set objDictionary = CreateObject("Scripting.Dictionary")

Set objNetwork = CreateObject("Wscript.Network")



Set objADSysInfo = CreateObject("ADSystemInfo")

strUser = objADSysInfo.UserName



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



For Each strGroup in objUser.memberOf

    Set objGroup = GetObject("LDAP://" & strGroup)

    strGroupName = objGroup.CN

    objDictionary.Add strGroupName, strGroupName   

Next



If objDictionary.Exists("Finance Managers") Then

    objNetwork.MapNetworkDrive "X:", "\\atl-fs-001\public\managers"

    Wscript.Quit

End If



If objDictionary.Exists("Finance Users") Then

    objNetwork.MapNetworkDrive "X:", "\\atl-fs-001\public\users"

    Wscript.Quit

End If



If objDictionary.Exists("Finance Planners") Then

    objNetwork.MapNetworkDrive "X:", "\\atl-fs-001\public\planners"

    Wscript.Quit

End If



If objDictionary.Exists("Finance Consultants") Then

    objNetwork.MapNetworkDrive "X:", "\\atl-fs-001\public\consultants"

    Wscript.Quit

End If

Zanim przejdziemy do omówienia szczegółów kodu, zarysujmy króciutko scenariusz pracy. Na potrzeby przykładu przyjmujemy, że interesują nas cztery grupy Active Directory:

  • Finance Managers
  • Finance Users
  • Finance Planners
  • Finance Consultants

Użyjemy skryptu logowania do zmapowania napędu X z określonym udziałem. Którym? To będzie zależało od tego, do której grupy należy użytkownik. W przypadku członków grupy Finance Managers napęd X zostanie zmapowany z innym udziałem, niż w przypadku członków grupy Finance Users.

W czym więc problem? Otóż w tym, że użytkownik może być uczestnikiem kilku grup jednocześnie; jeden użytkownik może należeć np. do grup Finance Managers, Finance Users i Finance Planners.

Co więcej, niektóre grupy mają pierwszeństwo przed innymi – są ułożone w porządku hierarchicznym. Załóżmy na przykład, że użytkownik należy do trzech grup – Finance Managers, Finance Users i Finance Planners. Jak określić, z którym udziałem zostanie zmapowany napęd X? Zależy to właśnie od hierarchii. Grupa Finance Managers znajduje się na szczycie listy, zostanie więc użyta jako grupa podstawowa użytkownika (przynajmniej na potrzeby mapowania). Co będzie, jeśli użytkownik jest uczestnikiem grup Finance Planners i Finance Consultants? No jasne – pierwszeństwo ma grupa Finance Planners, więc użyjemy jej jako podstawowej.

Skrypt rozpoczyna działanie od utworzenia wystąpień obiektów Scripting.Dictionary i Wscript.Network. Obiektu Network użyjemy do zmapowania napędu. A co z obiektem Dictionary? Zaraz do tego dojdziemy.

Po utworzeniu dwu obiektów, tworzymy jeszcze trzeci: ADSystemInfo, umożliwiający pobranie nazwy wyróżniającej (DN) użytkownika. Mając DN, łączymy się z kontem użytkownika w Active Directory i pobieramy kolekcje wszystkich grup, do których on należy. (Szczegóły omówiliśmy wczoraj). Następnie używamy następującego wiersza kodu do uruchomienia pętli For Each, która przechodzi przez wszystkie grupy, do których należy użytkownik:

For Each strGroup in objUser.memberOf

Wewnątrz tej pętli używamy nazwy DN pierwszej grupy, by połączyć się z jej kontem w Active Directory. (Ponownie po szczegóły odsyłamy do wczorajszego artykułu.) Następnie używamy poniższego wiersza kodu, by zapisać nazwę CN grupy w zmiennej o nazwie strGroupName:

strGroupName = objGroup.CN

Mając nazwę CN grupy, możemy dodać ją do obiektu Dictionary, używając jej zarówno jako klucza, jak i jako elementu obiektu Dictionary:

objDictionary.Add strGroupName, strGroupName

Po co nam to wszystko? Wytrzymajcie jeszcze chwilę; zaraz będziemy gotowi, by omówić szczegóły obiektu Dictionary.

Najpierw jednak skończmy z pętlą For Each. Po dodaniu pierwszej grupy do obiektu Dictionary powtarzamy działanie pętli z kolejną grupą w kolekcji. Po zakończeniu będziemy mieli obiekt Dictionary zawierający listę wszystkich grup, do których należy użytkownik.

Po co umieszczamy wszystkie grupy w obiekcie Dictionary? To proste – nie możemy zacząć ich mapowania, dopóki nie będziemy wiedzieć, do których grup należy dany użytkownik. Załóżmy, że znajdujemy się w pętli For Each i dowiadujemy się, że użytkownik jest uczestnikiem grupy Finance Consultants. Moglibyśmy teraz zmapować napęd X w oparciu o uczestnictwo użytkownika w tej grupie Finance Consultants. To jednak spowoduje problem, jeśli okaże się, że użytkownik należy także do grupy Finance Users.

Aby uniknąć tego problemu, pobieramy najpierw wszystkie nazwy grup i umieszczamy je w obiekcie Dictionary. Możemy teraz użyć metody Exists obiekty Dictionary, by sprawdzić, czy użytkownik należy do danej grupy. Co równie ważne, możemy sprawdzić pierwszeństwo grup w strukturze hierarchicznej.

Posłuży nam do tego poniższy wiersz kodu:

If objDictionary.Exists("Finance Managers") Then

    objNetwork.MapNetworkDrive "X:", "\\atl-fs-001\public\managers"

    Wscript.Quit

End If

Sprawdzamy tu, czy w obiekcie Dictionary pojawia się wartość ciągu Finance Managers. Jeśli nie, użytkownik nie jest uczestnikiem grupy Finance Managers. W takim wypadku przeskakujemy do kolejnego fragmentu kodu, by sprawdzić, czy użytkownik należy do grupy Finance Users. (Kierujemy się tu pierwszeństwem w hierarchii – sprawdzamy uczestnictwo w grupie Finance Managers na samym początku.)

Przyjmijmy, że wartość Finance Managers pojawiła się w obiekcie Dictionary. Może to oznaczać tylko jedno – użytkownik jest uczestnikiem grupy Finance Managers. Używamy więc poniższego wiersza kodu do zmapowania napędu X z udziałem \\atl-fs-001\public\managers:

objNetwork.MapNetworkDrive "X:", "\\atl-fs-001\public\managers"

Teraz wywołujemy metodę Wscript.Quit i kończymy działanie skryptu. Dlaczego? Otóż grupa Finance Managers ma pierwszeństwo nad pozostałymi. Innymi słowy, stwierdziwszy, że użytkownik jest uczestnikiem grupy Finance Managers nie musimy kontynuować – mapujemy napęd z udziałem \\atl-fs-001\public\managers i koniec. Zwróćmy uwagę, że używamy też metody Wscript.Quit w kolejnym bloku kodu:

If objDictionary.Exists("Finance Users") Then

    objNetwork.MapNetworkDrive "X:", "\\atl-fs-001\public\users"

    Wscript.Quit

End If

Jeśli użytkownik jest uczestnikiem grupy Finance Users, nie ma już znaczenia uczestnictwo w grupie Finance Planners ani Finance Consultants. Grupa Finance Users ma bowiem pierwszeństwo. Mapujemy więc napęd i kończymy skrypt.

Co zrobić, jeśli musimy sprawdzić uczestnictwo w np. 10 grupach? Wystarczy dodawać bloki If Then, pamiętając o pierwszeństwie w hierarchii. Z tej mańki nas nie zażyjesz, Redaktorko!

 Do początku strony Do początku strony

Centrum Skryptów - Active Directory