2011-08-30 82 views
3

由於我無法控制的原因,我必須處理一個新的Access MDB文件,該文件每個月都會通過我寫的一個自動過程進行下載,解密和解壓縮。儘管PGP加密,發件人(一家保險公司)拒絕發送未受密碼保護的MDB。如何以編程方式從Access數據庫中刪除已知密碼?

不幸的是,在下載文件後立即對其進行處理,並假定沒有密碼,因此由於OleDbException顯示我們有錯誤的密碼,因此這些文件未被處理。我們知道密碼,我們知道關於連接字符串「與數據庫密碼」選項:

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

這只是解決問題的一部分,因爲其他部門需要在稍後訪問的文件,他們不知道密碼。到目前爲止,我只能通過在打開文件時按住Shift鍵,在密碼提示符下取消文件,通過打開的Access進程再次打開文件,同時再次按住Shift鍵並單擊「Open Exclusive」,繼續在通過密碼對話框時按住Shift鍵,然後通過安全工具取消密碼設置。

我想要做的只是編程式地取消MDB文件上的數據庫密碼,一旦它被下載,使用C#。有沒有辦法做到這一點,或者每次我們獲得新文件時都必須親自介入,徹底擊敗了自動化的目的?

+2

Chris,看看這個來自微軟的鏈接。它使用C#,但您可以輕鬆將其轉換爲C#。這是一箇舊的代碼,但你可能會從那裏得到一些想法:http://msdn.microsoft.com/en-us/library/aa139961%28v=office.10%29.aspx#odc_acsecurity_password – Icarus

+0

@Icarus:該鏈接給了我需要什麼,特別是「ALTER DATABASE PASSWORD NULL [password_goes_here]」。如果你想寫一個答案,積分是你的。 –

+0

@Chris Doggett:我會寫出答案。我很高興它的工作! – Icarus

回答

5

以編程方式更改密碼的方法詳細爲here

從本質上講,需要做到以下幾點:

  1. 打開使用到數據庫的連接ADO.NET
  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 
+1

該代碼解決了我的問題。它實際上是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(); 
       } 
      } 
     } 
    } 
} 
+0

「分享獨家」做的伎倆,謝謝! – simaglei

相關問題