现在的位置: 首页 > 综合 > 正文

DirectoryEntry 类

2012年07月23日 ⁄ 综合 ⁄ 共 5052字 ⁄ 字号 评论关闭
  

System.DirectoryServices 命名空间用以从托管代码简便地访问 Active Directory。该命名空间包含两个组件类,即 DirectoryEntry 和 DirectorySearcher,

它们使用 Active Directory 服务接口 (ADSI) 技术。ADSI 是 Microsoft 提供的一组接口,作为使用各种网络提供程序的灵活的工具。无论网络有多大,

ADSI 都可以使管理员能够相对容易地定位和管理网络上的资源。

System.DirectoryServices 命名空间中的类可以与任何 Active Directory 服务提供程序一起使用。当前的一些提供程序包括 Internet 信息服务 (IIS)、

轻量目录访问协议 (LDAP)、Novell NetWare 目录服务 (NDS) 和 WinNT。

ADSI 是 Microsoft Active Directory 的编程接口,使应用程序能够只使用一个接口就可以与网络上的不同目录进行交互。使用 ADSI,可以创建一些应用程序,

用以执行常见任务,如备份数据库、访问打印机和管理用户帐户。

Path 属性
  Path 属性唯一地标识网络环境中的此项。始终可以使用此 Path 检索此项。

  设置 Path 将从目录存储区检索新项;它不更改当前绑定的项的路径。

  与 DirectoryEntry 组件关联的类可与任何 Active Directory 域服务提供程序一起使用。当前的一些提供程序包括 Internet 信息服务 (IIS)、轻量目录访问协议 (LDAP)、Novell NetWare 目录服务 (NDS) 和 WinNT。

  说明:标识提供程序(在“://”前面)的 Path 部分是区分大小写的。例如,“LDAP://”或“WinNT://”。
 
  Path 属性的语法随提供程序不同而不同。一些常见的情况有:

    WinNT
      连接到计算机上的组。例如“WinNT://<域名>/<计算机名>/<组名>”。如果是连接到本地计算机,则为“WinNT://<计算机名>/<组名>”。
      发现网络上的所有域。例如,“WinNT:”通过枚举此项的子级可以找到这些域。

    LDAP
      连接到域中的组。例如“LDAP://CN=<组名>, CN =<用户>, DC=<域组件>, DC=<域组件>,...”。

    IIS
      连接到 Web 目录。例如“IIS://LocalHost/W3SVC/1/ROOT/<Web 目录名>”。

  若要使用 LDAP 绑定到当前域,请使用路径“LDAP://RootDSE”,然后获取默认命名上下文,并重新绑定该项。例如:

  String str = ent.Properties["defaultNamingContext"][0];
  DirectoryEntry domain = new DirectoryEntry("LDAP://" + str);
 

1. 在网页中的通用方法:
  获取服务器电脑名:Page.Server.MachineName
  获取用户信息:Page.User
  获取客户端电脑名:Page.Request.UserHostName
  获取客户端电脑IP:Page.Request.UserHostAddress

2. 在网络编程中的通用方法:
  获取当前电脑名:static System.Net.Dns.GetHostName()
  根据电脑名取出全部IP地址:static System.Net.Dns.Resolve(电脑名).AdressList
  也可根据IP地址取出电脑名:static System.Net.Dns.Resolve(IP地址).HostName

3. 系统环境类的通用属性:
  当前电脑名:static System.Environment.MachineName
  当前电脑所属网域:static System.Environment.UserDomainName
  当前电脑用户:static System.Environment.UserName

创建示例

  • 打开 Microsoft Visual Studio .NET,然后新建一个 Visual C# Console 应用程序项目。
  • 在“解决方案资源管理器”中,右键单击引用,然后单击添加引用
  • 添加一个对 System.DirectoryServices.dll 程序集的引用。
  • 将 Class1.cs 中的代码替换为下面的代码:
    using System;
    using System.DirectoryServices;
    
    class Class1
    {
    static void Main(string[] args)
        {
    try
            {
    	 DirectoryEntry AD = new DirectoryEntry("WinNT://" + 
    	                     Environment.MachineName + ",computer");
    	 DirectoryEntry NewUser = AD.Children.Add("TestUser1", "user");
    	 NewUser.Invoke("SetPassword", new object[] {"#12345Abc"});
    	 NewUser.Invoke("Put", new object[] {"Description", "Test User from .NET"});
    	 NewUser.CommitChanges();
    	 DirectoryEntry grp;
    
    	 grp = AD.Children.Find("Guests", "group");
    	 if (grp != null) {grp.Invoke("Add", new object[] {NewUser.Path.ToString()});}
    	 Console.WriteLine("Account Created Successfully");
    	 Console.ReadLine();
    	}
        catch (Exception ex)
    	{
    	 Console.WriteLine(ex.Message);
    	 Console.ReadLine();
    
    	}
        }
    }
  • 编译并运行该项目。

    代码说明


    创建新目录项


    创建本示例中的目录项时,假定系统正在运行 Microsoft Windows NT、Windows 2000 或 Windows XP。 注意,向 DirectoryEntry 构造函数传递以“WinNT://”开头的字符串。 您还可以在其他第三方操作系统上运行“目录服务”。

    DirectoryEntry AD = new DirectoryEntry("WinNT://" + SystemInformation.ComputerName + ",computer");

    向目录树添加目录项


    以下代码在 Active Directory 树中添加了一个 user 类型的、值为 TestUser1DirectoryEntry

    DirectoryEntry NewUser = AD.Children.Add("TestUser1", "user");

    设置新用户帐户的密码和说明


    以下代码调用 Invoke 方法来调用 DirectoryEntry 对象的 SetPasswordPut 方法。 这将为用户帐户设置密码并分配说明。 此代码还调用 CommitChanges 方法保存这些更改。

    NewUser.Invoke("SetPassword", new object[] {"#12345Abc"});
    NewUser.Invoke("Put", new object[] {"Description", "Test User from .NET"});
    NewUser.CommitChanges();

    将帐户添加到组


    将帐户添加到组的第一步是定义 DirectoryEntry 类型的变量。 然后调用 ActiveDirectoryChildren 成员的 Find 方法来填充变量。 在这种情况下,Guest 组是搜索目标。 此代码测试 Find 方法返回的值以确定是否已找到该组。 如果找到该组,新用户帐户便会添加到组中。

    DirectoryEntry grp;
    grp = AD.Children.Find("Guests", "group");
    if (grp != null) {grp.Invoke("Add", new object[] {NewUser.Path.ToString()});}

创建示例

  • 打开 Microsoft Visual Studio .NET,然后新建一个 Visual C# Console 应用程序项目。
  • 在“解决方案资源管理器”中,右键单击引用,然后单击添加引用
  • 添加一个对 System.DirectoryServices.dll 程序集的引用。
  • 将 Class1.cs 中的代码替换为下面的代码:
    using System;
    using System.DirectoryServices;
    
    class Class1
    {
    static void Main(string[] args)
        {
    try
            {
    	 DirectoryEntry AD = new DirectoryEntry("WinNT://" + 
    	                     Environment.MachineName + ",computer");
    	 DirectoryEntry NewUser = AD.Children.Add("TestUser1", "user");
    	 NewUser.Invoke("SetPassword", new object[] {"#12345Abc"});
    	 NewUser.Invoke("Put", new object[] {"Description", "Test User from .NET"});
    	 NewUser.CommitChanges();
    	 DirectoryEntry grp;
    
    	 grp = AD.Children.Find("Guests", "group");
    	 if (grp != null) {grp.Invoke("Add", new object[] {NewUser.Path.ToString()});}
    	 Console.WriteLine("Account Created Successfully");
    	 Console.ReadLine();
    	}
        catch (Exception ex)
    	{
    	 Console.WriteLine(ex.Message);
    	 Console.ReadLine();
    
    	}
        }
    }
  • 编译并运行该项目。

    代码说明


    创建新目录项


    创建本示例中的目录项时,假定系统正在运行 Microsoft Windows NT、Windows 2000 或 Windows XP。 注意,向 DirectoryEntry 构造函数传递以“WinNT://”开头的字符串。 您还可以在其他第三方操作系统上运行“目录服务”。

    DirectoryEntry AD = new DirectoryEntry("WinNT://" + SystemInformation.ComputerName + ",computer");

    向目录树添加目录项


    以下代码在 Active Directory 树中添加了一个 user 类型的、值为 TestUser1DirectoryEntry

    DirectoryEntry NewUser = AD.Children.Add("TestUser1", "user");

    设置新用户帐户的密码和说明


    以下代码调用 Invoke 方法来调用 DirectoryEntry 对象的 SetPasswordPut 方法。 这将为用户帐户设置密码并分配说明。 此代码还调用 CommitChanges 方法保存这些更改。

    NewUser.Invoke("SetPassword", new object[] {"#12345Abc"});
    NewUser.Invoke("Put", new object[] {"Description", "Test User from .NET"});
    NewUser.CommitChanges();

    将帐户添加到组


    将帐户添加到组的第一步是定义 DirectoryEntry 类型的变量。 然后调用 ActiveDirectoryChildren 成员的 Find 方法来填充变量。 在这种情况下,Guest 组是搜索目标。 此代码测试 Find 方法返回的值以确定是否已找到该组。 如果找到该组,新用户帐户便会添加到组中。

    DirectoryEntry grp;
    grp = AD.Children.Find("Guests", "group");
    if (grp != null) {grp.Invoke("Add", new object[] {NewUser.Path.ToString()});}

抱歉!评论已关闭.