Centrum skryptów - Systemy operacyjne

Jak mogę zmapować napęd opierając się na znajomości nazwy użytkownika oraz jednostki OU?

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 mogę zmapować napęd opierając się na znajomości nazwy użytkownika oraz jednostki OU?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Chcę napisać skrypt logowania, który mapowałby dysk sieciowy na podstawie nazwy zalogowanego użytkownika oraz jego jednostki OU. Jak to zrobić?

-- KB

Cześć Skrypciarze! Odpowiedź

Cześć, KB. Słuchaj KB, dla Skrypciarza piszącego te słowa to jest chyba najcięższy dzień w roku . Przez ostatnie cztery dni – czwartek, piątek, sobotę i niedzielę – nie robił nic, oprócz oglądania koszykówki uniwersyteckiej. I nie tylko widział świetne mecze (Ohio State z Xavier oraz Washington State z Vanderbilt, że wymienię dwa), ale był także świadkiem wyeliminowania z gry, w fazie wstępnej, zespołów Duke i Arizona. Skrypciarz pomyślał więc, że musi umrzeć i iść do nieba.

Ale cała zabawa skończyła się w poniedziałek rano. Czas iść znowu do pracy.

Dlatego właśnie jest to dla Skrypciarza piszącego tą kolumnę taki ciężki dzień. Może trudno w to uwierzyć, ale praca nie wydaje mu się ani w przybliżeniu tak interesująca i ekscytująca jak koszykówka uniwersytecka. Prawdopodobnie myślisz sobie teraz: „Jego samopoczucie jest zrozumiałe. Jednak Skrypciarz jest prawdziwym profesjonalistą, jakoś da sobie z tym radę i znajdzie sposób, by znów wykonywać swoją pracę. Mimo, że wolałby siedzieć w domu i oglądać jeszcze więcej koszykówki. No nie?”

Szczerze mówiąc, jesteś w błędzie: o Skrypciarzu piszącym te słowa można wiele powiedzieć, ale nie to, że jest prawdziwym profesjonalistą. Z drugiej jednak strony, nawet Skrypciarz piszący te słowa musi pod koniec każdego miesiąca płacić czynsz. No cóż, ot skrypt mapujący dysk sieciowy na podstawie nazwy zalogowanego użytkownika oraz jego OU:

Set objSysInfo = CreateObject("ADSystemInfo")



strUser = objSysInfo.UserName

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



strUserName = objUser.samAccountName



strOUPath = objUser.Parent

arrContainers = Split(strOUPath, ",")

arrOU = Split(arrContainers(0), "=")

strOU = arrOU(1)



strDrive = "\\Mission\Apps\Timesheets\" & strOU & "\" & strUserName



Set objNetwork = CreateObject("Wscript.Network")

objNetwork.MapNetworkDrive "K:", strDrive

Czy możemy się dowiedzieć, jak to działa? Dobre pytanie. Zanim na nie odpowiemy, sprawdźmy, ile jeszcze pieniędzy Skrypciarz potrzebuje na opłacenie domu… O, całkiem sporo!

Dobra, bezpieczniej będzie, jeśli jednak przyjrzymy się, jak działa ten skrypt. W rzeczywistości wygląda to tak, że jeszcze przez następne 100 lat będziemy tłumaczyć jak działają skrypty.

Jak widać, zaczynamy od utworzenia obiektu ADSystemInfo. Jest to mały, poręczny obiekt ADSI, który bezpośrednio i natychmiastowo pobiera informacje na temat zalogowanego użytkownika oraz używanego przez niego komputera. Jakiego rodzaju informacje pobiera obiekt ADSystemInfo? Przez własność UserName może pobrać nazwę zalogowanego użytkownika; będzie to wartość podobna do tej:

CN=kenmyer, OU=Finance, dc=fabrikam, dc=com

Czy ta informacja do czegoś się przyda? Wyobraź sobie, że tak. Znając nazwę użytkownika, możemy użyć poniższego wiersza kodu, aby połączyć się z usługą Active Directory konta użytkownika:

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

I kiedy połączymy się z tym kontem, będziemy mogli określić zarówno nazwę użytkownika, jak i jego OU. A jest to ta właśnie informacja, której potrzebujemy do zmapowania dysku.

Zróbmy najpierw łatwiejszą część: wyznaczmy nazwę użytkownika. Jest to coś, co możemy osiągnąć poprzez pobranie wartości samAccountName (np. kenmyer) i zachowanie jej w zmiennej nazwanej strUserName:

My zrobiliśmy to tak, choć prawdopodobnie jest na to wiele różnych sposobów. Zaczynamy od użycia następującego wiersza kodu z funkcją Split języka VBScript do podzielenia ADsPath naszego OU, używając przecinków jako delimiterów:

Po co to robimy? Funkcja Split szuka odpowiedniego delimitera (w tym przypadku przecinka) i dzieli łańcuch znaków, tworząc tablicę. Oznacza to, że wartość np. LDAP://OU=Finance, dc=fabrikam, dc=com zostanie przekształcona w tablicę zawierającą następujące elementy:

  • LDAP://OU=Finance
  • dc=fabrikam
  • dc=com

Jak widać, zbliżamy się do naszego celu. Naszym następnym krokiem będzie utworzenie drugiej tablicy. Zrobimy to, dzieląc pierwszą pozycję (pozycję 0) ze znakiem równości jako delimiterem. Innymi słowy, weźmiemy wartość LDAP://OU=Finance i utworzymy malutką tablicę złożoną z dwóch pozycji:

  • LDAP://OU
  • Finance

Zajmuje się tym poniższy wiersz kodu:

arrOU = Split(arrContainers(0), "=")

A więc mamy to, co chcemy, znamy jednostkę OU, w której ulokowane jest konto użytkownika: znajduje się w OU o nazwie Finance. I co? Nazwa OU jest drugim elementem tablicy arrOU. Oznacza to, że możemy użyć tego wiersza kodu, aby przechować nazwę OU użytkownika w zmiennej strOU:

strOU = arrOU(1)

I w tym momencie pozostały jeszcze tylko dwie rzeczy do zrobienia: musimy „zszyć” ścieżkę z udostępnionym folderem, który chcemy zmapować i w końcu mapujemy dysk. Aby dokonać zszycia, używamy tego wiersza kodu:

strDrive = "\\Mission\Apps\Timesheets\" & strOU & "\" & strUserName

Nie jest wcale trudno zorientować się w tym, co się tu dzieje. W opisanym przez KB przypadku, użytkownicy mają katalogi ulokowane na serwerze \\Mission, w katalogu Apps\Timesheets. Wewnątrz katalogu Timesheets znajdują się oddzielne katalogi dla każdej jednostki OU, a wewnątrz nich są oddzielne katalogi dla każdego z użytkowników. Dlatego po prostu łączymy następujące wartości i zachowujemy otrzymany łańcuch w zmiennej nazwanej strDrive:

  • \\Mission\Apps\Timesheets\
  • Finance
  • \
  • kenmyer

Innymi słowy, strDrive będzie równe:

\\Mission\Apps\Timesheets\Finance\kenmyer

I w momencie, gdy mamy ścieżkę katalogu, możemy użyć poniższego, krótkiego kodu do zmapowania dysku K do odpowiedniego folderu:

Set objNetwork = CreateObject("Wscript.Network")

objNetwork.MapNetworkDrive "K:", strDrive

To wszystko.

Myślę, że zastanawiasz się, czy Skrypciarz piszący tą kolumnę rzeczywiście spędził cały weekend siedząc tylko przed telewizorem i oglądając koszykówkę. Odpowiedź brzmi: tak. To prawie niemożliwy wyczyn, zdaje się, wymagający niewiarygodnej niemal wytrzymałości i poświęcenia. To zdumiewające, że człowiek może nie robić nic innego przez tak długi czas. Trzeba jednak uczciwie przyznać, że piszący te słowa Skrypciarz trochę oszukał. Przecież mieszka w okolicy Seattle. A przy deszczu padającym całą sobotę i większość niedzieli, pozostawanie w domu i oglądanie telewizji nie było takie trudne.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne