Delphi 如何修复ADOQuery请求

Delphi 如何修复ADOQuery请求,delphi,active-directory,ldap-query,Delphi,Active Directory,Ldap Query,我有一个疑问: SQL.Text := 'SELECT samAccountName FROM ''GC://' + sADForestName + ''' ' + 'WHERE objectCategory=''user'' ' + 'AND distinguishedName=''' + sADUserName + ''' ' + 'AND memberOf=''' + sADGroupName + '''';

我有一个疑问:

SQL.Text := 'SELECT samAccountName FROM ''GC://' + sADForestName + ''' ' +
            'WHERE objectCategory=''user'' ' +
              'AND distinguishedName=''' + sADUserName + ''' ' +
              'AND memberOf=''' + sADGroupName + '''';
这是一项很好的工作,可以为用户获取组, 但我还需要在\u链中使用LDAP\u匹配\u规则\u检查嵌套组:

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时出错; (翻译自俄语):“处理命令时出现一个或多个错误”


这是我的请求错误?

谢谢大家,我使用ADO命令找到了决定:

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;
var-ADOConnection,ADOCmd,Res:Variant;
ADOConnection:=CreateOleObject('ADODB.Connection');
ADOCmd:=CreateOleObject('ADODB.Command');
尝试
ADOConnection.Provider:=“ADsDSOObject”;
打开('Active Directory提供程序');
ADOCmd.ActiveConnection:=ADOConnection;
ADOCmd.Properties('Page Size'):=100;
ADOCmd.Properties('Timeout'):=30;
ADOCmd.Properties('Cache Results'):=False;
sBase:='';
sFilter:='(&(objectCategory=person)(objectClass=user)'+
“(区分名称=”+sADUserName+”)”+
“(成员:1.2.840.113556.1.4.1941:=”+sADGroupName+)”;
sAttributes:=“sAMAccountName”;
ADOCmd.CommandText:=sBase+';'+sFilter+';'+sAttributes+';子树';
Res:=AdoCmd.Execute;
如果Res.EOF,则用户:=''
else用户:=Res.Fields[0]。值;
最后
ADOCmd:=NULL;
连接。关闭;
ADOConnection:=NULL;
结束;

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