如何根据组成员身份来映射驱动器?

来源:百度文库 编辑:神马文学网 时间:2024/05/01 02:28:34
问:
嗨,Scripting Guy!如何在登录脚本中根据每个用户所属的安全组来映射驱动器?
-- RO
答:
嗨,RP。考虑到大约有 3,755,392 名读者问过这个问题,现在又增加了一名,总数达到 3,755,393 名。我们决定最好还是解答一下这个问题吧。那么,让我们开始吧。
此处共有两个问题。其一,您需要确定用户属于哪个组;其二,您需要基于某个特定组中用户的成员身份来映射驱动器。因为要解决两个问题,所以我们还是沿用以前常用的老方法,先介绍如何完成第一步,接着介绍如何完成第二步,然后将两者综合到一起,就是实际完成相关任务的最终方法。
首先,您需要确定用户属于哪个组;在实际执行此 操作之前,需要先确定该用户的名称。因为您将此脚本作为登录脚本运行,所以这实际上非常容易:您可以使用 ADSystemInfo 对象来确定刚登录的用户的可分辨名称:
Set objSysInfo = CreateObject("ADSystemInfo")Wscript.Echo strUser.UserName
为什么我们需要可分辨名称,而不是用户的登录名称呢?可分辨名称(类似于“CN=Ken Myer, OU=Finance, DC=fabrikam, DC=com”)为用户的 Active Directory 用户帐户提供了近乎完整的路径;事实上,只需将“LDAP://”添加到前面,我们就已经成功了一半。登录名(例如,“kmyer”)的用处就差多了;如果我们只知道登录名,则必须进行 Active Directory 搜索以确定该帐户的 Active Directory 路径。如果一开始就知道可分辨名称,则可以跳过所有这些步骤。
在添加 LDAP:// 并构造 Active Directory 路径后,就可以立即绑定到 Active Directory 中的用户帐户,并报告该用户所属的组;只需要枚举“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
注意,我们此处执行的操作是使用下面一行代码构造该组的 Active Directory 路径:
strGroupPath = "LDAP://" & strGroup
然后,绑定到该组本身并回显 CN 的值。为什么?MemberOf 属性返回用户所属的每个组的可分辨名称;因此,您可以得到类似于“CN=Finance Users, OU=Finance, DC=fabrikam, DC=com”的名称。这很好,但我们更希望得到类似于“Finance Users”的组名(即 CN)。因此,我们继续绑定到该组并获取 CN。
对于第二步“映射网络驱动器”,这非常容易;以下代码将驱动器 X 映射到共享 \\atl-fs-01\finance:
Set objNetwork = CreateObject("Wscript.Network")objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\finance"
我们只需要创建一个 WSH Network 对象实例,然后调用 MapNetworkDrive 方法并为该方法传递两个参数:驱动器号和要映射到的文件共享。
因此,此处所说的“最后!”就是指以下脚本:它用来确定用户所属的组;然后根据组成员身份将驱动器 X 映射到相应的网络共享。为此,我们返回一个包含所有组的列表,然后使用 Select Case 语句来查看用户是否属于目标组之一。例如,以下代码检查用户是否属于 Finance Users 组;如果属于,则脚本将驱动器 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
有关此脚本的一些注意事项:第一,此脚本假定用户只属于相关组之一。假定用户同时属于 Manufacturing Users 和 Shipping and Receiving Users。在这种情况下,驱动器 X 将映射到 \\atl-fs-01\manufacturing,但在脚本试图将驱动器 X 映射到 \\atl-fs-01\shipping 时,将会发生错误;发生此错误的原因是驱动器已被使用。如果用户可能属于多个组,则必须使用某种方法解决这一问题:也许可以通过允许多个驱动器映射来实现(例如,映射驱动器 X,然后如果使用了驱动器 X,则将下一组的驱动器映射到驱动器 Y)。我们改日再进行详细介绍。
此外,该脚本假定按名称列出安全组中的用户。然而,如果用户 Ken Myer 恰好是 Accounting 组的成员,而该组(不是个别用户)是 Finance Users 的成员,那该怎么办呢?在这种情况下,无法正确映射该驱动器,因为此脚本无法解决嵌套组(组中包含其他组)问题。您需要使用更复杂的脚本,我们将在不久以后介绍完成此操作的脚本。