熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java訪問windows活動目錄(2)

2013-11-23 19:34:35  來源: Java核心技術 

  // 獲取域信息

  procedure TMainFrmGetDomainInformation(Domain: IADsContainer);

  var

  Enum: IEnumVariant;

  ADsTempObj: OLEVariant;

  ADsObj: IADs;

  Value: LongWord;

  begin

  //清空用戶組和計算機列表

  UserListViewItemsClear;

  GroupListViewItemsClear;

  ComputerListViewItemsClear;

  //獲取枚舉對象並賦值給 Enum 變量

  Enum := (Domain_NewEnum) as IEnumVariant;

  //利用枚舉對象查找把每個子對象賦值給臨時的 OLEVariant 對象

  while (EnumNext( ADsTempObj Value) = S_OK) do

  begin

  ADsObj := IUnknown(ADsTempObj) as IADs; //獲得臨時對象OLEVariant 變量賦值給 ADSI 對象

  if AdsObjClass_ = User then    //如果是用戶對象

  AddUserToList(ADsObj);

  if AdsObjClass_ = Group then   //如果是組對象

  AddGroupToList(ADsObj);

  if AdsObjClass_ = Computer then //如果是計算機對象

  AddComputerToList(ADsObj);

  ADsTempObj:=Null; //釋放OLEVariant

  end;

  end;

  procedure TMainFrmAddUserToList(ADsObj:IADs);

  var aListItem:TListItem;

  begin

  aListItem:=UserListViewItemsAdd;

  aListItemCaption:=ADsObjName;

  aListItemSubItemsAdd(ADsObjClass_);

  aListItemSubItemsAdd(ADsObjADsPath);

  aListItemSubItemsAdd(ADsObjParent);

  // aListItemSubItemsAdd(ADsObjGet(sAMAccountName));

  end;

  procedure TMainFrmAddGroupToList(ADsObj:IADs);

  var aListItem:TListItem;

  begin

  aListItem:=GroupListViewItemsAdd;

  aListItemCaption:=ADsObjName;

  aListItemSubItemsAdd(ADsObjClass_);

  aListItemSubItemsAdd(ADsObjADsPath);

  end;

  procedure TMainFrmAddComputerToList(ADsObj:IADs);

  var aListItem:TListItem;

  begin

  aListItem:=ComputerListViewItemsAdd;

  aListItemCaption:=ADsObjName;

  aListItemSubItemsAdd(ADsObjClass_);

  aListItemSubItemsAdd(ADsObjADsPath);

  end;

  procedure TMainFrmbtnClick(Sender: TObject);

  var

  UnknownObject: IUnknown;

  DomainPathADUserADPass: WideString;

  Domain: IADsContainer;

  begin

  // 指定域路徑

  DomainPath := WinNT:// + ADSIDomainNameText;

  ADUser:= ADSIUsernameText;

  ADPass:= ADSIPasswordText;

  DomainPath := WinNT://;

  ADUser: ADUser:= Hebmc\OAWebUser; //注意用戶名稱的寫法domain\User 或

  ADUser:= ; //注意用戶名稱的寫法domain\User 或

  ADPass:= chenzuooaup;

  // 如果使用用戶登錄了信息

  if cbUseLoginChecked 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在使用ADsObjGet(屬性)時會有一個報錯高速緩存中找不到目錄屬性 (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 ButtonClick(Sender: TObject);

  private

  { Private declarations }

  public

  { Public declarations }

  procedure GetADInfo(aUseraPassaDomainPath: WideString);

  end;

  //連接 Win NT 目錄服務就是找到域控制器然後綁定到相應的對象上

  //綁定可以通過 ADsGetObject 或 ADsOpenObject 函數來實現

  //第一個函數使用登錄用戶缺省的信任級別

  //第二個函數允許開發者指定特殊的安全信任機制來綁定 ADSI 對象

  //缺省條件下ADsGetObject函數根據當前用戶進行安全認證

  function ADsGetObject(lpszPathName: PWideChar;   //第一個參數是對象的路徑名

  const riid: TIID;          //第二個參數是對象的接口標識符

  out obj): HResult; stdcall; external activedsdll;// 第三個參數用於返回得到的被請求的接口指針

  //ADsOpenObject 函數在不同的安全認證機制下綁定 ADSI 對象

  //它主要是通過調用參數返回的用戶名和口令來認證的

  function ADsOpenObject(lpszPathName: PWideChar;    //第一個參數是對象的路徑名

  lpszUserName: PWideChar;    //第二個參數是調用者提供的用戶名

  lpszPassword: PWideChar;    //第三個參數是調用者提供的口令

  dwReserved: LongInt;        //第四個參數是一個保留的 provider 標識用來確定綁定的認證方法

  const riid: TIID;           //第五個參數是請求接口的接口標識符

  out obj): HResult; stdcall; external activedsdll; //最後一個參數用來返回請求的接口指針

  var

  MainFrm: TMainFrm;

  implementation

  {$R *dfm}

  procedure TMainFrmButtonClick(Sender: TObject);

  var DomainPathADUserADPass: WideString;

  begin

  DomainPath := LDAP:///OU=省公司OU=組織架構DC=HebmcDC=com;//LDAP訪問AD的路徑

  ADUser:=Hebmc\OAWebUser; //注意用戶名稱的寫法域名稱 + 用戶名稱 或

  ADUser:=; //注意用戶名稱的寫法域名稱 + 用戶名稱 或

  ADPass:=chenzuooaup;   //用戶密碼

  GetADInfo(ADUserADPassDomainPath);

  end;

  procedure TMainFrmGetADInfo(aUseraPassaDomainPath: WideString);

  var

  UnknownObject: IUnknown;

  Enum: IEnumVariant;

  ADsTempObj: OLEVariant;

  Domain: IADsContainer;

  ADsObj: IADs;

  Value: LongWord;

  begin

  // 如果使用AD用戶信息登錄

  if cbUseLoginChecked 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 (EnumNext( ADsTempObj Value) = S_OK) do

  begin

  ADsObj := IUnknown(ADsTempObj) as IADs; //獲得臨時對象OLEVariant 變量賦值給 ADSI 對象

  ObjMemoLinesAdd(AdsObjClass_); //對象類型

  if AdsObjClass_ = organizationalUnit then //如果是組織單元對象

  OUMemoLinesAdd(ADsObjName) ;

  if AdsObjClass_ = user then //如果是用戶對象

  UserMemoLinesAdd(ADsObjName+(用戶代碼=+ADsObjGet(sAMAccountName)+);

  //遞歸得到組內相關用戶

  GetADInfo(aUseraPassADsObjADsPath);

  ADsTempObj:=Null; //釋放OLEVariant

  end;

  end;

  end

  備注

  * 注意用戶名的寫法domain\User 或

  * Delphi使用LDAP方式訪問AD可以使用ADsObjGet(屬性)時得到相關屬性值

  屬性的取值域可以通過JAVA程序得到


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27115.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.