我想知道用户是否输入了正确的域、用户和密码来登录他的Active Directory用户。
我尝试编写一个非常简单的程序,它无法连接,但通过阅读错误消息,我可以知道用户名/密码是否正确。
这是基于技巧的(逻辑在读取异常消息),但是我在两个服务器上测试了这个原型,并注意到异常消息会因服务器而异,因此这不可靠。
uses adshlp, ActiveDs_TLB;
// 3 TEdit and a TButton
procedure TForm4.Button1Click(Sender: TObject);
Var
aUser : IAdsUser;
pDomain, pUser, pPassword : string;
myResult : HRESULT;
Counter: integer;
begin
pDomain := edtDomain.Text;
pUser:= edtUser.Text;
pPassword := edtPwd.Text;
Counter := GetTickCount;
Try
myResult := ADsOpenObject(Format('LDAP://%s',[pDomain]),Format('%s\%s',[pDomain,pUser]),pPassword,
ADS_READONLY_SERVER,
IAdsUser,aUser);
except
On E : EOleException do
begin
if (GetTickCount - Counter > 3000) then ShowMessage ('Problem with connection') else
if Pos('password',E.Message) > 0 then ShowMessage ('wrong username or password') else
if Pos('server',E.Message) > 0 then ShowMessage ('Connected') else
ShowMessage('Unhandled case');
memLog.Lines.Add(E.Message);
end;
end
end;
如果消息包含“server”,我将设置“Connected”的原因是,在我的本地机器上(实际上是在我的公司ldap服务器上),如果一切正常(域,用户和密码),服务器会回复“该服务器需要更安全的身份验证”,因此“server”单词就在其中,而在其他情况下,它会说“用户名或密码错误”。由于这必须在意大利和英语服务器上运行,所以我将“server”和“password”设置为可靠的单词。无论如何,我在另一个提供不同错误的服务器上进行了测试。
我从此问题的答复开始做到了以上内容。
如何使用类似的技术更可靠地检查用户是否设置了正确的密码?
更新(已找到解决方案)
感谢回复,我设法编写了这个函数以满足我的需求。到目前为止,它似乎相当可靠,我在这里分享,希望它能帮助其他人:
// This function returns True if the provided parameters are correct
// login credentials for a user in the specified Domain
// From empirical tests it seems reliable
function UserCanLogin(aDomain, aUser, aPassword: string): Boolean;
var
hToken: THandle;
begin
Result := False;
if (LogonUser(pChar(aUser), pChar(aDomain), pChar(aPassword), LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, hToken)) then
begin
CloseHandle(hToken);
Result := True;
end;
end;