在JavaScript / HTM页面中禁止ADO安全警告

时间:2014-07-16 10:50:25

标签: javascript ms-access activex ado activexobject

我有一个存储在网络驱动器上的功能完备的站点以及作为站点数据库的Access数据库。 由于缺少服务器端代码,我不得不使用JavaScript创建一个ADO ActiveX对象来连接数据库。这很有效。

我遇到的问题是,无论何时用户打开网站,都会出现ADO安全警告,询问他们是否信任该网站。如果他们按“取消”#39;抛出的错误是:Safety settings on this computer prohibit accessing a data source on another domain但是数据库存储在与网站相同的网络目录中......如果他们按下“确定”。网站打开正常。

有没有办法阻止此警告出现?

2 个答案:

答案 0 :(得分:1)

我知道这是一个老问题,但我遇到了同样的问题,让我感到很生气的是,还有其他人也没有答案 - 我发现了一些应该帮助某些人的信息,我有一个解决方法:

从网页运行此代码的问题在于它受与该浏览器关联的安全控件的约束。如果他们使用不同的浏览器,网站用户可能不会得到相同的错误 - 如果我不得不猜测,他们可能会在IE中收到错误。在IE浏览器中,如果你进入工具>,则可以使用名为"跨域"访问数据源的安全控件,该文件位于其他部分。 “Internet选项,安全性”选项卡,选择适用于该站点的区域(可能 Intranet ,但这可以通过在您访问网站时查看底部的IE状态栏来确认,查看正在应用的区域),然后选择自定义级别。如果工作站由GPO管理,则会出现问题 - 自定义级别显示为灰色。如果没有,您可以找到该设置,在访问该网站的适用客户端工作站上选择启用,然后您就完成了。

如果它由GPO管理,并且您是能够进行此类更改的域管理员:

对于Active Directory用户中的适用OU&amp;您想要进行更改的客户端工作站的计算机,右键单击它并找到GPO&amp;编辑。它位于:本地计算机政策&gt; <计算机配置>管理模板&gt; Windows组件&gt; Internet Explorer&gt;互联网控制面板&gt;安全页面&gt;内联网区域(可能)&gt;第一个选项:跨域访问数据源。右键单击它并选择编辑。选择已启用单选按钮,然后在下拉列表中选择已启用

选择应用确定

如果客户端工作站未获得更新,请重新启动,或在命令行上执行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 

在我的情况下,就是当我将这个块放入HTA(在浏览器中运行)并从按钮点击事件中运行具有特定组名的getGroup()时,我得到了我的错误。我甚至没有尝试从不同的域名获得一个团队!没关系!所以我不得不把它拉到自己的VBScript中并自己运行它。我接受了我得到的输出并将其写入文件(通过将响应存储到变量中,在每个结果之后使用& vbCrLf进行换行,并将其从此处发送到代码:{{3} })。我不会包含那些代码,因为它甚至更远离兔子洞和偏离主题。但是你可以把你的输出写成一个文件并重新读回来,如果你不得不这样做,那就是我的观点。你可能没有。一旦你将正在进行数据抓取的代码解放到自己的进程中,你就可以解决这个错误了。但只要它与浏览器安全设置相关联,它就会出现并成为一个问题,只要该设置保持禁用状态。

答案 1 :(得分:0)

我遇到了同样的问题,在Internet上到处搜索解决方案,大多数建议更改IE安全设置等,但实际上并没有用(尽管解决方案一直在流行)。

这是解决复杂问题的简单方法。

Set objShell = CreateObject("Wscript.shell")

clicked = 1
Set connect = CreateObject("ADODB.Connection")
If clicked = 1 Then
    objShell.SendKeys "{ENTER}"
    clicked = 0
End If