VBA - Удалить пароль из строки подключения OLEDB - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть файл Excel, который содержит серию соединений OLEDB, использующих несколько сводных таблиц. Я хотел бы создать функцию VBA, которая удаляет все пароли из нескольких строк подключения при закрытии файла (чтобы пароль пользователя не сохранялся). Сначала я подумал, что все, что мне нужно сделать, это установить для свойства «Сохранить пароль» значение false, что-то вроде этого:

Public Sub RemovePasswordByNamePrefix()
    Dim cn As Object
    Dim oledbCn As OLEDBConnection

    For Each cn In ThisWorkbook.connections
        Set oledbCn = cn.OLEDBConnection
        oledbCn.SavePassword = False          
    Next
End Sub

Должно работать правильно, закрыв файл и открыв его снова, вы больше не увидите пароль в строке подключения. Не должно быть "сохранено":

enter image description here

Неправильно, пароль все еще там ... Он был "сохранен". Не уверен, что эта функция должна делать. Может быть, есть ссылка на другой пароль? Итак, я попытался использовать метод большого молотка , к сожалению, у него есть свои проблемы, и до сих пор я не справился с этим.

Я не совсем уверен, как это сделать ... Почему это так небезопасно? Он сохраняет незашифрованные пароли каждого файла, который содержит строку подключения такого рода, легко читаемую любым, кто может получить доступ к этому файлу.

Может быть, я мог бы создать какое-то регулярное выражение, чтобы удалить только пароль из файла? Когда я делаю это в интерфейсе, мои кубы обновляются и запрашивают мои учетные данные, (интересно) произойдет ли это, если я сделаю это в VBA, даже если триггер будет после закрытия?

Итог: Каков наилучший способ предотвратить сохранение этих паролей в файле после его закрытия?

Ответы [ 4 ]

0 голосов
/ 10 ноября 2018

См. Это для аутентификации SQL Server Аутентификация в SQL Server . Там написано, что вы можете использовать 100% проверку подлинности Windows или смешанный режим (проверка подлинности Windows и пароли). Если вы действительно хотите удалить пароли из строк подключения, не устанавливайте систему аутентификации в смешанном режиме, просто запустите 100% аутентификацию Windows. Однако, возможно, уже используется некоторый код, написанный для использования паролей, что не всегда может быть практичным.

Итак, другой способ избежать паролей - использовать

Integrated Security=true; 

в ваших строках подключения. Этот вопрос переполнения стека на эту тему хорошо читается.

0 голосов
/ 08 ноября 2018

@ Найджел Хеффернан предлагает немного другой подход к тому, как это сделать, вот версия без регулярных выражений:

Public Sub RemovePasswordByNamePrefix()
    Dim cn As Object
    Dim oledbCn As OLEDBConnection
    Dim stringArray
    Dim stringElement As Variant
    Dim newStringArray As Variant

    For Each cn In ThisWorkbook.connections
        Set oledbCn = cn.OLEDBConnection
        oledbCn.SavePassword = False

        stringArray = Split(oledbCn.connection, ";")

        For Each stringElement In stringArray
            If Not InStr(stringElement, "Password=") Then
                If IsEmpty(newStringArray) Then
                    newStringArray = Array(stringElement)
                Else
                    ReDim Preserve newStringArray(UBound(newStringArray) + 1)
                    newStringArray(UBound(newStringArray)) = stringElement
                End If
            End If
        Next

        oledbCn.connection = Join(newStringArray, ";")
        oledbCn.CommandText = "" 'My app repopulates this after open
    Next
End Sub

Я не уверен в преимуществах этого метода (кроме отсутствия другой ссылки на библиотеку), и я еще не тестировал за пределами одной строки подключения / одной машины. Мои строки подключения не содержат поле «Расширенные свойства», возможно, этот подход не сработает для этого.

0 голосов
/ 09 ноября 2018

Похоже, что вы используете DSN, которые Excel создаст, если вы используете стандартные инструменты управления соединениями в графическом интерфейсе. При работе с DSN драйвер ODBC иногда помещает пароли в виде открытого текста в реестр, даже если вы не выбрали «Сохранить пароль».

Вместо того, чтобы разрешать Excel управлять вашими соединениями, вам нужно будет управлять ими самостоятельно. Вот пример кода от MS MVP Бена Клотье. Вам необходимо изменить строку подключения в соответствии с вашим вариантом использования. Возможно, вы сможете скопировать данные из существующих подключений, прежде чем удалять их.

Public Function InitConnect(UserName As String, Password As String) As Boolean
‘ Description:  Should be called in the application’s startup
‘               to ensure that Access has a cached connection
‘               for all other ODBC objects’ use.
On Error GoTo ErrHandler

    Dim dbCurrent As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim rst As DAO.Recordset

    ‘<configuration specific to MySQL ODBC driver>

    strConnection = “ODBC;DRIVER={MySQL ODBC 5.1 Driver};” & _
                     “Server=” & ServerAddress & “;” & _
                     “Port=” & PortNum & “;” & _
                     “Option=” & Opt & “;” & _  ‘MySql-specific configuration
                     “Stmt=;” & _
                     “Database=” & DbName & “;”

    Set dbCurrent = DBEngine(0)(0)
    Set qdf = dbCurrent.CreateQueryDef(“”)

    With qdf
        .Connect = strConnection & _
                     “Uid=” & UserName & “;” & _
                     “Pwd=” & Password
        .SQL = “SELECT CURRENT_USER();”
        Set rst = .OpenRecordset(dbOpenSnapshot, dbSQLPassThrough)
    End With
    InitConnect = True

ExitProcedure:
    On Error Resume Next
        Set rst = Nothing
        Set qdf = Nothing
        Set dbCurrent = Nothing
    Exit Function
ErrHandler:
    InitConnect = False
    MsgBox Err.Description & ” (” & Err.Number & “) encountered”, _
        vbOKOnly + vbCritical, “InitConnect”
    Resume ExitProcedure
    Resume
End Function

Примечание: Это написано для MS Access, а не Excel. Концепции все одинаковы. Возможно, вы захотите попробовать сделать свой интерфейс в Access, а затем экспортировать свои представления в Excel из Access. Это позволит вам лучше контролировать ссылку на свой сервер и использовать SQL в Access для определения того, что вы хотите экспортировать в Excel.

ПРОЧИТАЙТЕ ЭТО: https://www.microsoft.com/en-us/microsoft-365/blog/2011/04/08/power-tip-improve-the-security-of-database-connections/

0 голосов
/ 07 ноября 2018

@ TomJohnRiddle указывает, что я должен посмотреть на изменение строки подключения, аналогично следующему вопросу . Изначально я был обеспокоен тем, что использование этого подхода может вызвать у пользователя экран входа в систему после изменения строки подключения. Однако, поскольку у меня нет идей получше, я попробовал, и, похоже, это сработало, вот что я смоделировал:

Public Sub RemovePasswordByNamePrefix()
    Dim cn As Object
    Dim oledbCn As OLEDBConnection

    Dim regEx As New RegExp
    regEx.Pattern = "Password=[^;]*;"

    For Each cn In ThisWorkbook.connections            
        Set oledbCn = cn.OLEDBConnection
        oledbCn.SavePassword = False

        oledbCn.connection = regEx.Replace(oledbCn.connection, "")
        oledbCn.CommandText = "" 'My app repopulates this after open
    Next
End Sub

и похоже на работу:

enter image description here

Так что я думаю, что я пойду с этим подходом, но я все еще открыт для других предложений. Было бы неплохо очистить все и полностью перезагрузить его, но пока это не представляется возможным .

Меня также интересует, какие версии VBA поддерживают ссылки Regex . Я хотел бы что-нибудь совместимое с Excel 2010+ 32/64 бит. Мне еще предстоит проверить это на любой старой версии (в настоящее время я использую Office 365). Я предполагаю, что все будет работать нормально, но я был неприятно удивлен этими вещами в прошлом.

...