逐步解說:檢視本機目錄物件

本主題的程序示範如何使用 DirectoryEntry 來列出本機電腦上的使用者、群組及服務。DirectoryEntry 使用 Active Directory 網域服務技術來存取此資訊。此元件所建立的每個項目都包含其屬性的清單。

建立使用者介面

  1. 在 [檔案] 功能表上,指向 [新增],然後按一下 [專案]。

  2. 在 [新增專案] 對話方塊中,在左窗格選取 [Visual Basic .NET]、[Visual C#] 或 [Visual J#],然後選擇 [Windows 應用程式] 範本。將此專案命名為 "ActiveDirectory"。

  3. 從 [工具箱] 的 [Windows 表單] 索引標籤,將 [TreeView] 控制項拖曳至 [Form1]。

  4. 將 [TreeView] 控制項的 [名稱] 屬性設定為 "viewPC"。稍後將在逐步解說中修改 TreeView 控制項,使其包含三個最上層節點 (使用者、群組及服務各一個節點)。每個第二層節點將代表在您的電腦上註冊的一個使用者、群組或服務。每個使用者、群組和服務將有兩個子節點,一個用於其 Active Directory 網域服務路徑,另一個用於其屬性。

設定 DirectoryEntry 元件

  1. 在 [方案總管] 中,以滑鼠右鍵按一下專案,然後在捷徑功能表上按一下 [加入參考]。

  2. 將參考加入到 "System.DirectoryServices.dll"。

  3. 從 [工具箱] 的 [元件] 索引標籤,將 [DirectoryEntry] 元件執行個體拖曳至設計工具。

  4. 將 [DirectoryEntry] 元件的 [名稱] 屬性設為 "entryPC"。

  5. 將 DirectoryEntry 元件的 [路徑] 屬性設為 WinNT://網域/YourComputerName。 使用您的網域與電腦名稱引導 DirectoryEntry 元件使用 Active Directory 網域服務的 WinNT 服務提供者檢查您的本機電腦。

    注意:
    如果使用錯誤的網域或電腦名稱,應用程式將在執行期間擲出例外狀況。如果您輸入 WinNT://YourComputerName 做為路徑,則服務提供者將嘗試找出此電腦。

將最上層節點新增至 TreeView 控制項

  1. 在設計工具中,按兩下 [Form1] 即可在 [程式碼編輯器] 中建立 Form_Load 事件處理常式。

  2. 加入必要的程式碼,為使用者、群組及服務建立三個最上層節點,以修改 Form1_Load 方法。當應用程式執行時,元件 entryPC 的 Children 屬性會包含在「路徑」(您的電腦) 找到的所有項目。每個子系也是一個 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 元件的結構描述而定。屬性集合具有 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. 開啟節點以檢查路徑與屬性。使用者都共用相同一組屬性,因為他們都共用相同的結構描述。對群組和服務節點而言也是如此。

此逐步解說使用 WinNT 服務提供者做為 Active Directory 網域服務。其他可用的服務還包括輕量型目錄存取協定 (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.

Copyright © 2007 by Microsoft Corporation.All rights reserved.