从不属于域

时间:2018-01-10 15:12:48

标签: delphi ldap delphi-2010

我需要获取特殊用户所属的组列表。 通常我可以使用NetUserGetGroups来做到这一点,这里是代码:

function GetLDapUserGroups(UserName, DomainName : string) : TStringList;
var bufptr : Pointer;
  ServerName : String;
  EntriesRead : DWord;
  TotalEntries : DWord;
  buf : Pbyte;
  PGlobalGroupInfo : PGroupInfo0;
  i : integer;
begin
     result:=TStringList.Create;

     // get servername
     // if problems occur maybe set param2 to nil
     bufptr := nil;
     NetGetAnyDCName(nil, PWideChar(DomainName), bufptr);
     ServerName := PWideChar(bufptr);
     Delete(ServerName, 1, 2);  // remove starting '\\' from server Name

     if NetUserGetGroups( PWideChar(ServerName), PWideChar(UserName), 0, buf, MAX_PREFERRED_LENGTH,
                          @EntriesRead, @TotalEntries)=NERR_SUCCESS then
     begin
          PGlobalGroupInfo := PGroupInfo0(buf);

          // Store group names in list
          for i:=0 to EntriesRead - 1 do
          begin
               result.Add(PGlobalGroupInfo^.grpi0_name);
               inc(PGlobalGroupInfo);
          end;
     end;
     NetAPIBufferFree(buf);
end;

但如果我的程序在不属于AD域的PC上运行,则不起作用。 显然它是可能的,我尝试使用LDAP管理员(由Softerra),并且它可以工作。

我试过了:

  • JclWin32.NetUserGetGroups - 没有。 (我可以理解这不起作用,我不能在这里传递用户密码。从域上的PC工作正常)
  • JwaLmAccess.NetUserGetLocalGroups - 没有。也没有可能传递密码
  • NetApi.GetNetUserGroups - 同样的故事
  • CreateOleObject(' ADODB.Command')... - Nope

我刚设法检查来自非域PC的密码(请参阅Check username/password in Active Directory from PC that is NOT part of domain),所以我在登录时尝试执行这些命令,但这也失败了。

在绝地消息来源中,我看到了这个功能" JwaWinLDAP.ldap_search_sW"。对我而言,因为我可以从登录中传递LDap令牌,所以我觉得很有希望。但是,我没有找到有关如何搜索用户组的任何代码示例。这个功能是我应该继续看的方式吗?

有人能把我推向正确的方向吗? :) 谢谢!

1 个答案:

答案 0 :(得分:0)

在查询AD之前,必须首先登录有权访问该AD的用户。

使用基于本地用户登录的令牌,几乎肯定无法让您访问查询AD。