Centrum Skryptów -Active Directory

Jak mapować dyski na podstawie uczestnictwa 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 mapować dyski na podstawie uczestnictwa w grupie?

Cześć, Skrypciarze! Jak mapować dyski w skrypcie logowania na podstawie grupy zabezpieczeń, do której należy każdy użytkownik?

-- RO

Cześć, RO. Biorąc pod uwagę fakt, że to pytanie zostało właśnie zadane po raz 3 755 392, doszliśmy do wniosku, że czas najwyższy na nie odpowiedzieć.

Pojawiają się tutaj dwie kwestie. Po pierwsze, musimy określić, do której grupy należy użytkownik; po drugie, mapujemy dysk w oparciu o uczestnictwo użytkownika w danej grupie. Zajmijmy się nimi po kolei.

Na początek określamy do której grupy należy użytkownik; zanim to zrobimy, określamy, kim jest użytkownik. Ponieważ mamy do czynienia ze skryptem logowania, jest to całkiem proste: możemy wykorzystać obiekt ADSystemInfo w celu określenia nazwy zalogowanego na komputerze użytkownika:

Set objSysInfo = CreateObject("ADSystemInfo")

Wscript.Echo strUser.UserName

Dlaczego potrzebna nam jest nazwa wyróżniająca, a nie tylko np. login użytkownika? No cóż, nazwa wyróżniająca (wyglądająca mniej więcej tak: CN=Ken Myer, OU=Finance, DC=fabrikam, DC=com) to prawie kompletna ścieżka do konta użytkownika w Active Direktory; tak naprawdę wystarczy teraz dodać z przodu LDAP:// – i już mamy, co chcieliśmy. Nazwa logowania kmyer nie jest tak użyteczna; jeżeli mielibyśmy tylko taką nazwę, musielibyśmy przeszukać Active Directory w celu określenia ścieżki ADsPath dla tego konta. Zaczynając od nazwy wyróżniającej pomijamy te wszystkie kroki.

Po dodaniu LDAP:// i utworzeniu ścieżki ADsPath łączymy się z kontem użytkownika w Active Directory i raportujemy nazwy grup, do których należy użytkownik; możemy to zrobić w prosty sposób, wymieniając wartości w atrybucie MemberOf. Dzięki temu:

On Error Resume Next



Set objSysInfo = CreateObject("ADSystemInfo")

Set objNetwork = CreateObject("Wscript.Network")



strUserPath = "LDAP://" & objSysInfo.UserName

Set objUser = GetObject(strUserPath)



For Each strGroup in objUser.MemberOf

    strGroupPath = "LDAP://" & strGroup

    Set objGroup = GetObject(strGroupPath)

    Wscript.Echo objGroup.CN

Next

Zauważmy, że tworzymy tutaj ścieżkę ADsPath dla grupy za pomocą poniższego wiersza kodu:

strGroupPath = "LDAP://" & strGroup

Następnie łączymy się z samą grupą i wywołujemy echo wartości CN. Dlaczego? Cóż, atrybut MemberOf przekazuje nazwę wyróżniającą każdej grupy, do której należy użytkownik; w ten sposób otrzymujemy nazwy takie, jak CN=Finance Users, OU=Finance, DC=fabrikam, DC=com. Nie jest to zły sposób, ale nam chodzi bardziej o nazwę grupy (czyli, CN) taką, jak Finance Users. Zatem idziemy dalej, łączymy się z grupą i pobieramy CN.

Następnie w całkiem prosty sposób mapujemy dysk sieciowy: poniższy kod mapuje dysk X do udziału \\atl-fs-01\finance:

Set objNetwork = CreateObject("Wscript.Network")

objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\finance"

Teraz wystarczy utworzyć wystąpienie obiektu WSH Network, a następnie wywołać metodę MapNetworkDrive przekazując jej dwa parametry: literę dysku oraz udział pliku do którego chcemy zmapować dysk.

Teraz – w końcu – możemy przejść do skryptu, który określa grupy, do których należy użytkownik, a następnie mapuje dysk X do odpowiedniego udziału sieci na podstawie uczestnictwa w grupie. W tym celu pobieramy listę wszystkich grup i stosujemy instrukcję Select Case żeby sprawdzić, czy użytkownik należy do jednej z grup docelowych. Przykładowo, poniższy kod sprawdza, czy użytkownik należy do grupy Finance Users; jeżeli tak, skrypt mapuje dysk X do udziału \\atl-fs-01\finance:

Case "Finance Users"

        objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\finance"

Oto ukończony skrypt:

On Error Resume Next



Set objSysInfo = CreateObject("ADSystemInfo")

Set objNetwork = CreateObject("Wscript.Network")



strUserPath = "LDAP://" & objSysInfo.UserName

Set objUser = GetObject(strUserPath)



For Each strGroup in objUser.MemberOf

    strGroupPath = "LDAP://" & strGroup

    Set objGroup = GetObject(strGroupPath)

    strGroupName = objGroup.CN



    Select Case strGroupName

        Case "Finance Users"

            objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\finance"

        

        Case "Human Resource Users" 

            objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\hr"



        Case "Manufacturing Users"

            objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\manufacturing"



        Case "Shipping and Receiving Users"

            objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\shipping"

    End Select

Next

Kilka uwag dotyczących tego skryptu. Po pierwsze, zakłada on, że użytkownicy należą tylko do jednej z grup, o których mowa. Przypuśćmy, że użytkownik należy zarówno go grupy Manufacturing Sers, jak i Shipping oraz Receiving Users. W takim przypadku, dysk X zostanie zmapowany do \\atl-fs-01\manufacturing, ale pojawi się błąd przy próbie zmapowania dysku X do \\atl-fs-01\shipping; dzieje tak dlatego, że dysk już jest używany. Jeżeli użytkownicy należą do różnych grup, należy wziąć to pod uwagę i być może zezwolić na kilkakrotne mapowanie (przykładowo, zmapuj dysk X, a następnie jeżeli będzie on już zajęty, zmapuj dysk dla następnej grupy na dysk Y). Ale to temat na inny artykuł.

Ponadto, skrypt zakłada, że użytkownicy są wymienieni z nazwy w grupach zabezpieczeń. Co jednak w przypadku, gdy użytkownik Ken Myer jest uczestnikiem grupy Accounting Group, a grupa (nie pojedynczy użytkownik) należy do grupy Finance Users? W takim przypadku dysk nie zostanie poprawnie zmapowany, ponieważ skrypt nie uwzględnia grup zagnieżdżonych (grup wewnątrz grup). To jest o wiele bardziej skomplikowany skrypt i być może napiszemy o nim w przyszłości.

 Do początku strony Do początku strony

Centrum Skryptów -Active Directory