荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: michaelx (扮COOL有害健康), 信区: DotNET
标  题: 通过.NET Framework访问活动目录(1)
发信站: 荔园晨风BBS站 (Sun Oct  6 12:49:07 2002), 站内信件

System.DirectoryServices使用户能够通过ASP.NET访问一些基本的用户管理功能
。这篇文章首先回顾了活动目录(AD)的有关概念,然后简要地讨论了实际的
System.DirectoryServices名字空间本身,最后给出了可供我们在实际应用程序中
使用的代码。


  活动目录是什么?


  在目前的网络环境下,能够方便地控制对各个网络设备的访问是非常关健的。在
控制谁在何时有访问何种设备的权限时,需要有一整套方法,这些设备包括打印机
、文件以及其他的局域网或分布式网络资源。AD能够提供这些功能,由于与操作系
统的整合非常紧密,这意味着AD能够在非常低的级别上提供支持。


  AD的工作原理


  单地说,AD就是一个内容为所有网络资源、分层次、面向对象的数据库。最顶层
的对象一般是Organization (O),在该组织单元(OU)之下是容器,最后是包含实
际资源的对象。这种分层次的格式为系统管理人员创建了一种熟悉和易于管理的“
树”。例如,如果指定一个OU访问一个实际的资源,这一权限也将被赋予包含在其
中的对象。


  如何创建AD?


  在.NET Framework中,微软为我们提供了System.DirectoryServices名字空间,
它又使用了活动目录服务接口(ADSI)。

  DSI是通过编程与许多不同的目录服务提供者交互的方式,也就是一种编程接口


  System.DirectoryServices空间中的类能够与如下所示的活动目录服务提供者配
合使用:


  表1.1 AD服务提供者



  目录服务提供者 路径
  Windows NT 5.0、Windows 2000或Windows XP WinNT://path
  Lightweight Directory Access Protocol (LDAP) LDAP://path
  Novell NetWare Directory Service NDS://path
  Novell Netware 3.x NWCOMPAT://path
  Internet Information Services (IIS) IIS://



  在System.DirectoryServices名字空间内,有二个主要的类:System.
DirectoryServices.DirectoryEntry和System.DirectoryServices.
DirectorySearcher类。本篇文章不涉及这二个类的细节,需要注意的是,
DirectorySearcher只能与LDAP提供者一起使用。

  在使用DirectoryEntry对象时,每个对象都有一个模式。模型是对象条目的类型
。例如,如果有一个User模式的DirectoryEntry对象,它就代表是一个用户。

  在本篇文章中,我们使用了Windows 2000提供者(WinNT://)和System.
DirectoryServices.DirectoryEntry类。


  用户管理


  在本篇文章的例子中,我们使用System.DirectoryServices名字空间创建一个数
据访问层(DAL),执行一些非常基础的用户管理任务。DAL是对执行数据访问的真
实的复杂性进行抽象的一种方法。例如,如果我们要编写一个访问Access数据库的
DAL,就可以在对象中隐藏所有与ADO.NET有关的任务。当开发人员需要与数据库打
交道时,只需要简单地使用这些对象,而无需关心特定的实现细节。开发者根本无
需为ADO.NET操心,即使是以后决定升级到SQL Server,也只是需要改变DAL,使之
适合新的数据库即可,其他的东西无需改变。


  用户对象


  我们建立的第一个对象用来表示任何给定用户的当前状态,该对象对User模式的
DirectoryEntry类进行抽象。为了清楚起见,它看起来更象一个实际的User对象。


  namespace DSHelper {
   public class DSUser {
   public DSUser(System.DirectoryServices.DirectoryEntry user) {
   this.domainName=user.Path;
   this.Username=user.Name;
   this.Password=user.Password;
   try {
   this.FullName=Convert.ToString(user.Invoke("Get", new object[]
  {"FullName"}));
   this.Description=Convert.ToString(user.Invoke("Get", new object[]
  {"Description"}));
   this.PasswordExpired=Convert.ToInt32(user.Invoke("Get", new
object[]
  {"PasswordExpired"}));
   this.RasPermissions=Convert.ToInt32(user.Invoke("Get", new object[]

  {"RasPermissions"}));
   this.MaxStorage=Convert.ToInt32(user.Invoke("Get", new object[]
  {"MaxStorage"}));
   this.PasswordAge=Convert.ToInt32(user.Invoke("Get", new object[]
  {"PasswordAge"}));
   this.HomeDirectory=Convert.ToString(user.Invoke("Get", new object[]

  {"HomeDirectory"}));
   this.LoginScript=Convert.ToString(user.Invoke("Get", new object[]
  {"LoginScript"}));
   this.HomeDirDrive=Convert.ToString(user.Invoke("Get", new object[]
  {"HomeDirDrive"}));
   this.userDirEntry=user;
   }catch(Exception e) {
   throw(new Exception("Could not load user from given
DirectoryEntry"));
   }
   }
   public DSUser(string Username, string Password, string DomainName)
{
   domainName=DomainName;
   if(domainName=="" || domainName==null) domainName=Environment.
MachineName;
   username=Username;
   password=Password;
   }
   private object groups=null;
   public object Groups{get{return groups;} set{groups=value;}}
   }
  }




  图1.2 User对象


  我们的用户对象有二个缺省的构造器。第一个用来用一个给定的
DirectoryEntry对象对我们的用户进行初始化,它将使用Invoke方法从对象中“获
取”用户的属性。

  第二个构造器用来创建一个新的用户。我们只需要向它传递三个参数,在用来创
建新用户时,它就会创建一个新的DSUser对象。需要注意的是,由于没有完成任何
的AD操作,因此我们并没有在AD中创建真正的用户。


  数据访问层(DAL)


  下一步就是创建AD的DAL封装了,下面的一些代码是分步骤完成的完整的
UserAdmin DAL代码。

  我们首先创建并初始化在UserAdmin类中所需要的代码:

  #缺省属性的初始化
   //我们的错误日志设备,应当尽量保持简单,避免代码膨胀过大
   System.Text.StringBuilder errorLog = new System.Text.StringBuilder();

   private System.Boolean error=false;
   public System.Boolean Error{get{return error;}}
   public string ErrorLog{get{return errorLog.ToString();}}
   //设置缺省的属性
   private string loginPath="WinNT://"+Environment.MachineName+",
computer";
   private string domainName=null;
   private string loginUsername=null;
   private string loginPassword=null;
   private System.DirectoryServices.AuthenticationTypes
authenticationType =
  System.DirectoryServices.AuthenticationTypes.None;
   private System.DirectoryServices.DirectoryEntry AD=null;
   private System.Boolean connected=false;
   #endregion




  图1.3 缺省属性的初始化


  注意我们是如何将LoginPath硬拷贝为WinNT提供商的。为了使DAL能够与任何其
他AD服务提供商配合,这一点必须进行改变。另外需要注意的是,我使用了
System.Text.StringBuilder对象来保存错误日志,从而简化了错误处理过程。在
有错误发生的情况下,系统会简单地添加一条日志,Boolean型变量error将会被设
置为“真”值。下面的代码是我们设计的类的构造器:(图1.4)

  #region .ctor's
   public UserAdmin() {
   Connect();
   }
   /// <摘要>
   /// 在需要的时候,使我们能够创建UserAdmin类
   /// </摘要>
   /// <param name="LoginUsername"></param>
   /// <param name="LoginPassword"></param>
   /// <param name="AuthenticationType"></param>
   /// <param name="DomainName"></param>
   public UserAdmin(string LoginUsername, string LoginPassword,
   System.DirectoryServices.AuthenticationTypes AuthenticationType,
  string DomainName) {
   loginUsername=LoginUsername;
   loginPassword=LoginPassword;
   authenticationType=AuthenticationType;
   if(DomainName=="" || DomainName==null)
  DomainName=System.Environment.UserDomainName;
   domainName=DomainName;
   Connect();
   }
   /// <摘要>
   /// 获得UserAdmin类的另一种方式,可以指定另外一个LoginPath,例如LDAP
或IIS。
   /// </摘要>
   /// <param name="LoginPath"></param>
   /// <param name="LoginUsername"></param>
   /// <param name="LoginPassword"></param>
   /// <param name="AuthenticationType"></param>
   /// <param name="DomainName"></param>
   public UserAdmin(string LoginPath, string LoginUsername, string
LoginPassword,
   System.DirectoryServices.AuthenticationTypes AuthenticationType,
  string DomainName) {
   loginPath=LoginPath;
   loginUsername=LoginUsername;
   loginPassword=LoginPassword;
   authenticationType=AuthenticationType;
   if(DomainName=="" || DomainName==null)
  DomainName=System.Environment.UserDomainName;
   domainName=DomainName;
   Connect();
   }
   #endregion





--

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 61.144.235.39]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店