打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

问:

嗨,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 的成员,那该怎么办呢?在这种情况下,无法正确映射该驱动器,因为此脚本无法解决嵌套组(组中包含其他组)问题。您需要使用更复杂的脚本,我们将在不久以后介绍完成此操作的脚本。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
方便用户共享资源,在域内通过脚本给域内计算机映射网络驱动器-微软技术-Cnfan.net中国网络
教你写最简单的脚本 让电脑帮你表白
VBS脚本运行库手册之——文件系统
Windows Scripting - 簡易資料備份
VBS映射网络驱动器 映射网络驱动器
ASP实例教程:FileSystemObject对象
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服