我知道这是一个老问题,但我也遇到了同样的问题,让我生气的是还有其他人也没有答案 - 我发现了一些可以帮助某些人的信息,我有一个解决方法:
从网页运行此代码的问题在于它受到与该浏览器关联的安全控件的约束。如果网站用户使用不同的浏览器,他们可能不会收到相同的错误 - 如果我不得不猜测的话,他们可能会在 IE 中收到错误。在 IE 中,有一个名为“跨域访问数据源”的安全控制,它位于“其他”部分,如果您进入工具 > Internet 选项、安全选项卡,选择站点的适用区域(可能是Intranet,但这可以通过在网站上时查看底部的 IE 状态栏来确认,以查看正在应用的区域),然后选择自定义级别。如果工作站由 GPO 管理,则会出现问题 - 自定义级别显示为灰色。如果没有的话,可以找到设置,选择Enable在正在访问该站点的适用客户端工作站上,您就完成了。
如果它由 GPO 管理,并且您是能够进行此类更改的域管理员:
对于要进行更改的客户端工作站的 Active Directory 用户和计算机中的适用 OU,右键单击它并找到 GPO 并进行编辑。它位于:本地计算机策略 > 计算机配置 > 管理模板 > Windows 组件 > Internet Explorer > Internet 控制面板 > 安全页面 > Intranet 区域(可能)>第一个选项:跨域访问数据源。右键单击它并选择Edit。选择Enabled单选按钮,然后选择Enabled在下拉菜单中。
Select Apply and OK.
如果客户端工作站没有获得更新,请重新启动,或者执行gpupdate /force
在命令行上强制更新 GPO 并重新启动。
如果它由 GPO 管理,并且您不是能够进行此类更改的域管理员:
请改用 VBScript。您可以使用连接编写单独的 VBScript 文件,甚至可以从 JavaScript 调用它。下面是一个脚本,其中包含我从中提取的 ADO 连接https://gallery.technet.microsoft.com/scriptcenter/b160d928-fb9e-4c49-a194-f2e5a3e806ae https://gallery.technet.microsoft.com/scriptcenter/b160d928-fb9e-4c49-a194-f2e5a3e806ae作为如何格式化它的示例。当然,它是针对 AD 而不是 Access,但概念是相同的:
Option Explicit
Dim objGroup
'VERIFY A GROUP NAME WAS PASSED
If wscript.arguments.count <> 1 Then
wscript.echo "NO GROUP PASSED"
wscript.echo "Usage: scriptName <groupSamAccountName>"
wscript.quit
End If
'BIND TO THE GROUP
Set objGroup = getGroup(wscript.Arguments(0))
'ENUMERATE THE GROUPS MEMBERS
enumMembers objGroup, ""
Function getGroup(strGroupName)
Dim objConn, objRecSet, strQueryString, objRootDSE, strQueryFrom
Const adsOpenStatic = 3
Set objRootDSE = GetObject("LDAP://RootDSE")
strQueryFrom = "LDAP://" & objRootDSE.get("defaultNamingContext")
Set objConn = wscript.CreateObject("ADODB.Connection")
objConn.Provider = "ADsDSOObject"
objConn.Open
strQueryString = "SELECT AdsPath FROM '" & strQueryFrom & "' WHERE samAccountName = '" & strGroupName & "'"
Set objRecSet = wscript.CreateObject("ADODB.Recordset")
objRecSet.Open strQueryString, objConn, adsOpenStatic
If objRecSet.recordCount = 1 Then
Set getGroup = GetObject(objRecSet("AdsPath"))
Else
wscript.echo ucase(strGroupName) & " was not found in the domain. (" & objRootDSE.get("defaultNamingContext") & ")"
wscript.quit
End If
End Function
Sub enumMembers(byRef objGroup, strInheritedFrom)
Dim objMember
For Each objMember In objGroup.Members
If lcase(objMember.class) = "group" Then
enumMembers objMember, objMember.samAccountName
Else
If objMember.displayname <> "" Then
If strInheritedFrom = "" Then
wscript.echo objMember.displayname
Else
wscript.echo objMember.displayname & " (From NESTED GROUP: " & strInheritedFrom & ")"
End If
Else
If strInheritedFrom = "" Then
wscript.echo objMember.samAccountName
Else
wscript.echo objMember.samAccountName & " (From NESTED GROUP: " & strInheritedFrom & ")"
End If
End If
End If
Next
End Sub
就我而言,当我将此块放入 HTA(在浏览器中运行)中并使用按钮单击事件中的特定组名称运行 getGroup() 时,我收到了错误。我什至没有试图从不同的域获得一个组!没关系!所以我必须将其提取到自己的 VBScript 中并单独运行。我将得到的输出写入一个文件(通过存储对变量的响应,使用& vbCrLf
在每个结果之后换行,然后将其发送到此处的代码:http://www.computerperformance.co.uk/vbscript/vbscript_file_opentextfile.htm http://www.computerperformance.co.uk/vbscript/vbscript_file_opentextfile.htm)。我不会包含该代码,因为它甚至离题更远。但我的观点是,如果必须的话,您可以将输出写入文件并将其读回。你可能不必这样做。一旦您将执行数据抓取的代码提取到自己的进程中,您就可能能够解决该错误。但只要它与浏览器安全设置相关,只要该设置保持禁用状态,它就会出现并成为一个问题。