Объект со специальным символом "/" вызывает ошибку автоматизации в GetObject - PullRequest
2 голосов
/ 08 января 2020

У нас есть старый конец шрифта Microsoft Access, который служит GUI для нашей пользовательской базы данных. Я никогда не был человеком VBA, поэтому я go, исправляя ошибки, я учусь, как я go.

В нашей базе данных Access есть несколько команд для синхронизации c информации в Active Directory. , Одна из таких команд - добавить пользователя в группу. Однако всякий раз, когда группа содержит /, группа никогда не добавляется.

Отладка выдает это как:

Ошибка времени выполнения -2147463168 (80005000) ': ошибка автоматизации ".

Распечатка целевой группы показывает DN, как я и ожидаю. Попытка экранировать / до того, как GetObject не поможет и вызывает собственную ошибку аутентификации.

Вот верхняя часть функции -

Function AddGroup(TargetGroup, strUserID, Optional strOptReqBy)
    Dim objDL
    Set objUser = GetObject("LDAP://" & GetDName(CStr(strUserID)))

        Set objDL = GetObject("LDAP://" & TargetGroup)
        On Error Resume Next
        objDL.Add (objUser.ADsPath)
        objDL.SetInfo
        On Error GoTo 0

Это прекрасно работает, если группа не содержит /.
Отладка указывает на Set objDL = GetObject("LDAP://" & TargetGroup)

Поиск некоторого ввода о том, почему это происходит. Спасибо!

1 Ответ

2 голосов
/ 09 января 2020

В пути LDAP / является разделителем. Мало того, что // используется в начале, вы также можете указать сервер, к которому хотите подключиться, затем /, а затем DN объекта, например:

LDAP://example.com/DC=example,DC=com

Это необходимо, если компьютер, на котором вы работаете, не подключен к тому же (или доверенному) домену, что и домен, к которому вы подключаетесь.

Это означает, что если DN объекта если вы хотите связать с /, он будет думать, что все, что до / - это сервер для подключения, и он взрывается.

Так что вам просто нужно убежать от него, который, как и вы, ' мы уже узнали, это делается с \:

LDAP://OU=This\/That,DC=example,DC=com

Так что да, простая замена подойдет:

Set objUser = GetObject("LDAP://" & Replace(GetDName(CStr(strUserID)), "/", "\/")

Не чувствуйте себя плохо. Даже Microsoft имеет эту ошибку в своем коде .

...