【问题标题】:How to fix ADOQuery request如何修复 ADOQuery 请求
【发布时间】:2013-09-19 11:37:23
【问题描述】:

我有这个 ADOQuery:

SQL.Text := 'SELECT samAccountName FROM ''GC://' + sADForestName + ''' ' +
            'WHERE objectCategory=''user'' ' +
              'AND distinguishedName=''' + sADUserName + ''' ' +
              'AND memberOf=''' + sADGroupName + '''';

这可以很好地为用户获取组, 但我还需要使用 LDAP_MATCHING_RULE_IN_CHAIN 检查嵌套组:

SQL.Text := 'SELECT samAccountName FROM ''GC://' + sADForestName + ''' ' +
            'WHERE objectCategory=''user'' ' +
              'AND distinguishedName=''' + sADUserName + ''' ' +
              'AND memberOf:1.2.840.113556.1.4.1941:=''' + sADGroupName + '''';

但是这个请求没有执行,调用 ADOQuery.Open 时出错; (翻译自俄语):“处理命令时出现一个或多个错误”

这是我的请求错误?

【问题讨论】:

  • 可能的错误来源之一是 memberOf 附近的冒号,可以通过将 ParamCheck 设置为 false 来避免这种情况。
  • 但在所有样本中我都看到:(memberOf:1.2.840.113556.1.4.1941:=cn=Group1,OU=groupsOU,DC=x)
  • @bummi 建议关闭 TADOQuery 的 ParamCheck 属性,而不是更改您的 SQL。 Delphi 可能在想:1.2.... 是一个会破坏你的 SQL 的参数。关闭 ParamCheck 将停止这种事后猜测。其他语言的代码示例在 SQL 中处理冒号(:) 时可能没有相同的问题,因为它们倾向于使用其他字符来标记参数
  • 现在明白了,但是使用 ParamCheck=False 我有同样的错误:(
  • @AlexEgorov:该链接显示了如何使用本机 LDAP 请求进行操作。这与您在这里尝试做的不同。

标签: delphi active-directory ldap-query


【解决方案1】:

谢谢大家,我找到了使用 ADOCommand 的决定:

var ADOConnection, ADOCmd, Res: Variant;

    ADOConnection := CreateOleObject('ADODB.Connection');
    ADOCmd := CreateOleObject('ADODB.Command');
    try
      ADOConnection.Provider := 'ADsDSOObject';
      ADOConnection.Open('Active Directory Provider');
      ADOCmd.ActiveConnection := ADOConnection;
      ADOCmd.Properties('Page Size')     := 100;
      ADOCmd.Properties('Timeout')       := 30;
      ADOCmd.Properties('Cache Results') := False;

      sBase       := '<GC://' + sADForestName+ '>';
      sFilter     := '(&(objectCategory=person)(objectClass=user)' +
                       '(distinguishedName=' + sADUserName + ')' +
                       '(memberOf:1.2.840.113556.1.4.1941:=' + sADGroupName + '))';
      sAttributes := 'sAMAccountName';

      ADOCmd.CommandText := sBase + ';' + sFilter + ';' + sAttributes + ';subtree';
      Res := AdoCmd.Execute;

      if Res.EOF then User := ''
                 else User := Res.Fields[0].Value;
    finally
      ADOCmd := NULL;
      ADOConnection.Close;
      ADOConnection := NULL;
    end;

【讨论】:

    猜你喜欢
    • 2020-11-10
    • 2017-07-14
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多