Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

今天的問題:如何將現有的 Active Directory 群組中的所有使用者加入新群組中?


如何將現有的 Active Directory 群組中的所有使用者加入新群組中?

嗨,Scripting Guy!我要如何將現有的 Active Directory 群組中的所有使用者加入新群組中?

-- TG

TG,您好。您希望為手邊現有的群組 (暫且稱它為群組 A),另外建立一個一模一樣的群組 (我們稱它為群組 B),是吧? 如果要建立的群組是文字檔 A 和文字檔 B,那很簡單,只要將檔案 A 複製一份複本,將它命名為檔案 B 就可以了。不過,如果是 Active Directory 群組,這個方法就行不通了。ADSI 中是有 CopyHere 方法,但 Active Directory 並不支援這個方法;如果硬要使用 CopyHere,只會收到一則「未實作」的錯誤訊息。沒輒!

如果不能複製群組 A,那該怎麼辦?我們還是先看文字檔吧。假設我們因為某種原因,而不能用檔案系統複製檔案 A;想想看還有什麼方法可以複製呢?我們可以開啟檔案,讀取內容,然後將內容寫到新檔案 B 中。這個方法就相當於把現有的 Active Directory 群組中的所有的使用者,加入新的 Active Directory 群組中。

現在就來示範這個指令碼,說明它是怎麼做到的。這個指令碼會抓取一份 Finance Managers 群組所有成員的名單,將它們加入一個名叫 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

問題是,怎麼進行?我們首先定義一個叫做 ADS_GROUP_TYPE_GLOBAL_GROUP 的常數,將值設為 &H2;稍後再利用這個常數,使新群組成為全域安全性群組。

接下來,建立兩個不同物件的物件參考。物件參考 objOU 會繫結到 Active Directory 中的 Finance OU;這是容納新安全性群組的 OU。而 objOldGroup 則是繫結到 Active Directory 中的 Finance Managers 群組;如我們所知,這個群組擁有一份我們希望加入新群組中的使用者清單。

我們暫且先避開主題,另外建立一個名叫 Finance Department 的新群組;下面這一段程式碼就是要執行這個動作:

Set objNewGroup = objOU.Create("Group", "Finance Department")
objNewGroup.sAMAccountName = "financedept"
objNewGroup.groupType = ADS_GROUP_TYPE_GLOBAL_GROUP
objNewGroup.SetInfo

過程和原因我們就不加詳述了;如需詳細資訊,請參閱《Microsoft Windows 2000 Scripting Guide》(英文) 的相關部分

現在有了一個內含多個成員的現有群組 (Finance Managers),以及一個不含任何成員的新群組 (Finance Department),不過我們可以做些變動: 只要抓取 Finance Managers 的成員資格,將它複製到 Finance Department 就可以了。信不信由你,這個動作只需三行程式碼就搞定了:

For Each objUser in objOldGroup.Member
    objNewGroup.Add "LDAP://" & objUser
Next

結果群組的 Member 屬性有該群組所有成員的集合,我們可以使用簡單的 For Each 迴圈,來循環處理 Member 屬性的值,然後傳回每個群組成員的 distinguishedName (DN) 屬性。

注意:distinguishedName 屬性如下所示:

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

還好,我們只需要使用者的 ADsPath,就可以把該使用者加入群組了。ADsPath 就是 ADSI 提供者 (在本例為 LDAP://) 和使用者 DN 的組合。到目前為止,我們已有下面這兩項:ADSI 提供者 (如果是使用 Active Directory,則必須是 LDAP://) 和使用者 DN。在這行程式碼中,我們把使用者加入新群組中,將 ADSI 提供者和使用者 DN 的組合,作為 Add 方法的唯一參數。

objNewGroup.Add "LDAP://" & objUser

接著就是對 Finance Managers 群組的每個成員,重複執行上述步驟,抓取其 distinguishedName 屬性的值,然後利用該值將使用者 (或電腦、群組等) 加入 Finance Department 群組中。結論是:儘管沒有 Copy 命令,還是可將群組的成員清單複製到另一個群組,不知道藉由 VBScript 人工複製的日子會不會就成歷史?(我這麼說好了:一開始我們也只有一個 Scripting Guy 為您服務嘛…)。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

回到頁首 回到頁首