上个月,一名工人被解雇了。 HR将其AD帐户设置为无效。审计人员发现,这样的用户仍然可以访问主要的公司程序套件,因为我们拥有独立于AD的访问/身份验证。
我的客户已询问当用户登录我们的程序时,我们会在我们的身份验证中添加“有活动的AD帐户”。
我已经搜索了SO并找到了许多解决方案,但没有人能做到这一点。
unit LDAPMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, uADSI;
type
TfrmElDapo = class(TForm)
btnGetUser: TButton;
edtDomain: TEdit;
edtUser: TEdit;
Label1: TLabel;
Label2: TLabel;
Memo1: TMemo;
edtGroup: TEdit;
Label3: TLabel;
procedure btnGetUserClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Memo1DblClick(Sender: TObject);
private
ADSI: TADSI;
{ Private declarations }
public
{ Public declarations }
sdomain : string;
sUID, sUserName, sDescription, sGroup : string;
UserInfo : uADSI.TADSIUserInfo;
bDisabled:boolean;
bLockedOut:boolean;
end;
var
frmElDapo: TfrmElDapo;
implementation
{$R *.dfm}
procedure TfrmElDapo.btnGetUserClick(Sender: TObject);
begin
sdomain := edtDomain.Text;
susername := edtUser.Text;
sGroup := edtGroup.Text;
adsi.GetUser(domain, username, UserInfo);
with UserInfo do
begin
sUID := UID;
sUserName := UserName;
sDescription := Description;
bDisabled := Disabled;
bLockedOut := LockedOut;
end;
memo1.Lines.Add('UID: '+sUID);
memo1.Lines.Add('UserName: '+sUserName);
memo1.Lines.Add('Description: '+sDescription);
memo1.Lines.Add('Disabled: '+BoolToStr(bDisabled));
memo1.Lines.Add('LockedOut: '+BoolToStr(bLockedOut));
end;
procedure TfrmElDapo.FormCreate(Sender: TObject);
begin
ADSI := TADSI.Create(self);
end;
procedure TfrmElDapo.FormDestroy(Sender: TObject);
begin
FreeAndNil(ADSI);
end;
procedure TfrmElDapo.Memo1DblClick(Sender: TObject);
begin
Memo1.Clear;
end;
end.
在运行上述操作时,它会正确地回退用户名,但始终将AD帐户显示为活动状态,尽管它们已处于非活动状态多年!我的客户似乎认为这种异常是由于这一事实 nsLookup DomainName返回超过50台服务器,搜索返回第一个。我不知道这是如何运作的,或者他的解释是否正确。
我并不是假装成为一名AD大师,并且只是偶尔涉足它。
虽然我尝试过ADO查询,但此时我正在使用ADSI 简而言之,我想要的只是输入用户的AD登录信息并知道他/她是否处于活动状态。完成此任务的最佳/最小代码是什么?