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

Posted

技术标签:

【中文标题】如何以编程方式从 Access DB 中删除已知密码?【英文标题】:How do I programmatically remove a known password from an Access DB? 【发布时间】:2011-08-30 16:09:15 【问题描述】:

由于我无法控制的原因,我必须处理每月通过我编写的自动化流程下载、解密和解压缩的新 Access MDB 文件。尽管 PGP 加密,发件人(保险公司)拒绝发送未受密码保护的 MDB。

不幸的是,文件下载后立即进行处理,并且假定没有密码,因此由于 OleDbException 表明我们的密码错误,这些文件没有被处理。我们知道密码,并且我们知道连接字符串的“使用数据库密码”选项:

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

这只能解决部分问题,因为其他部门稍后需要访问文件,而他们不知道密码。到目前为止,我只能通过在打开文件时按住 Shift 来使其工作,在密码提示下取消,通过打开的访问过程再次打开文件,同时再次按住 Shift 并单击“以独占方式打开”,继续在浏览密码对话框时按住 Shift,然后通过安全工具取消设置密码。

我想做的只是在 MDB 文件下载后立即使用 C# 以编程方式取消设置数据库密码。有没有办法做到这一点,或者每次我们得到一个新文件时我都必须亲自干预,完全违背了自动化的目的?

【问题讨论】:

克里斯,看看这个来自微软的链接。它在 C# 中,但您可以轻松地将其转换为 C#。这是一个有点旧的代码,但你可能会从那里得到一些想法:msdn.microsoft.com/en-us/library/… @Icarus:那个链接给了我我需要的东西,特别是“ALTER DATABASE PASSWORD NULL [password_goes_here]”。如果你想写一个答案,分数就是你的。 @Chris Doggett:我会写下答案。我很高兴它成功了! 【参考方案1】:

编程修改密码的方法详解here。

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

    使用 ADO.NET 打开与数据库的连接

    在数据库上执行一条alter语句,将其密码设置为NULL:

    ALTER DATABASE PASSWORD [您的密码] NULL;

    释放连接

取自源代码的示例代码:

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

【讨论】:

那段代码解决了我的问题。它实际上是 ALTER DATABASE PASSWORD NewPassword OldPassword,所以我只是将 NULL 换成第一个参数,它就像一个魅力。【参考方案2】:

如果有人不得不做类似的事情,这就是我最终要做的事情:

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();
                
            
        
    

【讨论】:

以上是关于如何以编程方式从 Access DB 中删除已知密码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VBA 中删除文本 - 以编程方式?

MS Access 以编程方式引发表单事件

MS Access 2010 - 如何根据以前的输入以编程方式显示表单字段?

Access 2007列表框:如何以编程方式单击?

在 C# 中以编程方式从 Excel 文件中大量导入数据到 Access

如何以编程方式从 Android 中删除 SQLite 数据库