【问题标题】:How do I programmatically remove a known password from an Access DB?如何以编程方式从 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:我会写下答案。我很高兴它成功了!

标签: c# ms-access


【解决方案1】:

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

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

  1. 使用 ADO.NET 打开与数据库的连接
  2. 在数据库上执行一条alter语句,将其密码设置为NULL:

    ALTER DATABASE 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

【讨论】:

  • 那段代码解决了我的问题。它实际上是 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();
                }
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2017-10-11
    • 2013-10-16
    • 2011-05-16
    相关资源
    最近更新 更多