演练:查看本地目录对象

本主题中的过程说明如何使用 DirectoryEntry 列出您的本地计算机上的用户、组和服务。DirectoryEntry 使用 Active Directory 域服务技术访问此信息。该组件创建的每一项都包含一组它的属性。

创建用户界面

  1. 在“文件”菜单上,指向“新建”,然后单击“项目”。

  2. 在“新建项目”****对话框中,选择左窗格中的 Visual Basic .NET、Visual C# 或 Visual J#,然后选择“Windows 应用程序”模板。将该项目命名为“ActiveDirectory”。

  3. 在工具箱的“Windows 窗体”选项卡中,将 TreeView 控件拖到 Form1 上。

  4. 将 TreeView 控件的“Name”属性设置为“viewPC”。此演练将在后面的部分中修改 TreeView 控件以包含三个顶级节点,每个节点都用于用户、组和服务。每个二级节点都将代表一个在您的计算机上注册的用户、组或服务。每个用户、组和服务都具有两个子节点,一个用于其 Active Directory 域服务路径,另一个用于其属性。

配置 DirectoryEntry 组件

  1. 在“解决方案资源管理器”****中,右键单击您的项目,然后单击快捷菜单上的“添加引用”。

  2. 添加对“System.DirectoryServices.dll”的引用。

  3. 在工具箱的“组件”选项卡中,将 DirectoryEntry 组件实例拖到设计器中。

  4. 将 DirectoryEntry 组件的“Name”属性设置为“entryPC”。

  5. 将 DirectoryEntry 组件的**“Path”**属性设置为 WinNT:///您的计算机名。 使用您的域名和计算机名指示 DirectoryEntry 组件使用用于 Active Directory 域服务的 WinNT 服务提供程序来检查本地计算机。

    注意:
    如果使用的域名或计算机名不正确,则应用程序将在运行时引发异常。如果输入路径 WinNT://您的计算机名 ,则服务提供程序将尝试定位该计算机。

向 TreeView 控件添加顶级节点

  1. 在设计器中双击“Form1”,在代码编辑器中创建 Form_Load 事件处理程序。

  2. 通过添加必需的代码来修改 Form1_Load 方法,从而为用户、组和服务创建三个顶级节点。当应用程序运行时,名为 entryPC 的组件的 Children 属性包含在 Path(您的计算机)中找到的所有项。每个子级也都是一个 DirectoryEntry 对象。因为您正在计算机路径上使用 WinNT 提供程序,所以子 DirectoryEntry 对象的 SchemaClassName 属性将是“User”、“Group”或“Service”之一。根据 SchemaClassName 属性指示的目录项类型,使用 select 或 switch 语句向正确的组添加节点。

    下一步中将编写 AddPathAndProperties 方法。

    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 System.DirectoryServices.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
    
    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(System.DirectoryServices.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);
       }
    }
    
  3. 将以下代码添加到 Form1 类,以创建 AddPathAndProperties 方法。node 参数表示与该项关联的 TreeNode 对象。entry 参数表示目录中的一个项,可以是一个用户、一个组或一个服务。

    DirectoryEntry 组件具有 Properties 属性,该属性包含一个字符串索引的属性集合。该集合的内容取决于 DirectoryEntry 组件的架构。Properties 集合具有 PropertyNames 属性,它是所有属性名称的集合。通过逐一使用该集合,您可以检索每个属性。每个属性都具有一组关联的值。在本方法中,只检索每个属性的第一个值。

    Private Sub AddPathAndProperties(ByVal node As TreeNode, _
    ByVal entry As System.DirectoryServices.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))
       Next
    End Sub
    
    private void AddPathAndProperties(TreeNode node, 
       System.DirectoryServices.DirectoryEntry entry)
    {
       node.Nodes.Add(new TreeNode("Path: " + entry.Path));
       TreeNode propertyNode = new TreeNode("Properties");
       node.Nodes.Add(propertyNode);
       foreach (string propertyName in entry.Properties.PropertyNames) 
       {
          string oneNode = propertyName + ": " + 
             entry.Properties[propertyName][0].ToString();
          propertyNode.Nodes.Add(new TreeNode(oneNode));
       }
    }
    

运行程序

  1. 按 F5 运行程序。

  2. 打开节点以检查路径和属性。因为所有用户都共享相同的架构,所以它们共享相同的属性集。对于组和服务节点,情况也是这样。

本演练使用用于 Active Directory 域服务的 WinNT 服务提供程序。其他可用的服务包括轻型目录访问协议 (LDAP)、Novell NetWare 目录服务 (NDS) 和 Novell Netware 3.x 服务 (NWCOMPAT)。每个提供程序都提供一组不同的对象以允许您检查并处理目录。

DirectorySearcher 可用于在根路径中搜索项。DirectorySearcher 使用 LDAP 提供程序。

另请参见

参考

System.DirectoryServices
DirectoryEntry
DirectorySearcher

概念

System.DirectoryServices 入门

Send comments about this topic to Microsoft.

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。