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

Java訪問windows活動目錄(1)

2013-11-23 19:05:43  來源: Java核心技術 

  活動目錄(AD)

  Active Directory 是用於 Windows Server 的目錄服務

  它存儲著網絡上各種對象的有關信息並使該信息易於管理員和用戶查找及使用

  Active Directory 目錄服務使用結構化的數據存儲作為目錄信息的邏輯層次結構的基礎

  通過登錄驗證以及目錄中對象的訪問控制將安全性集成到 Active Directory 中

  目錄服務如 Active Directory提供了用於存儲目錄數據並使該數據可由網絡用戶和管理員使用的方法

  例如Active Directory 存儲了有關用戶帳戶的信息如名稱密碼電話號碼等並允許相同網絡上的其他已授權用戶訪問該信息

  LDAP

  LDAP是輕量目錄訪問協議英文全稱是Lightweight Directory Access Protocol

  LDAP是基於X標准的

  LDAP 僅通過使用原始 X目錄存取協議 (DAP) 的功能子集而減少了所需的系統資源消耗

  與X不同LDAP支持TCP/IP這對訪問Internet是必須的

  LDAP和關系數據庫是兩種不同層次的概念後者是存貯方式(同一層次如網格數據庫對象數據庫)前者是存貯模式和訪問協議

  LDAP是一個比關系數據庫抽象層次更高的存貯概念與關系數據庫的查詢語言SQL屬同一級別

  ADSI

  在Delphi中可以使用微軟的ADSI(活動目錄服務接口)來訪問活動目錄

  ADSI是一組以COM接口的形式提供目錄服務的是為基於目錄服務提供的通用接口

  一些標准的ADSI提供者(Provider)有WinNTIISLDAP和NDS

  可以通過ADSI存取四種網絡目錄結構

  WinNT (Microsoft SAM 數據庫)LDAP (輕量目錄存取協議)NDS (NetWare目錄服務)和NWCOMPAT(Novell NetWare x)

  ADSI可以使Windows NT 管理員的工作變得輕松

  ADSI支持管理員執行一些一般的管理任務比如添加新用戶管理打印機安全設定和控制NT域

  因為ADSI使用COM接口任何支持COM的編程語言像DelphiBCBVBVC等都可以調用ADSI

  如在Delphi中調用ADSI則需要引入活動目錄類型庫

  操作如下

  在IDE中Project>Import Type Library

  選擇Active Ds Type Library(Version )單擊Create Unit

  Delphi會做相應的封裝生成ActiveDs_TLBpas文件

  Uses ActiveDs_TLB就可以在Delphi程序中使用ADSI了

  JAVA+LDAP訪問Window Server AD

  package ADOper;

  import javautilHashtable;

  import javaxnamingContext;

  import javaxnamingldapLdapContext;

  import javaxnamingldapInitialLdapContext;

  import javaxnamingNamingEnumeration;

  import javaxnamingdirectorySearchControls;

  import javaxnamingdirectorySearchResult;

  import javaxnamingNamingException;

  import javaxnamingdirectoryAttribute;

  import javaxnamingdirectoryAttributes;

  import javautilEnumeration;

  public class ADOperTest {

  public ADOperTest() {

  }

  public void GetADInfo() {

  Hashtable HashEnv = new Hashtable();

  String LDAP_URL = ldap://:; //LDAP訪問地址

  //String adminName = CN=OAWebUserCN=UsersDC=HebmcDC=com;//AD的用戶名

  String adminName = Hebmc\\OAWebUser; //注意用戶名的寫法domain\User 或

  adminName = ; //注意用戶名的寫法domain\User 或

  String adminPassword = chenzuooaup; //密碼

  HashEnvput(ContextSECURITY_AUTHENTICATION simple); //LDAP訪問安全級別

  HashEnvput(ContextSECURITY_PRINCIPAL adminName); //AD User

  HashEnvput(ContextSECURITY_CREDENTIALS adminPassword); //AD Password

  HashEnvput(ContextINITIAL_CONTEXT_FACTORYcomsunjndildapLdapCtxFactory); //LDAP工廠類

  HashEnvput(ContextPROVIDER_URL LDAP_URL);

  try {

  LdapContext ctx = new InitialLdapContext(HashEnv null);

  SearchControls searchCtls = new SearchControls(); //Create the search controls

  searchCtlssetSearchScope(SearchControlsSUBTREE_SCOPE); //Specify the search scope

  String searchFilter = objectClass=User; //specify the LDAP search filter

  //String searchFilter = objectClass=organizationalUnit;//specify the LDAP search filter

  String searchBase = DC=HebmcDC=com; //Specify the Base for the search//搜索域節點

  int totalResults = ;

  //Specify the attributes to return

  //String returnedAtts[] = {memberOf};//定制返回屬性

  String returnedAtts[] = {

  url whenChanged employeeID name userPrincipalName

  physicalDeliveryOfficeName departmentNumber telephoneNumber

  homePhone mobile department sAMAccountName whenChanged

  mail}; //定制返回屬性

  searchCtlssetReturningAttributes(returnedAtts); //設置返回屬性集

  //Search for objects using the filter

  NamingEnumeration answer = ctxsearch(searchBase searchFiltersearchCtls);

  while (answerhasMoreElements()) {

  SearchResult sr = (SearchResult) answernext();

  Systemoutprintln(************************************************);

  Systemoutprintln(srgetName());

  Attributes Attrs = srgetAttributes();

  if (Attrs != null) {

  try {

  for (NamingEnumeration ne = AttrsgetAll(); nehasMore(); ) {

  Attribute Attr = (Attribute) nenext();

  Systemoutprintln( AttributeID= + AttrgetID()toString());

  //讀取屬性值

  for (NamingEnumeration e = AttrgetAll(); ehasMore();totalResults++) {

  Systemoutprintln(    AttributeValues= + enext()toString());

  }

  Systemoutprintln(    );

  //讀取屬性值

  Enumeration values = AttrgetAll();

  if (values != null) { // 迭代

  while (valueshasMoreElements()) {

  Systemoutprintln(    AttributeValues= + valuesnextElement());

  }

  }

  Systemoutprintln(    );

  }

  }

  catch (NamingException e) {

  Systemerrprintln(Throw Exception : + e);

  }

  }

  }

  Systemoutprintln(Number: + totalResults);

  ctxclose();

  }

  catch (NamingException e) {

  eprintStackTrace();

  Systemerrprintln(Throw Exception : + e);

  }

  }

  public static void main(String args[]) {

  ADOperTest ad = new ADOperTest();

  adGetADInfo();

  }

  }

  備注

  使用LADP訪問AD注意用戶名的寫法domain\User 或

  如用戶名不正確則可能會出現如下異常

  javaxnamingAuthenticationException: [LDAP: error code : LdapErr: DSIDC comment: AcceptSecurityContext error data vece

  Delphi使用WinNT Provider訪問Window Server AD

  unit Unt_AD;

  interface

  uses

  Windows Messages SysUtils Variants Classes Graphics Controls Forms

  Dialogs StdCtrls ComCtrls ActiveDs_TLB ActiveX ComObj;

  type

  TMainFrm = class(TForm)

  grp: TGroupBox;

  cbUseLogin: TCheckBox;

  lbl: TLabel;

  ADSIUsername: TEdit;

  lbl: TLabel;

  ADSIPassword: TEdit;

  ADSIDomainName: TEdit;

  btn: TButton;

  lbl: TLabel;

  GroupListView: TListView;

  ComputerListView: TListView;

  SeverListView: TListView;

  UserListView: TListView;

  lbl: TLabel;

  lbl: TLabel;

  Label: TLabel;

  lbl: TLabel;

  procedure btnClick(Sender: TObject);

  private

  { Private declarations }

  procedure GetDomainInformation(Domain: IADsContainer);

  procedure AddUserToList(ADsObj:IADs);

  procedure AddGroupToList(ADsObj:IADs);

  procedure AddComputerToList(ADsObj:IADs);

  public

  { Public declarations }

  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}


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