首页 > 解决方案 > 将 uid 和 pwd 文件调用到系统 dsn 的访问数据库中

问题描述

我有 5 个不同的 MS Access 2013 db 文件,它们连接到系统 dsn 文件(链接服务器)机器/系统 dsn 是基于 Oracle 的,但我遇到的问题是 1 我的密码没有加密,必须每 90 天更改一次2 我必须打开每个文件并在更改密码时多次保存我的密码。

我希望有一个安全的位置存储凭据并将其传递给访问,以便其他用户看不到它们,并且不必在每个访问文件上保存我的密码并重新链接它。

我已经用谷歌搜索了超过 2 天,但除了查看仍然无法解决问题的连接字符串之外找不到任何东西。我需要看什么来解决这个问题?

抱歉,我没有代码,因为我只是在 ms 访问中使用链接表向导。

@Albert DI 无法让您的代码正常工作,但我已经完成了以下操作,解决了表上的问题,但没有解决直通查询

创建了一个文件 DSN 并将一些表链接到访问数据库。创建了一个 Excel 文件来存储我的用户名和密码,但我在直通查询中的凭据仍然显示我被卡住了?

Option Compare Database

Function Connections()
On Error Resume Next
'delete query if exists
DoCmd.DeleteObject acQuery, "PTQ"
Err.Clear
On Error GoTo 0 '"on error" statement here

'GET EXCEL LOGIN DETAILS
Set xlsApp = CreateObject("Excel.Application")
Dim WkBk As Excel.WorkBook
Set WkBk = xlsApp.WorkBooks.Open(FileName:="C:\folderlocation\filename.xlsx")

Dim USERLIST As String
Dim PWDLIST As String

USERLIST = WkBk.Sheets(1).Range("A2").Value
PWDLIST = WkBk.Sheets(1).Range("B2").Value

If Not (xlsApp Is Nothing) Then xlsApp.Quit
'end excel stuff
Dim db As DAO.Database
Dim qdExtData As QueryDef
Dim strSQL As String
Set db = CurrentDb
'passthrough query statement
strSQL = "SELECT * FROM table"
Set qdExtData = db.CreateQueryDef("PTQ")

ServerName = "Server1"
qdExtData.Connect = "ODBC;DRIVER={Oracle in OraClient11g_home1};Server=" & ServerName & ";DBQ=Server1;UID=" & USERLIST & ";Pwd=" & PWDLIST & ""

qdExtData.SQL = strSQL
qdExtData.Close
db.Close
Set db = Nothing
End Function

然后我设置了一个名为 AutoExec 的运行代码宏

标签: vbaoraclems-accessdsn

解决方案


好的,先上?我会避免(不使用)系统或用户 DSN。原因有很多,但这些类型的 DSN 不仅需要外部引用,而且通常还需要提升的注册表权限。更糟糕的是,您的密码将一目了然。

最好的解决方案是使用所谓的无 DSN 连接。即使没有代码,您也可以创建这些连接!

甚至更好?如果服务器+数据库名称没有改变,但只有密码?您可以更改用户 ID + 密码,而无需重新链接表(非常适合您更改密码,但不更改服务器 + 数据库)。

更好更好?如果您采用一点“登录”代码,那么您不必将密码存储在表链接中!如果有人决定启动访问权限并说导入您的链接表,这意味着什么?好吧,首先,他们将无法打开表,甚至更好的是 uid/密码不是其中的一部分,也不是存储在每个链接表的连接字符串中。如前所述,因此,您可以更改 UID,而不必重新链接表。

第一步:首先,总是(但总是!)链接表时,使用 FILE dsn。这很重要,因为在访问中使用 FILE dsn 时,它们会自动为您转换为无 DSN 连接。

换句话说,如果您使用 FILE dsn 链接表,那么一旦重新链接表,您甚至可以删除或丢弃 DSN。这意味着您可以将链接数据库(前端)部署到任何工作站。您不必在该工作站上设置 DSN,实际上根本不需要设置任何东西。(您当然需要 oracle 数据库驱动程序)。

上面的意思是当密码被更新/更改时,你可以简单地推出一个新的前端。事实上,您的应用程序可能具有一些自动更新功能。(如果你不这样做,那么你可以(应该)拼凑一些代码来为你做这件事)。所以,你应该有一些方法来推出你的软件的新版本。毕竟,您真的必须像使用所有其他软件一样在每个工作站上安装“应用程序”,对吗???

因此,这里有两个部分: 为表链接采用 FILE dsn。如前所述,一旦执行此操作,您就不再需要 DSN。这非常适合分发到每个工作站。

还请确保在进行链接时,不要选中该框以保存密码。这是为了确保 uid/password 不会保存在连接字符串中。

那么,如果表没有 uid/密码,那么它们将如何工作?好吧,您所做的是在启动代码中对数据库执行“登录”。执行此登录后,所有链接表都将起作用!正是这段“小”代码可以读取您放置在外部文件中的 uid/密码。您放置此 uid/密码的位置取决于您。它可以嵌入在代码中,甚至可以嵌入到您在启动时阅读的一些外部文本文件中。它甚至可以是前端的本地表。(如果您在推出软件的下一个出色版本时有某种自动更新系统,这个想法会很有效。

因此,有了执行登录的能力,而不必重新链接表,我们就有了一种简单的方法来更改密码。

所以,你必须:去 dsn-less。值得庆幸的是,默认情况下访问会执行此操作,但前提是您使用 FILE dsn。

获取/获取执行登录数据库的代码。事实上,您可能必须删除所有表格链接。退出 Access,然后重新启动 Access。现在,运行您的登录代码,然后重新链接您的表(使用您制作的 FILE dsn)。

执行登录的代码是这样的:

  Function TestLogin(strCon As String) As Boolean

     On Error GoTo TestError

     Dim dbs          As DAO.Database
     Dim qdf          As DAO.QueryDef

     Set dbs = CurrentDb()
     Set qdf = dbs.CreateQueryDef("")

      qdf.connect = strCon

      qdf.ReturnsRecords = False

      'Any VALID SQL statement that runs on server will work below.

      qdf.sql = "SELECT 1 "
      qdf.Execute

      TestLogin = True

      Exit Function

 TestError:
      TestLogin = False
      Exit Function

  End Function

以上当然需要正确形成的连接字符串。

因此,要使所有这些工作,您可以采用 FILE dsn,并在上面使用。您可能会拼凑一些代码来构建连接字符串。然后将一些代码添加到您的代码中以读取外部 ext 文件,或者在某个表中包含 UID/密码。上述登录代码必须在使用或触摸任何表单或链接表之前运行。

整个过程很简单,但前提是您将其分解为正确的步骤。

此登录技巧和示例代码的工作原理并不复杂,但此处概述了解释此方法的完整文章

电源提示:提高数据库连接的安全性

https://www.microsoft.com/en-us/microsoft-365/blog/2011/04/08/power-tip-improve-the-security-of-database-connections/


推荐阅读