Centrum skryptów - Active Directory

W jaki sposób można dodać wszystkich użytkowników z istniejącej grupy Active Directory do nowej grupy? 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.

W jaki sposób można dodać wszystkich użytkowników z istniejącej grupy Active Directory do nowej grupy?

Cześć, Skrypciarzu! W jaki sposób można dodać wszystkich użytkowników z istniejącej grupy Active Directory do nowej grupy?

-- Gustaw

Cześć, Gustawie. Rozumiem, że masz jedną grupę (nazwijmy ją Grupą A) i chcesz utworzyć jej dokładną kopię (czyli Grupę B). Gdyby chodziło o pliki tekstowe A i B, byłoby łatwo: wystarczyłoby utworzyć kopię Pliku A i nazwać ją Plikiem B. To jednak nie zadziała w przypadku grupy Active Directory. Istnieje wprawdzie w ADSI metoda CopyHere, ale nie współpracuje ona z Active Directory; próba jej użycia spowoduje wyświetlenie komunikatu błędu „Not implemented” (brak wdrożenia). Do kitu.

A zatem, skoro nie możemy po prostu skopiować Grupy A, co możemy zrobić? Wróćmy na chwilę do plików tekstowych. Załóżmy, że z jakiegoś powodu niemożliwe jest użycie systemu plików do skopiowania Pliku A; jakie inne sposobu jego duplikacji istnieją? No cóż, moglibyśmy otworzyć ten plik, odczytać zawartość, po czym zapisać ją w nowym pliku – Pliku B. I tak właśnie postąpimy z naszymi grupami Active Directory.

Najpierw skrypt, potem wyjaśnimy, jak działa. Poniższy skrypt pobiera listę wszystkich członków grupy Finance Managers, po czym dodaje ją do nowej grupy o nazwie Finance Department:

Const ADS_GROUP_TYPE_GLOBAL_GROUP = &H2



Set objOU = GetObject("LDAP://OU=Finance, dc=fabrikam, dc=com")

Set objOldGroup = GetObject("LDAP://CN=Finance Managers, ou=Finance, dc=fabrikam, dc=com")



Set objNewGroup = objOU.Create("Group", "Finance Department")

objNewGroup.sAMAccountName = "financedept"

objNewGroup.groupType = ADS_GROUP_TYPE_GLOBAL_GROUP

objNewGroup.Set Info



For Each objUser in objOldGroup.Member

    objNewGroup.Add "LDAP://" & objUser

Next

A więc: jak to działa? Najpierw definiujemy stałą o nazwie ADS_GROUP_TYPE_GLOBAL_GROUP, ustalając jej wartość jako &H2; będziemy jej później ptrzebować do utworzenia nowej grupy jako grupy zabezpieczeń globalnych.

Następnie tworzymy odwołania do dwóch różnych obiektów. Odwołanie objOU łączy nas z jednostką organizacyjną Finance w Active Directory; w tej jednostce mieścić się będzie nasza nowa grupa zabezpieczeń. Odwołanie objOldGroup natomiast łączy nas z grupą Finance Managers w Active Directory; jak już zaznaczyliśmy, w tej grupie mieści się lista użytkowników, którą chcemy dodać do nowej grupy.

W tym momencie zbaczamy na chwilę z trasy i tworzymy nową grupę o nazwie Finance Department; zajmuje się tym poniższy fragment kodu:

Set objNewGroup = objOU.Create("Group", "Finance Department")

objNewGroup.sAMAccountName = "financedept"

objNewGroup.groupType = ADS_GROUP_TYPE_GLOBAL_GROUP

objNewGroup.SetInfo

Nie będziemy się szczegółowo rozwodzić nad tym fragmentem; dodatkowe informacje znaleźć można w przewodniku po skryptach Microsoft Windows 2000.

Mamy zatem starą grupę Finance Managers, w której jest mnóstwo użytkowników, oraz zupełnie pustą grupę nową – Finance Department. Możemy to jednak zmienić: wystarczy pobrać listę członków grupy Finance Managers i skopiować ją do Finance Department. Może się zdziwicie, ale trzeba na to ledwie trzech wierszy:

For Each objUser in objOldGroup.Member

    objNewGroup.Add "LDAP://" & objUser

Next

Jak się okazuje, atrybut Member grupy zawiera kolekcję wszystkich członków. Możemy użyć prostej pętli For Each by prześ przez wartość atrybutu Member, zwracając atrybut distinguishedName (DN) każdego z członków.

Uwaga. Atrybut distinguishedName będzie wyglądał mniej-więcej tak:

CN=Ken Myer, ou=Finance, dc=fabrikam, dc=com

Na szczęście jedyna informacja, jakiej potrzeba by dodać użytkownika do grupy, to jego ścieżka ADsPath. Ścieżka ADsPath składa się z dostawcy ADSI (czyli w ty wypadku LDAP://) oraz nazwy DN użytkownika. Mamy oba elementy: dostawcą ADSI musi być LDAP:// ze względu na sposób pracy z Active Directory, nazwy DN właśnie pobraliśmy. W poniższym wierszu dodajemy użytkownika do nowej grupy, przekazując połączenie dostawcy ADSI z nazwą DN jako jedyny parametr metody Add:

objNewGroup.Add "LDAP://" & objUser

I idziemy dalej, przechodząc przez wszystkich członków grupy Finance Managers, pobierając wartość ich atrybutu distinguishedName i używając jej, by dodać użytkownika (albo komputer, grupę czy cokolwiek innego) do grupy Finance Department. Wynik: mimo że nie dysponujemy poleceniem kopiowania, udało nam się zduplikować listę członków jednej grupy w drugiej grupie. Czy VBScript nie jest czasem kluczem do klonowania ludzi? (ujmijmy to tak: z początku był tylko jeden Skrypciarz…).

 Do początku strony

 


Centrum skryptów - Active Directory