知识大全 Java访问windows活动目录(2)

Posted

篇首语:学向勤中得,萤窗万卷书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java访问windows活动目录(2)相关的知识,希望对你有一定的参考价值。

Java访问windows活动目录(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  // 获取域信息

  procedure TMainFrm GetDomainInformation(Domain: IADsContainer);

  var

  Enum: IEnumVariant;

  ADsTempObj: OLEVariant;

  ADsObj: IADs;

  Value: LongWord;

  begin

  //清空用户 组和计算机列表

  UserListView Items Clear;

  GroupListView Items Clear;

  ComputerListView Items Clear;

  //获取枚举对象 并赋值给 Enum 变量

  Enum := (Domain _NewEnum) as IEnumVariant;

  //利用枚举对象查找 把每个子对象赋值给临时的 OLEVariant 对象

  while (Enum Next( ADsTempObj Value) = S_OK) do

  begin

  ADsObj := IUnknown(ADsTempObj) as IADs; //获得临时对象 OLEVariant 变量赋值给 ADSI 对象

  if AdsObj Class_ = User then    //如果是用户对象

  AddUserToList(ADsObj);

  if AdsObj Class_ = Group then   //如果是组对象

  AddGroupToList(ADsObj);

  if AdsObj Class_ = Computer then //如果是计算机对象

  AddComputerToList(ADsObj);

  ADsTempObj:=Null; //释放OLEVariant

  end;

  end;

  procedure TMainFrm AddUserToList(ADsObj:IADs);

  var aListItem:TListItem;

  begin

  aListItem:=UserListView Items Add;

  aListItem Caption:=ADsObj Name;

  aListItem SubItems Add(ADsObj Class_);

  aListItem SubItems Add(ADsObj ADsPath);

  aListItem SubItems Add(ADsObj Parent);

  // aListItem SubItems Add(ADsObj Get( sAMAccountName ));

  end;

  procedure TMainFrm AddGroupToList(ADsObj:IADs);

  var aListItem:TListItem;

  begin

  aListItem:=GroupListView Items Add;

  aListItem Caption:=ADsObj Name;

  aListItem SubItems Add(ADsObj Class_);

  aListItem SubItems Add(ADsObj ADsPath);

  end;

  procedure TMainFrm AddComputerToList(ADsObj:IADs);

  var aListItem:TListItem;

  begin

  aListItem:=ComputerListView Items Add;

  aListItem Caption:=ADsObj Name;

  aListItem SubItems Add(ADsObj Class_);

  aListItem SubItems Add(ADsObj ADsPath);

  end;

  procedure TMainFrm btn Click(Sender: TObject);

  var

  UnknownObject: IUnknown;

  DomainPath ADUser ADPass: WideString;

  Domain: IADsContainer;

  begin

  // 指定域路径

  DomainPath := WinNT:// + ADSIDomainName Text;

  ADUser:= ADSIUsername Text;

  ADPass:= ADSIPassword Text;

  DomainPath := WinNT:// ;

  ADUser: ADUser:= Hebmc\\OAWebUser ; //注意用户名称的写法 domain\\User 或

  ADUser:= ; //注意用户名称的写法 domain\\User 或

  ADPass:= chenzuooaup ;

  // 如果使用用户登录了信息

  if cbUseLogin Checked then // 使用用户登录的信息创建域对象

  OleCheck(AdsOpenObject(PWideChar(DomainPath)

  PWideChar(ADUser)

  PWideChar(ADPass)

  

  IID_IADsContainer

  UnknownObject))

  else

  OleCheck(ADsGetObject(PWideChar(DomainPath)

  IID_IADsContainer

  UnknownObject));

  // 设定域对象

  Domain := UnknownObject as IADsContainer;

  // 从域中获得信息列表

  GetDomainInformation(Domain);

  end;

  end

  备注

  * 注意用户名的写法 domain\\User 或

  * Delphi使用WinNT Provider方式访问AD 在使用ADsObj Get( 属性 )时 会有一个报错 高速缓存中找不到目录属性 (The directory property cannot be found in the cache)

  目前该问题还不知如何解决

  * 资料参考《Delphi深度探索 活动目录开发》

  作者 陈省(Hubdog)

   Delphi 使用LDAP访问Window Server AD

  unit Main;

  interface

  uses

  Windows Messages SysUtils Variants Classes Graphics Controls Forms

  Dialogs StdCtrls ActiveDs_TLB ActiveX ComObj;

  type

  TMainFrm = class(TForm)

  Button : TButton;

  ObjMemo: TMemo;

  OUMemo: TMemo;

  UserMemo: TMemo;

  cbUseLogin: TCheckBox;

  Obj_Label: TLabel;

  OU_Label: TLabel;

  Users_Label: TLabel;

  procedure Button Click(Sender: TObject);

  private

   Private declarations

  public

   Public declarations

  procedure GetADInfo(aUser aPass aDomainPath: WideString);

  end;

  //连接 Win NT 目录服务就是找到域控制器然后绑定到相应的对象上

  //绑定可以通过 ADsGetObject 或 ADsOpenObject 函数来实现

  //第一个函数使用登录用户缺省的信任级别

  //第二个函数允许开发者指定特殊的安全信任机制来绑定 ADSI 对象

  //缺省条件下 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 ; //最后一个参数用来返回请求的接口指针

  var

  MainFrm: TMainFrm;

  implementation

  $R * dfm

  procedure TMainFrm Button Click(Sender: TObject);

  var DomainPath ADUser ADPass: WideString;

  begin

  DomainPath := LDAP:// /OU=省公司 OU=组织架构 DC=Hebmc DC= ;//LDAP访问AD的路径

  ADUser:= Hebmc\\OAWebUser ; //注意用户名称的写法 域名称 + 用户名称 或

  ADUser:= ; //注意用户名称的写法 域名称 + 用户名称 或

  ADPass:= chenzuooaup ;   //用户密码

  GetADInfo(ADUser ADPass DomainPath);

  end;

  procedure TMainFrm GetADInfo(aUser aPass aDomainPath: WideString);

  var

  UnknownObject: IUnknown;

  Enum: IEnumVariant;

  ADsTempObj: OLEVariant;

  Domain: IADsContainer;

  ADsObj: IADs;

  Value: LongWord;

  begin

  // 如果使用AD用户信息登录

  if cbUseLogin Checked then // 使用用户登录的信息创建域对象

  OleCheck(AdsOpenObject(PWideChar(aDomainPath)

  PWideChar(aUser)

  PWideChar(aPass)

  

  IID_IADsContainer

  UnknownObject))

  else

  OleCheck(ADsGetObject(PWideChar(aDomainPath)

  IID_IADsContainer

  UnknownObject));

  // 设定域对象

  Domain := UnknownObject as IADsContainer;

  //获取枚举对象 并赋值给 Enum 变量

  Enum := (Domain _NewEnum) as IEnumVariant;

  //利用枚举对象查找 把每个子对象赋值给临时的 OLEVariant 对象

  while (Enum Next( ADsTempObj Value) = S_OK) do

  begin

  ADsObj := IUnknown(ADsTempObj) as IADs; //获得临时对象 OLEVariant 变量赋值给 ADSI 对象

  ObjMemo Lines Add(AdsObj Class_); //对象类型

  if AdsObj Class_ = anizationalUnit then //如果是组织单元对象

  OUMemo Lines Add(ADsObj Name) ;

  if AdsObj Class_ = user then //如果是用户对象

  UserMemo Lines Add(ADsObj Name+ (用户代码= +ADsObj Get( sAMAccountName )+ ) );

  //递归 得到组内相关用户

  GetADInfo(aUser aPass ADsObj ADsPath);

  ADsTempObj:=Null; //释放OLEVariant

  end;

  end;

  end

  备注

  * 注意用户名的写法 domain\\User 或

  * Delphi使用LDAP方式访问AD 可以使用ADsObj Get( 属性 )时得到相关属性值

cha138/Article/program/Java/hx/201311/27115

相关参考

知识大全 JAVA远程访问共享目录

JAVA远程访问共享目录  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  相关知识介绍  SMB 

知识大全 android系统如何通过$ adb 来获得/data/data目录的访问权限

android系统如何通过$adb来获得/data/data目录的访问权限android是linux内核/data/data是root用户的目录,普通用户是无法访问的,如果你需要访问,那么你的手机需要

知识大全 php 在windows下配置虚拟目录的方法介绍

  先打开Apache的conf目录下的文件在末尾添加如下代码复制代码代码如下:<VirtualHost*:>ServerNamemydemoDocumentRoot"D:/mydemo"

知识大全 IIS下多站点利用虚拟目录 访问共用(图片)文件夹

IIS下多站点利用虚拟目录访问共用(图片)文件夹  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 windows7宽带连接成功但是本地连接无Internet访问要怎么办

windows7宽带连接成功但是本地连接无Internet访问要怎么办?详细(是选择公用网络/家庭网络?还是工作网络  以下文字资料是由(本站网www.cha138.co

知识大全 使用java实现在文件中添加字符串

    我在一个项目中需要使用C:\\WINDOWS\\system\\drivers\\etc这个目录下的hosts文件并且在该文件的最后加上一个这样的字符串:   r

知识大全 ant - java 构建工具 - hello ant

  管理你的代码doc文件编译配置等开发工作你是怎末做的自己管理源目录编译文件copy实施在window写bat在unix写shell?    可惜我不怎末会写所以我制作一个ejb的过程是这样的写代码

知识大全 Java程序实现压缩某目录

Java程序实现压缩某目录  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  publicclass

知识大全 JAVA中用递归函数来删除子目录

JAVA中用递归函数来删除子目录  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java是一门强

知识大全 Java对话框获取目录、文件路径

Java对话框获取目录、文件路径  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  publicFi