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