嗨,Scripting Guy!如何在登錄腳本中根據(jù)每個(gè)用戶所屬的安全組來映射驅(qū)動器?
-- RO
嗨,RP??紤]到大約有 3,755,392 名讀者問過這個(gè)問題,現(xiàn)在又增加了一名,總數(shù)達(dá)到 3,755,393 名。我們決定最好還是解答一下這個(gè)問題吧。那么,讓我們開始吧。
此處共有兩個(gè)問題。其一,您需要確定用戶屬于哪個(gè)組;其二,您需要基于某個(gè)特定組中用戶的成員身份來映射驅(qū)動器。因?yàn)橐鉀Q兩個(gè)問題,所以我們還是沿用以前常用的老方法,先介紹如何完成第一步,接著介紹如何完成第二步,然后將兩者綜合到一起,就是實(shí)際完成相關(guān)任務(wù)的最終方法。
首先,您需要確定用戶屬于哪個(gè)組;在實(shí)際執(zhí)行此 操作之前,需要先確定該用戶的名稱。因?yàn)槟鷮⒋四_本作為登錄腳本運(yùn)行,所以這實(shí)際上非常容易:您可以使用 ADSystemInfo 對象來確定剛登錄的用戶的可分辨名稱:
Set objSysInfo = CreateObject("ADSystemInfo")Wscript.Echo strUser.UserName
為什么我們需要可分辨名稱,而不是用戶的登錄名稱呢?可分辨名稱(類似于“CN=Ken Myer, OU=Finance, DC=fabrikam, DC=com”)為用戶的 Active Directory 用戶帳戶提供了近乎完整的路徑;事實(shí)上,只需將“LDAP://”添加到前面,我們就已經(jīng)成功了一半。登錄名(例如,“kmyer”)的用處就差多了;如果我們只知道登錄名,則必須進(jìn)行 Active Directory 搜索以確定該帳戶的 Active Directory 路徑。如果一開始就知道可分辨名稱,則可以跳過所有這些步驟。
在添加 LDAP:// 并構(gòu)造 Active Directory 路徑后,就可以立即綁定到 Active Directory 中的用戶帳戶,并報(bào)告該用戶所屬的組;只需要枚舉“MemberOf”屬性的值,即可完成此操作。因此:
On Error Resume NextSet objSysInfo = CreateObject("ADSystemInfo")Set objNetwork = CreateObject("Wscript.Network")strUserPath = "LDAP://" & objSysInfo.UserNameSet objUser = GetObject(strUserPath)For Each strGroup in objUser.MemberOfstrGroupPath = "LDAP://" & strGroupSet objGroup = GetObject(strGroupPath)Wscript.Echo objGroup.CNNext
注意,我們此處執(zhí)行的操作是使用下面一行代碼構(gòu)造該組的 Active Directory 路徑:
strGroupPath = "LDAP://" & strGroup
然后,綁定到該組本身并回顯 CN 的值。為什么?MemberOf 屬性返回用戶所屬的每個(gè)組的可分辨名稱;因此,您可以得到類似于“CN=Finance Users, OU=Finance, DC=fabrikam, DC=com”的名稱。這很好,但我們更希望得到類似于“Finance Users”的組名(即 CN)。因此,我們繼續(xù)綁定到該組并獲取 CN。
對于第二步“映射網(wǎng)絡(luò)驅(qū)動器”,這非常容易;以下代碼將驅(qū)動器 X 映射到共享 \\atl-fs-01\finance:
Set objNetwork = CreateObject("Wscript.Network")objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\finance"
我們只需要?jiǎng)?chuàng)建一個(gè) WSH Network 對象實(shí)例,然后調(diào)用 MapNetworkDrive 方法并為該方法傳遞兩個(gè)參數(shù):驅(qū)動器號和要映射到的文件共享。
因此,此處所說的“最后!”就是指以下腳本:它用來確定用戶所屬的組;然后根據(jù)組成員身份將驅(qū)動器 X 映射到相應(yīng)的網(wǎng)絡(luò)共享。為此,我們返回一個(gè)包含所有組的列表,然后使用 Select Case 語句來查看用戶是否屬于目標(biāo)組之一。例如,以下代碼檢查用戶是否屬于 Finance Users 組;如果屬于,則腳本將驅(qū)動器 X 映射到共享 \\atl-fs-01\finance:
Case "Finance Users"objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\finance"
以下是最終的腳本:
On Error Resume NextSet objSysInfo = CreateObject("ADSystemInfo")Set objNetwork = CreateObject("Wscript.Network")strUserPath = "LDAP://" & objSysInfo.UserNameSet objUser = GetObject(strUserPath)For Each strGroup in objUser.MemberOfstrGroupPath = "LDAP://" & strGroupSet objGroup = GetObject(strGroupPath)strGroupName = objGroup.CNSelect Case strGroupNameCase "Finance Users"objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\finance"Case "Human Resource Users"objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\hr"Case "Manufacturing Users"objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\manufacturing"Case "Shipping and Receiving Users"objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\shipping"End SelectNext
有關(guān)此腳本的一些注意事項(xiàng):第一,此腳本假定用戶只屬于相關(guān)組之一。假定用戶同時(shí)屬于 Manufacturing Users 和 Shipping and Receiving Users。在這種情況下,驅(qū)動器 X 將映射到 \\atl-fs-01\manufacturing,但在腳本試圖將驅(qū)動器 X 映射到 \\atl-fs-01\shipping 時(shí),將會發(fā)生錯(cuò)誤;發(fā)生此錯(cuò)誤的原因是驅(qū)動器已被使用。如果用戶可能屬于多個(gè)組,則必須使用某種方法解決這一問題:也許可以通過允許多個(gè)驅(qū)動器映射來實(shí)現(xiàn)(例如,映射驅(qū)動器 X,然后如果使用了驅(qū)動器 X,則將下一組的驅(qū)動器映射到驅(qū)動器 Y)。我們改日再進(jìn)行詳細(xì)介紹。
此外,該腳本假定按名稱列出安全組中的用戶。然而,如果用戶 Ken Myer 恰好是 Accounting 組的成員,而該組(不是個(gè)別用戶)是 Finance Users 的成員,那該怎么辦呢?在這種情況下,無法正確映射該驅(qū)動器,因?yàn)榇四_本無法解決嵌套組(組中包含其他組)問題。您需要使用更復(fù)雜的腳本,我們將在不久以后介紹完成此操作的腳本。