禁用JavaScript/HTM页面中的ADO安全警告

Suppress ADO Security Warning in JavaScript/HTM Page

本文关键字:ADO 安全 警告 JavaScript HTM 禁用      更新时间:2023-09-26

我有一个功能齐全的网站存储在一个网络驱动器与访问数据库,作为该网站的数据库。由于缺乏服务器端代码,我被迫使用JavaScript创建一个ADO ActiveX对象来连接到数据库。这工作。

我遇到的问题是,每当用户打开网站的ADO安全警告出现询问他们是否信任该网站。如果他们按"取消",抛出的错误是:Safety settings on this computer prohibit accessing a data source on another domain,但是数据库存储在与站点相同的网络目录中…如果他们按"OK",网站就会打开。

有没有办法阻止这个警告的出现?

我知道这是一个老问题,但我有同样的问题,这让我发狂,有其他人也在SO没有答案-我发现了一些信息,应该帮助一些人,我有一个解决方案:

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

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

对于Active Directory用户&在客户端工作站的计算机上,您想让更改感觉,右键单击它并找到gpo &编辑。它位于:本地计算机策略>计算机配置>管理模板> Windows组件> Internet Explorer> Internet控制面板>安全页面> Intranet区域(可能)>第一个选项:跨域访问数据源。右键单击并选择编辑。选择Enabled单选按钮,然后在下拉框中选择Enabled

选择应用OK

如果客户端工作站没有得到更新,要么重新启动,要么在命令行上执行gpupdate /force来强制GPO更新并重新启动。

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

用VBScript代替。你可以用这个连接写一个单独的VBScript文件,你甚至可以从JavaScript调用它。下面是一个脚本,有一个ADO连接,我从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)。我不会包括这段代码,因为它甚至更远的兔子洞和离题。但是,如果有必要,您可以将输出写入文件并将其读入,这是我的观点。你可能不需要。一旦将执行数据抓取的代码提取到它自己的进程中,就可能能够解决这个错误。但是,只要它与浏览器的安全设置绑定,它就会出现并成为一个问题,尽管,只要该设置保持禁用

我也有同样的问题,在互联网上到处搜索解决方案,大多数建议改变IE安全设置等,这并不真正起作用(尽管解决方案不断循环)。

这是一个复杂问题的简单解决方案。

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