我在网络驱动器上存储了一个功能齐全的站点,以及一个用作站点数据库的 Access 数据库。 由于缺少服务器端代码,我不得不使用 JavaScript 创建一个 ADO ActiveX 对象来连接到数据库。这行得通。
我遇到的问题是,每当用户打开站点时,都会出现 ADO 安全警告,询问他们是否信任该站点。如果他们按“取消”,抛出的错误是:这台计算机上的安全设置禁止 Access 另一个域上的数据源
但是数据库存储在与站点相同的网络目录中...如果他们按“好的”网站可以正常打开。
有什么方法可以阻止出现此警告?
最佳答案
我知道这是一个老问题,但我遇到了同样的问题,令我抓狂的是还有其他人也没有回答 - 我发现了一些应该对某些人有帮助的信息,我有一个解决方法:
从网页运行此代码的问题在于它受与该浏览器关联的安全控制的约束。如果网站用户使用不同的浏览器,他们可能不会得到同样的错误——如果我不得不猜测的话,他们可能会在 IE 中得到错误。在 IE 中,有一个名为“跨域 Access 数据源”的安全控件,它位于“杂项”部分,如果您在 工具 > Internet 选项、安全 选项卡下,选择站点的适用区域 (可能是 Intranet,但这可以通过在站点上查看底部的 IE 状态栏来确认,以查看正在应用的区域),然后选择 Custom Level.如果工作站由 GPO 管理,就会出现问题 - 自定义级别显示为灰色。如果没有,您可以找到该设置,在 Access 该站点的适用客户端工作站上选择启用,然后您就完成了。
如果它由 GPO 管理,并且您是能够进行此类更改的域管理员:
对于您想要进行更改的客户端工作站的 Active Directory 用户和计算机中适用的 OU,右键单击它并找到 GPO 并进行编辑。它位于:本地计算机策略 > 计算机配置 > 管理模板 > Windows 组件 > Internet Explorer > Internet 控制面板 > 安全页面 > Intranet 区域(可能)> 第一个选项:跨域 Access 数据源域。右键单击它并选择编辑。选择已启用单选按钮,然后在下拉列表中选择已启用。
选择应用和确定。
如果客户端工作站未获得更新,请重新启动,或在命令行上执行 gpupdate/force
以强制 GPO 更新并重新启动。
如果它由 GPO 管理,并且您不是能够进行此类更改的域管理员:
改为使用 VBScript。您可以使用连接编写单独的 VBScript 文件,甚至可以从 JavaScript 调用它。下面是一个脚本,它有一个我从 https://gallery.technet.microsoft.com/scriptcenter/b160d928-fb9e-4c49-a194-f2e5a3e806ae 中提取的 ADO 连接。作为如何格式化它的示例。当然,它是针对 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
在我的例子中,当我将此 block 放入 HTA(在浏览器中运行)并使用来自按钮单击事件的特定组名运行 getGroup() 时,我得到了错误。我什至没有尝试从不同的域中获取一个组!没关系!所以我不得不将其提取到自己的 VBScript 中并自行运行。我把我得到的输出写到一个文件中(通过存储对变量的响应,在每个结果之后用 & vbCrLf
换行,然后从这里发送到代码: http://www.computerperformance.co.uk/vbscript/vbscript_file_opentextfile.htm)。我不会包括该代码,因为它甚至更深层次的兔子洞和题外话。但是,如果必须的话,您可以将输出写入文件并读回,这就是我的观点。你可能不必。一旦将执行数据抓取的代码提取到它自己的进程中,您就可能能够绕过错误。但只要它与浏览器安全设置相关联,它就会出现并成为一个问题,只要该设置保持禁用状态。
关于javascript - 在 JavaScript/HTM 页面中禁止 ADO 安全警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24778918/