通过LDAP的Active Directory身份验证user@mydomain.com使用Delphi

通过LDAP的Active Directory身份验证user@mydomain.com使用Delphi,delphi,active-directory,ldap,Delphi,Active Directory,Ldap,正如您可以从下面的代码片段中看到的。我目前正在使用adshlp和ActiveDs_TLB从当前登录的用户那里收集有关该广告的信息。我有一个表单,允许用户输入他们的广告密码,我在允许访问系统之前验证密码是否正确。这个很好吃。我现在遇到的问题是,用户希望能够以mydomain.com\userid的形式输入任何广告和ID,并让代码进行身份验证,并返回代码当前检索的相同数据。我还没有找到可以这样做的LDAP调用。如果能得到任何帮助和建议,我将不胜感激。 谢谢 使用 adshlp,ActiveDs\u

正如您可以从下面的代码片段中看到的。我目前正在使用adshlp和ActiveDs_TLB从当前登录的用户那里收集有关该广告的信息。我有一个表单,允许用户输入他们的广告密码,我在允许访问系统之前验证密码是否正确。这个很好吃。我现在遇到的问题是,用户希望能够以mydomain.com\userid的形式输入任何广告和ID,并让代码进行身份验证,并返回代码当前检索的相同数据。我还没有找到可以这样做的LDAP调用。如果能得到任何帮助和建议,我将不胜感激。 谢谢

使用
adshlp,ActiveDs\u TLB
函数Tlogon_form.GetUser(域、用户名、pword:string;var-ADSIUser:TADSIUserInfo):布尔;
变量
usr:IAdsUser;
usr1:IADs;
标志:整数;
GRP:IAdsMembers;
grp:IAdsGroup;
变异体组:油变异体;
温度:长词;
pwd、cn\u名称、FQDN、AD\u路径:字符串;
HR:布尔型;
fad_域:字符串;
objsysinfo:IADsADSystemInfo;
域名:字符串;
列表:字符串的数组[0..10];
I:整数;
名称\节点:字符串;
常数
ADS_安全_认证=$00000001;
开始
ADSIUser.UID:='';
ADSIUser.用户名:='';
ADSIUser.DB_登录:='';
ADSIUser.Disabled:=真;
ADSIUser.LockedOut:=真;
ADSIUser.组:='';
结果:=假;
FQDN:='';
广告路径:='';
SBN_SQL.Common_登录:='';
FPassword:=pword;
FUserName:=用户名;
//FDomain:=小写(域);//+'。本地",;
如果FUserName='',则退出;
objsysinfo:=CoADSystemInfo.Create;
domainDN:=objsysinfo.GetAnyDCName;
fad_domain:=objsysinfo.DomainDNSName;
name_节点:=objsysinfo.UserName;
如果域>'',则
开始
fad_域:=域;
结束
其他的
开始
域:=fad_域;
结束;
fad_域:=fad_域+';
FQDN:=域DN;
ad_路径:=名称_节点;
尝试
如果修剪(FUserName)'
开始
ADsOpenObject('LDAP://'+AD_路径、FUserName、FPassword、ADS_安全认证、IADsUser、usr);
结束;
如果usr=nil,则退出;
ADSIUser.UID:=用户名;
ADSIUser.UserName:=usr.FullName;
ADSIUser.DB_login:=usr.employeeid;
//usr:=零;
结果:=真;
出口
除了
在e上:异常确实开始
结果:=假;
出口
结束;
结束;
结束
您可以根据
用户ID
(不含域)搜索该用户,从而获取相关信息

早在2000年10月,我就在《德尔福杂志》上写了一篇关于使用ADSI和德尔福进行搜索的文章——你仍然可以下载我的——希望这能让你开始

我也使用ADsOpenObject进行LDAP验证,并且在代码中您将域作为参数传递,因此在ADsOpenObject调用中使用此类参数,或者我可能不清楚这个问题

function Authenticate(const pUser, pPassword,pDomain: String): HRESULT;  
Var  
 aUser : IAdsUser;  
begin  
 Try  
   Result  := ADsOpenObject(Format('LDAP://%s',[pDomain]),Format('%s\%s',[pDomain,pUser]),pPassword,ADS_SECURE_AUTHENTICATION,IAdsUser,aUser);    
  // here retrieve the information needed   
 Finally  
   aUser := Nil  
 End  
end;  

除了奇怪地使用
try..finally
阻止将输入字符串参数设置为
nil
,还有一点关于
adopenobject
函数。明确表示“此函数不应仅用于验证用户凭据”。我尝试了此操作,但收到“不支持此类接口”。我切换到一组调用:ADsOpenObject('WinNT://'+domain+'/'+FUserName、FUserName、FPassword、ADS\u SECURE\u AUTHENTICATION、IADsUser、usr);cn_name:=usr.FullName;ADsOpenObject('LDAP://CN='+CN\u name+','+AD\u path,FUserName,FPassword,ADS\u SECURE\u AUTHENTICATION,IADsUser,usr);这允许我覆盖原始广告并指向另一个广告,但由于我的客户配置广告的方式,这对他们不起作用。感谢您的回复。这是我开始这个项目时读到的第一个网页之一。我觉得这很有帮助,但没有找到我的答案。