活动目录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.
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
综上所述,"DELPHI实现数据库目录树生成"是一项利用Delphi的组件和数据库访问能力,通过精心设计的数据结构和算法,创建出能够快速展示并交互的无限层级目录树的技术。这一技术对于开发高效且用户友好的数据管理应用...
在这个案例中,我们关注的是一个用Delphi 7.0编写的程序,它被设计来统计指定目录中的图片数量,同时提供每个图片的大小以及拍摄日期等详细信息。下面将详细讨论这个程序涉及到的关键知识点。 1. **Delphi 7.0**: ...
具体来说,需要在 Delphi 项目中添加 domobj.tlb 和 Notes32.tlb 两个文件,这两个文件分别位于 NOTES 的安装目录下。添加完成后,Delphi 将可以识别 NOTES 数据库的对象和方法。 NOTES 数据库对象模型 NOTES ...
《加密版本SQLite Delphi访问控件详解》 在Delphi编程环境中,SQLite数据库因其轻量级、高效且无服务器依赖的特性,常被用于开发桌面应用程序。为了增强数据安全性,开发者有时会选择对SQLite数据库进行加密。本文...
Delphi是一种流行的Object Pascal编程环境,它提供了强大的图形用户界面(GUI)开发工具和网络功能,使得用Delphi来实现目录同步成为可能。本项目提供了客户端和服务器端的源代码,这将有助于我们深入理解目录同步的...
在Delphi编程环境中,文件和目录的操作是程序开发中不可或缺的部分。这涉及到读取、写入、创建、删除文件以及管理目录结构等任务。本文将深入探讨如何在Delphi中进行有效的文件和目录操作。 首先,让我们从基本的...
"delphi只选择文件夹目录"这个主题聚焦于如何设计一个功能,使得用户在交互过程中只能选取文件夹而不能选择具体文件。这种功能在很多应用程序中都可能用到,例如备份工具、数据迁移程序或者需要访问用户特定文件夹的...
在Delphi编程环境中,获取临时文件目录是一项常见的任务,这对于临时数据存储、程序运行时的日志记录或软件安装过程中的临时文件处理等场景都非常重要。临时文件目录通常由操作系统自动管理,开发者可以通过标准API...
本资源"Delphi访问Oracle公共登录模块源代码"提供了一种解决方案,帮助开发者使用Delphi编程语言与Oracle数据库进行交互。以下是对该主题的详细解释: 1. **Delphi**:Delphi是一种基于Object Pascal的集成开发环境...
Delphi数据访问组件是开发人员在使用Delphi编程语言时,用于高效、便捷地与各种数据库进行交互的一系列工具和库。这些组件使得开发者无需安装数据库客户端,即可直接连接和操作Oracle等数据库系统,极大地简化了...
在Delphi编程中,获取程序当前的运行目录是一项基本任务,这对于访问本地资源、加载配置文件或保存用户数据至关重要。本教程将详细讲解如何在Delphi应用程序中实现这一功能。 首先,我们需要理解“当前运行目录”这...
Delphi XE5 Android 平台调用 Webservice 并访问操作 MSSQL 数据库 Delphi XE5 是一款功能强大且灵活的开发环境,为开发者提供了跨平台的开发体验。在 Android 平台上,Delphi XE5 提供了强大的支持,允许开发者...
delphi访问domino,通过http访问Domino,delphi快速访问Domino,delphi集成lotus domino 完全提供源码 界面请查阅 https://blog.csdn.net/weijia3624/article/details/113108704
delphi访问https参数验证 HMAC_SHA256 控件包Chilkat Delphi DLL API v9.5.0.58 chilkat 库的delphi 动态库版本Chilkat_Keygen_v2.0_By_DFoX.exe。 params: symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&...
- Delphi 提供了 TFileMonitor 类,它是用于监视文件和目录变化的基础组件。通过创建 TFileMonitor 实例并设置其属性,如 IncludeSubdirectories(是否包含子目录)和 EventsToMonitor(要监听的事件类型),可以...
Delphi访问MySQL数据库控件(适用于MySQL5.0以及5.0以下)
Delphi BDE 访问 Oracle 详解 Delphi 是一个流行的开发工具,而 Oracle 是一个强大的关系数据库管理系统,本文将详细介绍如何使用 Delphi 的 BDE 功能来访问 Oracle 数据库。 一、系统环境 ---------------- 在...
delphi7用ASGSQlite3访问sqlite数据库实例: 1、用aducom sqlite3连接数据库,操作非常简单,跟用ado访问一样 2、用Navicat制作数据库,显示正常,但数据库中是乱码,不影响程序运行时的显示。 3、支持在设计时显示...
Delphi通过WebService访问数据库. 1.查询数据 procedure TForm1.Button1Click(Sender: TObject); var ls_Table: string; ls_Service: Service1Soap; begin ls_Service := Buf_GetBuleService; ls_Table := '...
在Delphi编程环境中,多线程访问数据库是一种提高应用程序性能的有效方法,特别是在处理大量数据或者进行长时间数据库操作时。本文将深入探讨如何在Delphi中实现多线程数据库访问,并结合给定的文件名列表来推测可能...