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