如何以编程方式从Access数据库中删除已知密码?(How do I programmatically remove a known password from an Access DB?)

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

不幸的是,在下载文件后立即进行处理,并假定没有密码,所以这些文件不会被处理,因为OleDbException显示我们有错误的密码。 我们知道密码,并且我们知道连接字符串的“with database password”选项:

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

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

我想要做的只是以编程方式在MDB文件下载后立即取消设置数据库密码,使用C#。 有没有办法做到这一点,还是每次我们获得新文件时都必须亲自介入,彻底击败了自动化的目的?

For reasons beyond my control, I have to deal with a new Access MDB file that is downloaded, decrypted, and unzipped every month by an automated process I wrote. Despite the PGP encryption, the sender (an insurance company) refuses to send the MDB non-password-protected.

Unfortunately, immediately after the file is downloaded, it's processed, and is assumed to have no password, so these files aren't being processed due to an OleDbException showing that we have the wrong password. We know the password, and we know about the "with database password" option for connection strings:

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

That only solves part of the problem, since another department needs to access the files later, and they don't know the password. So far, I've only been able to get it to work by holding Shift while I open the file, cancel at the password prompt, open the file again through an open Access process while holding Shift again and clicking "Open Exclusive", continuing to hold Shift while going through the password dialog, then unsetting the password through the security tools.

What I'd like to do is just programmatically unset the DB password on the MDB file as soon as it's downloaded, using C#. Is there a way to do that, or do I have to personally intervene every time we get a new file, completely defeating the purpose of automation?

最满意答案

这里详细介绍了以编程方式更改密码的方法。

基本上,需要执行以下操作:

使用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

The way to change the password programmatically is detailed here.

Essentially, one needs to do the following:

Open a connection to the database using ADO.NET

Execute an alter statement on the database setting it's password to NULL as so:

ALTER DATABASE PASSWORD [Your Password] NULL;

Dispose the connection

Sample code taken from the source:

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

更多推荐