ADSI有整个完整的一套函数集,MSDN对此说得很清楚。如:Active Directory 对象简介请参见
演练:添加 Active Directory 对象 | Active Directory 技术背景 | 创建 DirectoryEntry 组件实例
Active Directory 服务接口 (ADSI) 是 Microsoft Windows Active Directory 的编程接口。它允许应用程序使用单个接口与网络上的不同目录进行交互。Visual Studio .NET 和 .NET 框架使得添加具有 DirectoryEntry 和 DirectorySearcher 组件的 ADSI 功能非常容易。有关 Active Directory 的概述,请参阅 Active Directory 技术背景。使用 ADSI,可以创建执行常见管理任务的应用程序,这些任务包括备份数据库、访问打印机和管理用户帐户等。ADSI 允许执行以下操作: 登录一次即可处理不同的目录。DirectoryEntry 组件类提供用户名和密码属性,可以在运行时输入这些属性并与绑定到的 Active Directory 对象进行通讯。 
通过给用户提供各种要使用的协议,使用单个应用程序编程接口 (API) 即可在多个目录系统上执行任务。DirectoryServices 命名空间提供可执行大多数管理功能的类。 
对目录系统执行“多格式查询”。ADSI 技术允许通过指定两种查询语言,即 SQL 和 LDAP,来搜索对象。有关更多信息,请参阅搜索 Active Directory 层次结构。 
通过访问 Active Directory 树,访问和使用用于管理和维护各种复杂网络配置的单个分层结构。 
将目录信息与数据库(如 SQL Server)进行集成。只要 DirectoryEntry 路径使用 LDAP 提供程序,就可以将它用作 ADO.NET 连接字符串。 
搜索目录
可以使用 DirectorySearcher 类对使用轻量目录访问协议(Lightweight Directory Access Protocol,LDAP)的 Active Directory 层次结构进行搜索和执行查询。可以基于大型目录中对象的属性 (Rich Query) 执行查询,以便按其一个或多个属性值查找特定的对象。有关更多信息,请参阅搜索 Active Directory 层次结构。管理目录
可以将 DirectoryEntry 组件绑定到目录中的对象以执行管理任务,如修改属性或监视信息更改。例如,假定公司允许雇员联机订购工作中所需的书籍。根据雇员职位的不同,花费限制也会不同。当雇员订购书籍时,公司的跟踪应用程序可以使用 DirectoryEntry 组件验证有关该雇员的职位和花费限制的信息。如果超出了限制,DirectoryEntry 组件可以检索该雇员及其经理的电子邮件地址,然后向他们发送附加信息。要求
DirectoryEntry 组件和 DirectorySearcher 组件均要求在计算机上安装 ADSI SDK 或 ADSI 运行库,以便创建具有它们的功能的应用程序。对于 Windows NT 5.0 版、Windows 2000 或 Windows XP,默认安装 ADSI 2.5。如果使用的是以前版本的 Windows,则您可以自己从 Microsoft Web 站点安装该 SDK。下列要求适用于 DirectoryEntry 组件: 若要更改 Active Directory 对象的属性值,必须拥有所绑定到对象的管理权限。有关 Active Directory 用户权限的信息,请参阅 Windows 2000 帮助目录中的 Active Directory 文档。 
下列要求适用于 DirectorySearcher 组件: DirectorySearcher 组件的实例需要 LDAP 提供程序以便对 Active Directory 层次结构执行多格式查询。 
若要在执行搜索时能够使用 ADSI API,必须在计算机上安装目录服务提供程序,如 Active Directory 或轻量目录访问协议 (LDAP)。有关可以使用的目录服务以及如何安装它们的更多信息,请参阅 Microsoft Web 站点。 

解决方案 »

  1.   

    演练:添加 Active Directory 对象请参见
    创建 Active Directory 组件 | Active Directory 技术背景 | DirectoryEntry 类 | DirectorySearcher 类 
    本主题中的步骤演示使用 DirectoryEntry 组件列出本地计算机上的用户、组和服务的过程。DirectoryEntry 组件使用 Active Directory 技术完成这些操作。该组件创建的每项都包含一组它的属性。创建用户界面 在“文件”菜单上指向“新建”,然后单击“项目”。 
    在“新建项目”对话框中,选择左窗格中的 Visual Basic 或 Visual C#,然后选择“Windows 应用程序”模板。将项目命名为 ActiveDirectory。 
    在工具箱的“Windows 窗体”选项卡中,将 TreeView 控件拖到 Form1 上。 
    将 TreeView 控件的 Name 属性设置为 viewPC。 
    此演练将在稍后的过程中修改 TreeView 控件以包含三个顶级节点,各个节点分别用于用户、组和服务。每个二级节点都将代表一个在您的计算机上注册的用户、组或服务。每个用户、组和服务都具有两个子节点,一个用于其 Active Directory 路径,另一个用于其属性。 配置 DirectoryEntry 组件 在解决方案资源管理器中,右击项目并从快捷菜单中选择“添加引用”。 
    将引用添加到 System.DirectoryServices.dll。 
    在工具箱的“组件”选项卡中,将 DirectoryEntry 组件实例拖到设计器中。 
    将 DirectoryEntry 组件的 Name 属性设置为 entryPC。 
    将 DirectoryEntry 组件的 Path 属性设置为 WinNT://Domain/YourComputerName。使用您的域和计算机名指示 DirectoryEntry 组件使用用于 Active Directory 的 WinNT 服务提供程序来检查本地计算机。 
    注意 如果您不知道域或计算机名,请与系统管理员联系。
    向 TreeView 控件添加顶级节点 在设计器中,双击“Form1”以在代码编辑器中创建 Form_Load 事件处理程序。 
    在文件顶部,添加此语句将 System.DirectoryServices 命名空间包括到代码中。 
    ' Visual Basic
    Imports System.DirectoryServices// C#
    using System.DirectoryServices;
    将代码添加到 Load 事件处理程序以创建用于用户、组和服务的三个顶级节点。代码如下所示: 
    ' Visual Basic
    Private Sub Form1_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
       Dim users As New TreeNode("Users")
       Dim groups As New TreeNode("Groups")
       Dim services As New TreeNode("Services")
       viewPC.Nodes.AddRange(New TreeNode() {users, groups, services})
    End Sub// C#
    private void Form1_Load(object sender, System.EventArgs e)
    {
       TreeNode users = new TreeNode("Users");
       TreeNode groups = new TreeNode("Groups");
       TreeNode services = new TreeNode("Services");
       viewPC.Nodes.AddRange(new TreeNode[] { users, groups, services });
    }
    当应用程序运行时,名为 entryPC 的组件的 Children 属性包含在 Path(您的计算机)中找到的所有项。每个子级也都是一个 DirectoryEntry 对象。因为您正在计算机路径上使用 WinNT 提供程序,子 DirectoryEntry 对象的 SchemaClassName 属性将是“User”、“Group”或“Service”之一。select 或 switch 语句可用于确定项类型并向正确的组添加节点。向 TreeView 控件添加项节点 将此代码添加到 Form1_Load 中变量声明之后以枚举包含在 entryPC 实例中的 DirectoryEntry 对象。 
    ' Visual Basic
    Dim child As DirectoryEntry
    For Each child In entryPC.Children
       ' Code added here in next steps.
    Next// C#
    foreach(DirectoryEntry child in entryPC.Children) 
    {
       // Code added here in next steps.
    }
    在步骤 1 的代码中,添加 select 或 switch 语句以创建子级目录项的新节点并将其添加到适当的顶级节点。 
    ' Visual Basic
    Dim newNode As New TreeNode(child.Name)
    Select Case child.SchemaClassName
       Case "User"
          users.Nodes.Add(newNode)
       Case "Group"
          groups.Nodes.Add(newNode)
       Case "Service"
          services.Nodes.Add(newNode)
    End Select// C#
    TreeNode newNode = new TreeNode(child.Name);
    switch (child.SchemaClassName) 
    {
       case "User" :
          users.Nodes.Add(newNode);   
          break;
       case "Group" :
          groups.Nodes.Add(newNode);   
          break;
       case "Service" :
          services.Nodes.Add(newNode);   
          break;
       }
    在 select 或 switch 语句之后添加以下语句,为该项的路径和属性添加节点。您将编写的 AddPathAndProperties 方法为该项添加路径和属性节点。 
    ' Visual Basic
    AddPathAndProperties(newNode, child)// C#
    AddPathAndProperties(newNode, child);
    注意 您将在下一节中添加 AddPathAndProperties 方法。
    完成的 Form_Load 方法如下所示: ' Visual Basic
    Private Sub Form1_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
       Dim users As New TreeNode("Users")
       Dim groups As New TreeNode("Groups")
       Dim services As New TreeNode("Services")
       viewPC.Nodes.AddRange(New TreeNode() {users, groups, services})   Dim child As DirectoryEntry
       For Each child In entryPC.Children
          Dim newNode As New TreeNode(child.Name)
          Select Case child.SchemaClassName
             Case "User"
                users.Nodes.Add(newNode)
             Case "Group"
                groups.Nodes.Add(newNode)
             Case "Service"
                services.Nodes.Add(newNode)
          End Select
          AddPathAndProperties(newNode, child)
       Next
    End Sub// C#
    private void Form1_Load(object sender, System.EventArgs e)
    {
       TreeNode users = new TreeNode("Users");
       TreeNode groups = new TreeNode("Groups");
       TreeNode services = new TreeNode("Services");
       viewPC.Nodes.AddRange(new TreeNode[] { users, groups, services });   foreach(DirectoryEntry child in entryPC.Children) 
       {
          TreeNode newNode = new TreeNode(child.Name);
          switch (child.SchemaClassName) 
          {
             case "User" :
                users.Nodes.Add(newNode);   
                break;
             case "Group" :
                groups.Nodes.Add(newNode);   
                break;
             case "Service" :
                services.Nodes.Add(newNode);   
                break;
          }
          AddPathAndProperties(newNode, child);
       }
    }
    DirectoryEntry 组件具有 Properties 属性,该属性包含一个字符串索引的属性集合。该集合的内容取决于 DirectoryEntry 组件的架构。Properties 集合具有 PropertyNames 属性,该属性是一个所有属性名称的集合。通过逐一通过该集合,您可以检索每个属性。每个属性都具有一组关联的值。在本演练中,您只检索每个属性的第一个值。 列出项的路径和属性 将以下代码添加到 Form1 类,创建 AddPathAndProperties 方法。entry 参数表示目录中的一项,即一个用户、一个组或一个服务。node 参数表示与该项关联的 TreeNode 对象。 
    ' Visual Basic
    Private Sub AddPathAndProperties(ByVal node As TreeNode, _
    ByVal entry As DirectoryEntry)End Sub// C#
    private void AddPathAndProperties(TreeNode node, DirectoryEntry entry)
    {
    }
    添加此代码以创建显示该项路径的新节点。 
    ' Visual Basic
    node.Nodes.Add(New TreeNode("Path: " & entry.Path))// C#
    node.Nodes.Add(new TreeNode("Path: " + entry.Path));
    添加此代码以创建该属性的父节点。 
    ' Visual Basic
    Dim propertyNode As New TreeNode("Properties")
    node.Nodes.Add(propertyNode)// C#
    TreeNode propertyNode = new TreeNode("Properties");
    node.Nodes.Add(propertyNode);
    添加此代码为该项的每个属性都创建一个新节点。为每个属性显示属性名称和值。 
    ' Visual Basic
    Dim propertyName As String
    Dim oneNode As String
    For Each propertyName In entry.Properties.PropertyNames
       Try
          oneNode = propertyName & ": " & _
          CType(entry.Properties(propertyName)(0), String)
       Catch
          oneNode = propertyName & ": " & _
          "No text representation."
       End Try
       propertyNode.Nodes.Add(New TreeNode(oneNode))
    Next// C#
    foreach (string propertyName in entry.Properties.PropertyNames) 
    {
       string oneNode = propertyName + ": " + 
          entry.Properties[propertyName][0].ToString();
       propertyNode.Nodes.Add(new TreeNode(oneNode));
    }
    完整的方法如下所示: ' Visual Basic
    Private Sub AddPathAndProperties(ByVal node As TreeNode, _
    ByVal entry As DirectoryEntry)
       node.Nodes.Add(New TreeNode("Path: " & entry.Path))
       Dim propertyNode As New TreeNode("Properties")
       node.Nodes.Add(propertyNode)   Dim propertyName As String
       Dim oneNode As String
       For Each propertyName In entry.Properties.PropertyNames
          Try
             oneNode = propertyName & ": " & _
                CType(entry.Properties(propertyName)(0), String)
          Catch
             oneNode = propertyName & ": " & _
                "No text representation."
          End Try
          propertyNode.Nodes.Add(New TreeNode(oneNode))
      

  2.   

    靠!连MSDN也往这里贴,也不把vb.net的给del了再贴!看明白了再结帐。
    有谁做过没有?1 COM+ component怎么判断哪个role调用?除了在com+ catalog里设置外,程序里要怎么做?看过framework的sample,两行代码就判断出来了。真正的应用中,也是这样就够了吗?
    2 前面讲的是com+的role,那.net的role-based security又是怎样的?谁还能讲讲.net的其他security,概念我是知道的,但没见过实用的例子,比较难理解。只好先用com+的!
    3 还有在com+ 1.5下 有什么新的改动吗?