首页 > 其他分享 >Delphi LDAP对象管理(用户登录认证、组、组织)

Delphi LDAP对象管理(用户登录认证、组、组织)

时间:2024-07-08 12:57:12浏览次数:8  
标签:TUniLoginForm1 end Delphi begin 认证 ADsObj LDAP PWideChar procedure

unit login;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, uniGUITypes, uniGUIAbstractClasses,
uniGUIClasses, uniGUIRegClasses, uniGUIForm, uniButton, uniGUIBaseClasses,
uniEdit, REST.Types, uniMemo, REST.Client, Data.Bind.Components,
Data.Bind.ObjectScope, system.json, system.Hash, uniImage, uniPanel,
Vcl.Imaging.pngimage, uniImageList, ActiveDs_TLB, ActiveX, system.Win.ComObj,
uniMainMenu;

type
TUniLoginForm1 = class(TUniLoginForm)
UserID: TUniEdit;
Password: TUniEdit;
UniButton1: TUniButton;
UniContainerPanel2: TUniContainerPanel;
UniImage1: TUniImage;
UniImageList1: TUniImageList;
procedure UniButton1Click(Sender: TObject);
procedure UniLoginFormReady(Sender: TObject);
procedure LoginADInfo(aUser, aPass, aDomainPath: WideString);
procedure PasswordKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
procedure LDAPLogin;
public
{ Public declarations }
end;

// 缺省条件下,ADsGetObject函数根据当前用户进行安全认证。
function ADsGetObject(lpszPathName: PWideChar; // 第一个参数是对象的路径名
const riid: TIID; // 第二个参数是对象的接口标识符
out obj): HResult; stdcall; external 'activeds.dll'; // 第三个参数用于返回得到的被请求的接口指针

// ADsOpenObject 函数在不同的安全认证机制下绑定 ADSI 对象,
// 它主要是通过调用参数返回的用户名和口令来认证的
function ADsOpenObject(lpszPathName: PWideChar; // 第一个参数是对象的路径名
lpszUserName: PWideChar; // 第二个参数是调用者提供的用户名
lpszPassword: PWideChar; // 第三个参数是调用者提供的口令
dwReserved: LongInt; // 第四个参数是一个保留的 provider 标识,用来确定绑定的认证方法
const riid: TIID; // 第五个参数是请求接口的接口标识符,
out obj): HResult; stdcall; external 'activeds.dll'; // 最后一个参数用来返回请求的接口指针。
function UniLoginForm1: TUniLoginForm1;

implementation

{$R *.dfm}

uses
uniGUIVars, MainModule, uniGUIApplication, Main;

function UniLoginForm1: TUniLoginForm1;
begin
Result := TUniLoginForm1(UniMainModule.GetFormInstance(TUniLoginForm1));
end;

procedure TUniLoginForm1.UniButton1Click(Sender: TObject);
begin
LDAPLogin;
end;

procedure TUniLoginForm1.LDAPLogin;
var
DomainPath, ADUser, ADPass: WideString;
begin
DomainPath := 'LDAP://192.168.162.250/DC=ttri,DC=com'; // LDAP访问AD的路径。
ADUser := UserID.Text + '@ttri.com'; // 注意用户名称的写法:域名称 + 用户名称 或 [email protected]
// ADUser:='[email protected]'; //注意用户名称的写法:域名称 + 用户名称 或 [email protected]
ADPass := Password.Text; // 用户密码。
LoginADInfo(ADUser, ADPass, DomainPath);

end;

procedure TUniLoginForm1.LoginADInfo(aUser, aPass, aDomainPath: WideString);
var
UnknownObject: IUnknown;
Enum: IEnumVariant;
ADsTempObj: OLEVariant;
Domain: IADsContainer;
Container: IADsContainer;
ADsObj: IADs;
Value: LongWord;
userpath: string;
User: IADsUser;
grp: IAdsGroup;
grps: IAdsMembers;
varGroup: OLEVariant;
Temp: LongWord;
sGroupType: string;

begin
OleCheck(ADsOpenObject(PWideChar(aDomainPath), PWideChar(aUser),
PWideChar(aPass), 0, IID_IADsContainer, UnknownObject));

// 设定域对象
Domain := UnknownObject as IADsContainer;

// 获取枚举对象,并赋值给 Enum 变量
Enum := (Domain._NewEnum) as IEnumVariant;

// 利用枚举对象查找,把每个子对象赋值给临时的 OLEVariant 对象
while (Enum.Next(1, ADsTempObj, Value) = S_OK) do
begin
ADsObj := IUnknown(ADsTempObj) as IADs; // 获得临时对象:OLEVariant 变量赋值给 ADSI 对象

if ADsObj.Class_ = 'user' then
// 如果是用户对象  displayName    sAMAccountName  objectSID
begin
  if ADsObj.Get('sAMAccountName') = UserID.Text then
  begin
    userpath := ADsObj.ADsPath;
    MainForm.UniPanel3.Caption := ADsObj.Get('cn');
    user_id:=ADsObj.Get('sAMAccountName');
    ADsGetObject(PWideChar(userpath), IADsUser, User);
    // User.GetInfo;
    grps := User.Groups;
    Enum := grps._NewEnum as IEnumVariant;
    if Enum <> nil then
      group := TStringList.Create;

    begin
      while (Enum.Next(1, varGroup, Temp) = S_OK) do
      begin
        grp := IDispatch(varGroup) as IAdsGroup;
        group.Add(grp.Get('cn'));
        //MainForm.UniTreeView1.Items.Add(nil, grp.Get('cn'));
      end;
    end;
  end;
end;
LoginADInfo(aUser, aPass, ADsObj.ADsPath);
ADsTempObj := Null; // 释放OLEVariant
varGroup := Null;
ModalResult := mrOK;

end;
end;

procedure TUniLoginForm1.PasswordKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
begin
UniButton1Click(sender);
end;
end;

procedure TUniLoginForm1.UniLoginFormReady(Sender: TObject);
begin
with UserID, JSInterface do
begin
JSCall('inputWrap.addCls', ['fa fa-user icon-textfield']);
JSCall('inputEl.setWidth', [Width - 2]);
end;
with Password, JSInterface do
begin
JSCall('inputWrap.addCls', ['fa fa-key icon icon-textfield']);
JSCall('inputEl.setWidth', [Width - 2]);
end;

end;

initialization

RegisterAppFormClass(TUniLoginForm1);

end.

标签:TUniLoginForm1,end,Delphi,begin,认证,ADsObj,LDAP,PWideChar,procedure
From: https://www.cnblogs.com/dczxl/p/18289699

相关文章

  • 装饰器中闭包之加认证功能
    类似京东商城,其实就是前端页面加后端功能的集合,所谓的后端功能其实就是各种函数。这里所谓的认证,就是对于用户名和密码的一个校验。废话不多说,直接上需求,我们写代码搞一下。需求:写一段程序模拟京东商城,用装饰器来实现认证功能。代码如下:name_list=[{'name':'alex','pwd':'......
  • Springboot+Shiro+Mybatis+mysql实现权限安全认证
    Shiro是Apache的一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。Shiro主要分为两个部分就是认证和授权两部分一、介绍Subject代表了当前用户的安全操作SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组......
  • Delphi 常用控件之TlistView总结
    TlistView组件功能:(1)TListView控件可以用来显示各项带图标的列表,包括大图标和小图标的;也可以用来显示带有子项的列表,Windows操作系统的资源管理器中文件夹窗口就是最好的应用例子,就是我们打开"我的电脑"后能够看到各个盘符的界面(2)TListView控件基本能实现和DBGrid控件一......
  • Authlib,一个终极利器 Python 库专注于提供各种认证和授权解决方案
    目录01什么是Authlib?Authlib简介为什么选择Authlib?安装与配置02Authlib的基本用法实现OAuth2客户端1、创建OAuth2客户端 2、获取访问令牌3、使用访问令牌访问资源实现OAuth2服务器1、创建OAuth2服务器2、实现授权端点3、实现资源端点03Authlib......
  • HTTPS 与 JWT 认证的关系
    HTTPS(HyperTextTransferProtocolSecure)和JWT(JSONWebToken)是Web安全领域中常用的两个不同的技术,它们在一起工作以确保数据的安全传输和认证。下面是它们各自的作用及相互关系的详细说明:HTTPS定义:HTTPS是HTTP的安全版本,通过SSL/TLS(SecureSocketsLayer/Transport......
  • 翔云身份证实名认证接口返回值参数说明
    说到实名认证相信大家都不陌生,现如今,随着互联网应用的不断普及,我们生活和工作的方方面面都需要进行身份的实名认证;而企业实现实名认证的功能可以通过集成接口来实现,那么,翔云身份证实名认证接口返回值参数分贝代表什么呢?下面一起来了解一下吧!翔云身份实名认证接口返回值参......
  • delphi BDE Reader 不需要驱动
    用过Delphi开发的几乎都知道BDE,是读取paradoxDB(*.db)数据库(表)读取的驱动。要存取数据,必需安装BDE驱动程序,才能正常读取,还需要配置,发布程序就更不方便,所以吐槽的很多。如果升级成64位程序,几乎只有放弃,因为没有64位的BDE驱动[官方己说明](可以在64位的windows系统上安装,但B......
  • 在delphi用移动鼠标左键配合shift的方法选择部分文字
    procedureTForm1.ButtonPen1Click(Sender:TObject);beginSetCursorPos(694,352);//设置开始的位置。Sleep(300);//mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//模拟按下鼠标右键。//mouse_event(MOUSEEVENTF_RIGHTUP,0,......
  • Delphi换行_这里只换一行
    开发环境DelphiXe11;这个代码不适用于Delphi7,一般不适用于Delphi2007之前的版本;这个图片:12个字(汉字)换行;2数字和2字母认为等于1汉字;这个换行不大行,全是小写的字母占占用的位置比较少,如果要效果好的,请自己写;  --Unit-- unitUnit1;interfaceusesWinapi.Windows......
  • PostgreSQL学习之基于时间的认证
        设计        如果要限制用户在某一天的某时间段可以登录,某时间段不可以登录,在此做了一种简单的实现,通过pg_hba.conf文件配置时间段,示例如下:#TYPEDATABASEUSERADDRESSTIMEMETHOD#"local"isforUnixdomains......