您好,RC。您知道,人们好像一直在寻求某些东西:真爱、幸福、生命的意义。在这些方面我们无法为您提供帮助。(我们原以为可以帮您找到生命的意义,但结果证明我们错了。)但是没关系;毕竟,我们可以帮您找到有远程访问权限的所有用户:
On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.CommandText = _
"SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
"AND msNPAllowDialin = TRUE"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("Name").Value
objRecordSet.MoveNext
Loop
我们总是给人们下面的一项建议:每次寻找什么东西时,最好先在 Active Directory 开始搜索。此脚本就是对此的良好例证。您要查找 Active Directory 中 Dial-in(拨入)选项卡上选择了 Allow access(允许访问)选项的用户:
我们发现,Remote Access Permission (Dial-in or VPN)(远程访问权限(拨入或 VPN))选项等同于 Active Directory 中的 msNPAllowDialin 属性。如果允许访问,msNPAllowDialin 将为 True。如果访问被拒绝,msNPAllowDialin 则将为 False。如果 msNPAllowDialin 没有值,则意味着已选择 Control access through Remote Access Policy(通过远程访问策略控制访问)选项。
换句话说,要找到具有远程访问权限的用户,我们要做的就是搜索 msNPAllowDialin 属性为 True 的用户帐户。我们不会对搜索 Active Directory 的代码进行冗长的说明;在两篇系列文章脚本故事的 Dude,我的打印机在哪儿? 中有对此的详细说明。但是,我们会为您提供搜索这些用户的查询:
objCommand.CommandText = _
"SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
"AND msNPAllowDialin = TRUE"
正如您所看到的,我们在寻找 objectCategory 等于 user(换言之,我们在寻找用户帐户而不是组帐户或计算机帐户)且 msNPAllowDialin 属性为 True 的所有 Active Directory 对象。如果要找到已被拒绝访问的所有用户,则要搜索 msNPAllowDialin 值等于 False 的用户:
objCommand.CommandText = _
"SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
"AND msNPAllowDialin = FALSE"
远程访问权限通过策略确定的用户又怎样呢?此种情况下,我们可以搜索没有配置 msNPAllowDialin 值的用户:
objCommand.CommandText = _
"SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
"AND msNPAllowDialin <> '*'"
当然,这看上去有些奇怪,但在 ADSI 中星号是表示任何值的通配符。在此查询中,我们要获得一个 msNPAllowDialin 属性不等于任何值的用户列表。换句话说,显示 msNPAllowDialin 属性没有值的所有用户;排除具有任何其他值(True 或 False)的用户。因此,此查询返回的用户将是通过策略确定远程访问的用户。(顺便说一下,这是默认设置。如果不指定别的方式,用户将由策略确定远程访问权限。)
嗯,您都清楚了吗?返回符合条件用户的记录集后,我们只需使用以下几行代码在列表中循环,回显每个用户的名称:
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("Name").Value
objRecordSet.MoveNext
Loop
正如前面所述,找到有远程访问权限的用户的列表并不同于找到生命的意义。但我们愿意相信它仅次于生命的意义。