如何以编程方式从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#。是否有办法做到这一点,或者我是否必须在每次获得新文件时亲自干预,这完全违背了自动化的目的?
以编程方式更改密码的详细方法如下。
基本上,需要做以下事情:
- 使用ADO打开数据库连接。净
-
在数据库上执行alter语句,将数据库的密码设置为NULL,如下所示:
ALTER DATABASE PASSWORD [Your 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
如果有人要做类似的事情,下面是我最后做的:
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();
}
}
}
}
}