活动目录Active Directory是用于Windows Server的目录服务,它存储着网络上各种对象的有关信息,并使该信息易于管理员和用户查找及使用。Active Directory使用结构化的数据存储作为目录信息的逻辑层次结构的基础。
在某些情况下我们需要通过程序来读取Active Directory中的信息,我们可以使用微软提供的ADSI(Active Directory Services Interface)。ADSI是一组以COM接口形式提供的目录 服务,因此任何支持COM编程的语言如Delphi、VB、VC等都可以使用ADSI。
在Delphi中使用ADSI需要导入活动目录类型库,具体操作如下:在IDE中选择菜单“Project->Import Type Library”,在弹出的对话框中选择“Active Ds Type Libarary(version 1.0)”,单击“Create Unit”,Delphi会自动产生封装单元文件。只要在相应文件中引用该单元文件即可使用ADSI了。下面给出一个在Delphi6中使用ADSI访问Windows Server活动目录信息的示例代码。
unitUnit2;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,ActiveDs_TLB,ActiveX,ComObj,ComCtrls,StdCtrls;
type
TForm2=class(TForm)
GroupBox1:TGroupBox;
lvGroup:TListView;
GroupBox2:TGroupBox;
lvUser:TListView;
Button1:TButton;
procedureButton1Click(Sender:TObject);
private
{Privatedeclarations}
functionGetObject(constName:String):IDispatch;
procedureEnumerateUsers(Container:IAdsContainer);
procedureAddGroupToListView(AGroup:IADsGroup);
procedureAddUserToListView(AUser:IAdsUser);
public
{Publicdeclarations}
end;
var
Form2:TForm2;
implementation
{$R*.dfm}
{TForm2}
procedureTForm2.AddGroupToListView(AGroup:IADsGroup);
begin
lvGroup.Items.Add.Caption:=AGroup.Name;
end;
procedureTForm2.AddUserToListView(AUser:IAdsUser);
begin
withlvUser.Items.Adddobegin
Caption:=AUser.FullName;
SubItems.Add(VarToStr(AUser.Get('sAMAccountName')));
end;
end;
procedureTForm2.EnumerateUsers(Container:IAdsContainer);
var
ADsObj:IADs;
Value:LongWord;
Enum:IEnumVariant;
ADsTempOjb:OleVariant;
begin
Enum:=(Container._NewEnum)asIEnumVariant;
while(Enum.Next(1,ADsTempOjb,Value)=S_OK)dobegin
ADsObj:=IUnknown(ADsTempOjb)asIADs;
try
ifSameText(ADsObj.Class_,'Group')thenbegin
AddGroupToListView(ADsObjasIADsGroup);
EnumerateUsers(ADsObjasIAdsContainer);
end
elseifSameText(ADsObj.Class_,'User')then
AddUserToListView(ADsObjasIADsUser);
except
end;
end;
end;
functionTForm2.GetObject(constName:String):IDispatch;
var
Eaten:Integer;
Moniker:IMoniker;
BindContext:IBindCtx;
begin
OleCheck(CreateBindCtx(0,BindContext));
OleCheck(MkParseDisplayName(BindContext,PWideChar(WideString(Name)),Eaten,Moniker));
OleCheck(Moniker.BindToObject(BindContext,Nil,IDispatch,Result));
end;
procedureTForm2.Button1Click(Sender:TObject);
var
Container:IADsContainer;
begin
Container:=GetObject('LDAP://OU=Suzhou,OU=root,DC=ap,DC=emersonclimate,DC=org')asIADsContainer;
lvGroup.Items.BeginUpdate;
lvUser.Items.BeginUpdate;
try
Button1.Enabled:=False;
EnumerateUsers(Container);
Button1.Enabled:=True;
finally
lvGroup.Items.EndUpdate;
lvUser.Items.EndUpdate;
end;
Container._Release;
end;
end.
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,ActiveDs_TLB,ActiveX,ComObj,ComCtrls,StdCtrls;
type
TForm2=class(TForm)
GroupBox1:TGroupBox;
lvGroup:TListView;
GroupBox2:TGroupBox;
lvUser:TListView;
Button1:TButton;
procedureButton1Click(Sender:TObject);
private
{Privatedeclarations}
functionGetObject(constName:String):IDispatch;
procedureEnumerateUsers(Container:IAdsContainer);
procedureAddGroupToListView(AGroup:IADsGroup);
procedureAddUserToListView(AUser:IAdsUser);
public
{Publicdeclarations}
end;
var
Form2:TForm2;
implementation
{$R*.dfm}
{TForm2}
procedureTForm2.AddGroupToListView(AGroup:IADsGroup);
begin
lvGroup.Items.Add.Caption:=AGroup.Name;
end;
procedureTForm2.AddUserToListView(AUser:IAdsUser);
begin
withlvUser.Items.Adddobegin
Caption:=AUser.FullName;
SubItems.Add(VarToStr(AUser.Get('sAMAccountName')));
end;
end;
procedureTForm2.EnumerateUsers(Container:IAdsContainer);
var
ADsObj:IADs;
Value:LongWord;
Enum:IEnumVariant;
ADsTempOjb:OleVariant;
begin
Enum:=(Container._NewEnum)asIEnumVariant;
while(Enum.Next(1,ADsTempOjb,Value)=S_OK)dobegin
ADsObj:=IUnknown(ADsTempOjb)asIADs;
try
ifSameText(ADsObj.Class_,'Group')thenbegin
AddGroupToListView(ADsObjasIADsGroup);
EnumerateUsers(ADsObjasIAdsContainer);
end
elseifSameText(ADsObj.Class_,'User')then
AddUserToListView(ADsObjasIADsUser);
except
end;
end;
end;
functionTForm2.GetObject(constName:String):IDispatch;
var
Eaten:Integer;
Moniker:IMoniker;
BindContext:IBindCtx;
begin
OleCheck(CreateBindCtx(0,BindContext));
OleCheck(MkParseDisplayName(BindContext,PWideChar(WideString(Name)),Eaten,Moniker));
OleCheck(Moniker.BindToObject(BindContext,Nil,IDispatch,Result));
end;
procedureTForm2.Button1Click(Sender:TObject);
var
Container:IADsContainer;
begin
Container:=GetObject('LDAP://OU=Suzhou,OU=root,DC=ap,DC=emersonclimate,DC=org')asIADsContainer;
lvGroup.Items.BeginUpdate;
lvUser.Items.BeginUpdate;
try
Button1.Enabled:=False;
EnumerateUsers(Container);
Button1.Enabled:=True;
finally
lvGroup.Items.EndUpdate;
lvUser.Items.EndUpdate;
end;
Container._Release;
end;
end.
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
加密版本sqlite_delphi访问控件
Delphi数据访问组件,不用装oracle客户端访问oracle数据库
Delphi访问Oracle公共登录模块源代码,您将从中了解到配置ODBC数据源信息、创建DSN的方法与步骤,且本模块你可直接拿去使用,放到你的Delphi项目中,即可使用。
Delphi访问NOTES数据库的方法,可以方便存取文档型数据
delphi访问domino,通过http访问Domino,delphi快速访问Domino,delphi集成lotus domino 完全提供源码 界面请查阅 https://blog.csdn.net/weijia3624/article/details/113108704
delphi7用ASGSQlite3访问sqlite数据库实例: 1、用aducom sqlite3连接数据库,操作非常简单,跟用ado访问一样 2、用Navicat制作数据库,显示正常,但数据库中是乱码,不影响程序运行时的显示。 3、支持在设计时显示...
WMI Delphi访问 硬件信息 很好的例子
Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结 !最后有个项目要移植到64位,所以这个很有用。在2010中PChar已经不再表示PAnsiChar而是表示PWideChar,如果依然这样写,运行时很可能会得到一个内存访问错误。...
delphi XE5 ANDROID平台 调用 webservice并访问操作MSSQL数据库
详细介绍了 使用delphi BDE功能访问 oracle ,从设置到简单的样例 有图片 过程清晰
解决 https post 会报scoket ...上次开发访问https出错了,post 一直出错在网络上找的很,下载了好多个都没有解决问题,后面才找到问题,跟大家分享一下。包含delphi 源码和libeay32.dll ssleay32.dll 两个ssl文件.
1、获取sqlite3.dll,去网上下载wxsqlite3的最新版本代码,解压后其中有一个sqlite3目录,其中有编译好的版本,lib目录下的是原版本,secure目录下有aes128和aes256两个带加密的版本,直接拿其中任一个sqlite3.dll...
delphi如何用多线程访问数据库的例子
在Delphi环境下使用Redis,支持发布订阅等,在常用的delphi开发环境下都能编译通过,本实例在Delphi7环境下编译通过
Delphi中frame的使用Delphi中frame的使用Delphi中frame的使用Delphi中frame的使用Delphi中frame的使用
ODAC 5.55,数据库访问组件,不需要Oracle客户端组件直接访问Oracle数据库。
delphi7使用IXMLHTTPRequest实现RESTful的访问及返回json数据的解析,推送消息段HMACSHA1加密编码
delphi 下,访问 mysql ,可以加载 libmysql.dll。然后直接使用 firdac 组件访问mysql。 FDPhysMySQLDriverLink1.VendorLib:='libmysql.dll'; dll分 32bit 和 64bit 两种。按部署目标环境做相应选择即可。 zip 中...
Delphi访问MySQL数据库控件(适用于MySQL5.0以及5.0以下)
Delphi通过SFTP连接Linux服务器,有利于做数据的对接