如何以编程方式从Access DB中删除已知密码

本文关键字:删除 密码 DB Access 编程 方式 | 更新日期: 2023-09-27 18:07:08

由于我无法控制的原因,我必须处理一个新的Access MDB文件,该文件每月由我编写的一个自动化过程下载、解密和解压缩。尽管使用了PGP加密,发送方(保险公司)还是拒绝发送没有密码保护的MDB。

不幸的是,在文件下载之后,它立即被处理,并且假定没有密码,因此由于oledbeexception显示我们有错误的密码,因此这些文件没有被处理。我们知道密码,也知道连接字符串的"with database password"选项:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:'mydatabase.mdb;Jet OLEDB:Database Password=MyDbPassword;

这只解决了部分问题,因为另一个部门稍后需要访问这些文件,而他们不知道密码。到目前为止,我只能在打开文件时按住Shift,在密码提示符处取消,通过开放访问过程再次打开文件,同时再次按住Shift并单击"open Exclusive",在通过密码对话框时继续按住Shift,然后通过安全工具取消密码。

我想做的只是在MDB文件上以编程方式取消设置DB密码,只要它下载,使用c#。是否有办法做到这一点,或者我是否必须在每次获得新文件时亲自干预,这完全违背了自动化的目的?

如何以编程方式从Access DB中删除已知密码

以编程方式更改密码的详细方法如下。

基本上,需要做以下事情:

  1. 使用ADO打开数据库连接。净
  2. 在数据库上执行alter语句,将数据库的密码设置为NULL,如下所示:

    ALTER DATABASE PASSWORD [Your PASSWORD] NULL;
  3. 处理连接

取自源代码的示例代码:

Private Function CreateDBPassword(ByVal Password As String, _
    ByVal Path As String) As Boolean
Dim objConn as ADODB.Connection
Dim strAlterPassword as String
On Error GoTo CreateDBPassword_Err
' Create the SQL string to initialize a database password.
strAlterPassword = "ALTER DATABASE PASSWORD [Your Password] NULL;"
' Open the unsecured database.
Set objConn = New ADODB.Connection
With objConn
    .Mode = adModeShareExclusive
    .Open "Provider=Microsoft.Jet.OLEDB.4.0;Data " & _
        "Source=[Your Path];" 
 ' Execute the SQL statement to secure the database.
 .Execute (strAlterPassword)
End With
' Clean up objects.
objConn.Close
Set objConn = Nothing
' Return true if successful.
CreateDBPassword = True
CreateDBPassword_Err:
Msgbox Err.Number & ":" & Err.Description
CreateDBPassword = False 
End Function

如果有人要做类似的事情,下面是我最后做的:

using System.Data;
using System.Data.OleDb;
namespace FTPAutomation.Utilities
{
    public class AccessUtilities
    {
        public static void StripPasswordFromMDB(string currentPassword, string mdbFilePath)
        {
            var accessBuilder = new OleDbConnectionStringBuilder
            {
                Provider = "Microsoft.Jet.OLEDB.4.0",
                DataSource = mdbFilePath
            };
            using (var conn = new OleDbConnection(accessBuilder.ConnectionString))
            {
                try
                {
                    conn.Open();
                    return;
                }
                catch
                {
                    // Do nothing, just let it fall through to try with password and exclusive open.
                }
            }
            accessBuilder["Jet OLEDB:Database Password"] = currentPassword;
            accessBuilder["Mode"] = "Share Exclusive";
            using (var conn = new OleDbConnection(accessBuilder.ConnectionString))
            {
                if (ConnectionState.Open != conn.State)
                {
                    conn.Open(); // If it fails here, likely due to an actual bad password.
                }
                using (
                    var oleDbCommand =
                        new OleDbCommand(string.Format("ALTER DATABASE PASSWORD NULL [{0}]", currentPassword), conn))
                {
                    oleDbCommand.ExecuteNonQuery();
                }
            }
        }
    }
}