如果使用默认加密(高安全性)保护密码,是不是无法使用 Excel 访问 Access 2010 数据库?

Posted

技术标签:

【中文标题】如果使用默认加密(高安全性)保护密码,是不是无法使用 Excel 访问 Access 2010 数据库?【英文标题】:Are Access 2010 databases not accessible with Excel if password protected using default encryption (High Security)?如果使用默认加密(高安全性)保护密码,是否无法使用 Excel 访问 Access 2010 数据库? 【发布时间】:2014-02-04 16:44:36 【问题描述】:

我目前支持由业务用户编写的 Excel 2010 电子表格和 Access 2010 数据库。 Access 数据库的要求之一是它是加密的。它使用默认加密设置“使用默认加密(更高安全性)”进行加密,可以在选项 -> 客户端设置中进行设置。

现在数据库受密码保护和加密,我无法通过 Excel 连接到数据库。我的测试围绕着将数据导入 Excel,但我真正需要做的是在日志表中创建一行。我正在尝试使用“数据”选项卡和“从访问”选择以及通过 VBA 代码直接导入工作表。使用 Excel 界面时,会出现密码对话框,并且永远不会接受正确的密码。使用 VBA 和 ADO,Open 语句会引发“无效密码”错误。 如果我使用“使用旧版加密”设置加密数据库,这两种方法都可以正常工作。

我认为这也可能是我的设置,我使用的是 32 位 Windows 7 和 Office 2010。我还尝试使用 Office 2013 使用 Windows 8.1 64 位,结果相同。它适用于传统加密,但不适用于默认加密。我之前没有尝试任何东西。 Office 2010 和 Windows 7 引入了默认的更高安全性加密。

我的研究使我找到了this Technet thread 和this *** question,它们都表明 Excel 无法使用默认加密方法与 Access 交互。我还没有找到更多讨论这个确切问题的内容。

我的问题是,使用默认设置密码保护 Access 2010 数据库是否真的会阻止 Excel 2010 导入数据(使用密码时)?这对我来说听起来不太对劲,因为在两个应用程序之间共享数据是一项非常基本的功能。我还认为,如果这是一个问题,谷歌会提供更多关于它的信息。在这一点上我的猜测是 Excel 和 Access 默认使用下一代加密引擎,但 ADO 库尚未更新以使用它。

我已附上连接代码以供审核。为了测试,我正在执行一个简单的 Now() 命令并发出结果。即使使用正确的密码,打开时连接也会失败,并出现“密码无效”错误。适用于传统加密,不适用于默认加密。

Sub ADOCNGConnect()
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim ds As String

    'setting up connection
    Set cn = New ADODB.Connection
    With cn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                            "Data Source='FILEPATH'" & _
                            ";Jet OLEDB:Database Password=password"
        .Open
    End With
    'setup recordset object
    Set rs = New ADODB.Recordset
    'retrieve new number
    rs.Open "SELECT Now() AS qryTest", cn, adOpenKeyset
    MsgBox rs!qryTest
    rs.MoveLast

    'close ADO object vars
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing
End Sub

【问题讨论】:

【参考方案1】:

根据ConnectionStrings.com,ACE 提供程序不适用于新的更强的 Access 2010 db 加密:

"注意! 报告称使用 Access 2010 - 2013 默认加密方案加密的数据库不适用于此连接字符串。在 Access 中;尝试选项并选择 2007 加密方法。这应该可以正常工作。我们不知道任何其他解决方案。"

但是,这并不能说明全部情况。您的代码作为 Access VBA 程序运行,并成功连接到另一个具有更强 Access 2010 加密的 ACCDB。但是我找不到任何方法让类似的代码像 Excel VBA 程序一样工作。

最终我放弃了这种努力。由于您的目标似乎是使包含 Access 数据的 ADO 记录集可用于 Excel,因此我决定自动化 Access 并使用其 CurrentProject.Connection.Execute 方法加载记录集。

这可能看起来有点笨拙,但它确实有效......

Const cstrPath As String = "C:\Users\hans\Documents\a2010_DbPass_foo.accdb"
Const cstrPwd As String = "foo"
Dim objAccess As Object ' Access.Application
Dim rs As Object ' ADODB.Recordset
Dim strSelect As String

Set objAccess = CreateObject("Access.Application")
objAccess.Visible = True
objAccess.OpenCurrentDatabase cstrPath, , cstrPwd

'strSelect = "SELECT Now() AS qryTest"
strSelect = "SELECT some_text AS qryTest FROM tblFoo"
Set rs = objAccess.CurrentProject.Connection.Execute(strSelect)
MsgBox rs!qryTest
rs.Close
Set rs = Nothing
objAccess.Quit
Set objAccess = Nothing

请注意,当我将 "SELECT Now() AS qryTest" 用于 strSelect 时,Access 在 .Quit 处崩溃,我不明白为什么会这样。但该代码在 Excel 2010 中可以正常运行。

【讨论】:

不幸的是,在我的特殊情况下,我使用的是位于远程共享上的多用户数据库,并且不认为本地自动化是个好主意。我还需要进行插入,而不仅仅是读取。我确实喜欢这个解决方案,虽然它很笨重,但如果你必须对本地数据库进行强加密,它会起作用。我将建议我们使用旧方法重新加密数据库。 你是救生员!我一直在寻找几个小时和几个小时,试验和错误。直到这段职业生涯节省了一段代码,没有任何效果:) 对我来说,它实际上弹出打开我面前的 Access 文件来读取数据。有没有办法像在后台一样隐藏它?我祈祷上帝让你像你让我一样快乐:) @AhmadBagadood 是 objAccess.Visible = False 你想要的吗? @HansUp 再次您好 :) 该文件对我来说工作正常。与我的同事共享它,他不断收到“RefreshData = UpdateData 错误:91 对象变量或块变量未设置”。导致错误的行是 Set rs = objAccess.CurrentProject.Connection.Execute(strSelect) 感谢您可以分享的任何见解! 我不知道RefreshData = UpdateData 来自哪里。我认为您或您的朋友必须提交一个显示代码和上下文的问题才能让某人弄清楚这一点。

以上是关于如果使用默认加密(高安全性)保护密码,是不是无法使用 Excel 访问 Access 2010 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

保护登录(用户名-密码)数据

oracle存储过程加密

对称密码-分组密码-AES

网站建设时,如何提高网站安全

哈希和加密相结合:保护安全

无法打开受密码保护的 zip 存档