Centrum skryptów - Systemy operacyjne

Jak utworzyć folder dla każdego użytkownika mojej domeny?

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 utworzyć folder dla każdego użytkownika mojej domeny?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak utworzyć folder dla każdego użytkownika mojej domeny? Chcę, aby nazwa folderu składała się z inicjału imienia użytkownika oraz jego nazwiska (na przykład KMyer).

-- GN

Cześć Skrypciarze! Odpowiedź

Cześć, GN. To był dla Skrypciarzy naprawdę interesujący tydzień. A dlaczego? Ponieważ żadnemu ze Skrypciarzy przez cały tydzień nie przydarzyło się absolutnie nic interesującego. No dobra, może chociaż Skrypciarz Dean Tsaltas miał ciekawy tydzień. Ale Dean znajduje się aktualnie w Nowej Szkocji i od kilku tygodni nie dał znaku życia. Jeżeli jednak jego tydzień wyglądał choć trochę tak, jak nasz, na pewno siedzi teraz na jakimś odludziu i myśli: „Rety, ale nudy. Ciekawe, czy coś ciekawego wydarzył się u Skrypciarzy. A w ogóle to co ja robię w Nowej Szkocji?”

Na szczęście tydzień ma się ku końcowi (tak naprawdę to Skrypciarze są o tym przekonani od poniedziałku) i na pewno w weekend wydarzy się mnóstwo ciekawych rzeczy, co wyrwie Skrypciarzy z tego letargu. Na przykład, piszący te słowa Skrypciarz powyrywa chwasty i skopie ogródek swojej ciotki, co zdecydowanie powinno go wyrwać z marazmu. Skrypciarka Jean Ross rozważa spakowanie kilku starych manatków do pudełek, chociaż obawia się, czy to nie będzie za dużo jak na jeden weekend. (Sugerujemy, żeby rozpakowała kilka starych pudeł, wtedy będzie więcej frajdy za tydzień.) Jeżeli chodzi o Skrypciarza Petera Constantini – no cóż, prawdę mówiąc Skrypciarze nigdy nie pytają o to, co Peter ma zamiar robić w weekend. O pewnych rzeczach lepiej w ogóle nic nie wiedzieć.

Oczywiście, kwestią zasadniczą jest tutaj to, że nie mamy żadnej porywającej anegdoty do opowiedzenia, ani nawet błyskotliwych obserwacji o otaczających nas świecie, którymi moglibyśmy się podzielić. Prawdę mówiąc nie mamy zupełnie nic do powiedzenia. Nic.

No, może poza przedstawieniem skryptu, który może utworzyć folder dla każdego użytkownika domeny:

On Error Resume Next



Const ADS_SCOPE_SUBTREE = 2



Set objConnection = CreateObject("ADODB.Connection")

Set objCommand = CreateObject("ADODB.Command")

objConnection.Provider = "ADsDSOObject"

objConnection.Open "Active Directory Provider"

Set objCommand.ActiveConnection = objConnection



objCommand.Properties("Page Size") = 1000

objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 



objCommand.CommandText = _

    "SELECT givenName, sn FROM 'LDAP://DC=fabrikam,DC=com' WHERE objectCategory='user'" 



Set objRecordSet = objCommand.Execute



Set objFSO = CreateObject("Scripting.FileSystemObject")



objRecordSet.MoveFirst



Do Until objRecordSet.EOF

    strInitial = Left(objRecordSet.Fields("givenName").Value, 1)

    strFolderName = "C:\Public\" & strInitial & objRecordSet.Fields("sn").Value

    Set objFolder = objFSO.CreateFolder(strFolderName)

    objRecordSet.MoveNext

Loop

Jak zwykle, nie będziemy się zagłębiać w szczegóły dotyczące skryptów wyszukiwania katalogu Active Directory: jesteśmy na to zbyt leniwi – ech, po prostu nie mamy wystarczająco dużo miejsca w dzisiejszej rubryce. Ale bez obaw, w każdej chwili możecie zajrzeć do dwuczęściowego artykułu z serii Tales from the Script (j.ang.), gdzie znajdują się wszelkie informacje dotyczące przeszukiwania katalogu Active Directory. Gorąco polecamy.

Uwaga. Jeżeli mówimy, że wszelkie informacje, to znaczy, że jest tam wszystko od obiektu Connection poprzez właściwość Page Size property do właściwości Searchscope. Może i bywamy nudni, ale przynajmniej jesteśmy skrupulatni.

A co tam, dziś możemy być skrupulatni: nie mamy nic innego do roboty.

Mniej więcej wszystkim co zrobimy będzie zerknięcie na kwerendę SQL, zwracającą kolekcję informacji o koncie użytkownika:

objCommand.CommandText = _

    "SELECT givenName, sn FROM 'LDAP://DC=fabrikam,DC=com' WHERE objectCategory='user'"

Jak widzimy, wybieramy tylko dwa atrybuty (givenName oraz sn) dla wszystkich obiektów domeny fabrikam.com spełniających określone kryterium. Jakie to kryterium? Zwracane obiekty muszą mieć kategorię objectCategoryuser (użytkownik). W ten sposób zwracamy kolekcję wszystkich kont użytkowników w naszej domenie. (Oraz informację, że rozpoczęliśmy nasze wyszukiwanie w katalogu głównym domeny.) A gdybyśmy tak chcieli zwrócić listę wszystkich kont komputerów? Wtedy użylibyśmy następującej klauzuli WHERE:

WHERE objectCategory='computer'

I tak dalej.

Dlaczego użyliśmy atrybutów givenName oraz sn? To proste: są to dwa atrybuty katalogu Active Directory odpowiadające odpowiednio imieniu i nazwisku użytkownika.

Uwaga. OK, jakie inne atrybuty są dostępne z katalogu Active Directory? Ciężko w to uwierzyć, ale nie wiemy, a przynajmniej nie znamy ich wszystkich na pamięć. Ale to nic, zawsze możemy sprawdzić tę informację w przewodniku Microsoft Windows 2000 Scripting Guide (j.ang.) lub w dokumentacji ADSI SDK (j.ang.). I Wy też możecie.

Po ustawieniu naszego zapytania, wywołujemy metodę Execute w celu wywołania polecenia i zwrócenia zbioru rekordów zawierającego wszystkie konta użytkowników w domenie fabrikam.com.

Po wywołaniu metody Execute otrzymujemy zbiór rekordów składający się z imion i nazwisk wszystkich użytkowników naszej domeny. Z tego powodu, naszym następnym ruchem jest ustawienie pętli Do, która umożliwi nam przejście przez całą kolekcję (lub – żeby wyglądało, że niby wiemy o czym mówimy – dopóki właściwość zbioru rekordów EOF nie osiągnie wartości True):

Do Until objRecordSet.EOF

Ach tak, jeszcze zanim to zrobiliśmy, utworzyliśmy wystąpienie obiektu Scripting.FileSystemObject, który jest potrzebny do utworzenia naszych folderów. Przepraszamy Scripting.FileSystemObject za to zaniedbanie.

Wewnątrz pętli Do Until stosujemy poniższy wiersz kodu w celu pobrania pierwszej litery imienia (tzn. inicjału):

strInitial = Left(objRecordSet.Fields("givenName").Value, 1)

Jak widzimy, to jest całkiem proste: używamy funkcji Left do pobrania pierwszego znaku atrybutu użytkownika givenName. Przyznajemy, składnia służąca do odnoszenia się do pól zbioru rekordów jest trochę ciężka: objRecordSet.Fields("givenName").Value. Ale nic się tym nie martwcie, kopiujemy i wklejamy ten ciąg, po czym zostawiamy go w niezmienionej postaci.

Kiedy już mamy pierwszy inicjał użytkownika, możemy zabrać się za składanie nazwy naszego pierwszego folderu:

strFolderName = "C:\Public\" & strInitial & objRecordSet.Fields("sn").Value

Przypisujemy wartość do zmiennej o nazwie strFolderName. A co jest tą wartością? No cóż, jeśli założymy, że pierwszy użytkownik w naszym zbiorze rekordów to Ken Myer, ta wartość będzie wyglądać tak: C:\Public\KMyer. Innymi słowy, C:\Public\ plus K (pierwsza litera imienia) plus Myer (sn, lub nazwisko) = C:\Public\KMyer.

Teraz wywołujemy metodę CreateFolder w celu utworzenia nowego folderu, przekazując zmienną o nazwie strFolderName jako jedyny parametr metody:

Set objFolder = objFSO.CreateFolder(strFolderName)

W tym momencie wywołujemy metodę MoveNext w celu przejścia do następnego rekordu w zbiorze rekordów. Itd., itp.

Dobre pytanie: Jeżeli to był wyjątkowo nudny tydzień dla Skrypciarzy, jakiego rodzaju ekscytujące rzeczy dzieją się zazwyczaj? Wow! Jak tu teraz ugryźć takie pytanie. Zobaczmy, piszący te słowa Skrypciarz zazwyczaj… pisze artykuły do tej rubryki, Skrypciarka Jean Ross zazwyczaj – cóż, nieważne. I tak tego nie zrobiła; widziała to w telewizorze. Skrypciarz Peter Constantini – OK, co do niego nie jesteśmy pewni. W końcu co można robić z zimnymi ogniami, kąpielówkami i dwoma paczkami startego sera cheddar? (Nieistotnie. Wolimy nie wiedzieć co on tam robił.)

Jeszcze do tego pytania wrócimy.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne