Excel VBA — запрос Active Directory LDAP с конкатенацией строк

Я пытаюсь найти атрибуты контактов из Active Directory наших компаний для инструмента, который я пишу в Excel 2016. Программа должна иметь возможность выполнять поиск в базе данных, когда пользователь предоставляет либо адрес электронной почты, либо полное имя (FIRSTNAME LASTNAME) - независимо от того, что они желаю чтобы.

Это прекрасно работает для адресов электронной почты и других атрибутов, которые в базе данных синтаксически совпадают с предоставленными пользователем. К сожалению, в базе нет полного имени в нужном мне формате, а именно FIRSTNAME LASTNAME

Поэтому я решил, что должен указать запросу также возвращать совпадения для атрибутов givenname и sn, потому что они составляют желаемое полное имя.

Чтобы сделать это, я попробовал следующие способы объединения атрибутов «givenname» и «sn». Ни один из них не работал:

  1. в предложении SQL WHERE я добавил:

    ' OR givenname & " " & sn = '" & Trim(rng.Text) & "'
    (see code snippet below)
    
  2. В разделе SQL SELECT я протестировал несколько способов создания псевдонима:

    * ([givenname] || [sn]) As myfullname
    * ([givenname] + [sn]) As myfullname
    * ([givenname] & [sn]) As myfullname
    * and all of the above without square brackets and round brackets
    

Похоже, что SQL, используемый в запросах LDAP, поддерживается не полностью. Потому что я даже не могу создавать псевдонимы. Я также не могу использовать квадратные скобки или такие функции, как CONCAT() в команде SQL.

Каждый раз, когда я пробовал один из способов, я получал ошибку vba:

Произошла хотя бы одна ошибка

(Перевод с немецкого на английский)

В других реализациях SQL (не в VBA) этот givenname & " " & sn работает отлично.

Вопрос: как мне выполнить запрос, который проверяет мой SearchString на соответствие объединению атрибутов givenname (имя) и sn (фамилия) с пробелом между ними?

' Connect to active directory
Set objDSE = GetObject("LDAP://rootDSE")
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open
Set objCommand = CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
SearchString = "Max Mustermann"

' Contact lookup using SQL-query
objCommand.CommandText = _
    "SELECT givenname, sn, mail, telephoneNumber, mobile, mailNickName, c, l, postalCode, department, company, streetAddress " & _
    "FROM 'LDAP://" & objDSE.Get("defaultNamingContext") & "' " & _
    "WHERE objectCategory='person' AND (mail = '" & SearchString t & "' OR givenname & sn = '" & SearchString & "')"
Set objRecordset = objCommand.Execute

If Not objRecordset.EOF Then
' Further processing which is not relevant to the question
' ...

person Max    schedule 21.04.2019    source источник


Ответы (1)


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

Если у кого-то есть лучший подход к этому, не стесняйтесь публиковать его.

person Max    schedule 21.04.2019
comment
Не могли бы вы отредактировать свой ответ, включив в него код новой функции? - person Greenonline; 23.04.2019