Как программно удалить известный пароль из БД Access? - PullRequest
4 голосов
/ 30 августа 2011

По независящим от меня причинам мне приходится иметь дело с новым файлом 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 #.Есть ли способ сделать это, или я должен лично вмешиваться каждый раз, когда мы получаем новый файл, полностью нарушая цель автоматизации?

Ответы [ 2 ]

5 голосов
/ 31 августа 2011

Способ программного изменения пароля подробно описан здесь .

По сути, нужно сделать следующее:

  1. Открыть соединение с базой данных с помощью ADO.NET
  2. Выполнить оператор alter в базе данных, установив его пароль в NULL следующим образом:

    ИЗМЕНЕНИЕ ПАРОЛЯ БАЗЫ ДАННЫХ [Ваш пароль] 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
3 голосов
/ 31 августа 2011

В случае, если кто-то должен сделать что-то подобное, вот что я сделал в итоге:

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();
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...