程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> Visual C#構建網絡計算機樹形圖

Visual C#構建網絡計算機樹形圖

編輯:關於C#

Visual C#編寫網絡應用程序一般會使用到.Net FrameWork SDK中提供的二個重要的網絡命名空間"System.Net"和"System.Net.Sockets"。其實Visual C#還是可以通過調用其他命名空間中的類庫來實現很多有用的網絡功能,最常見的命名空間就是"System.DirectoryServices","System.DirectoryServices"命名空間定義了"DirectoryEntry"和"DirectorySearcher"類,通過它們能夠訪問 Active Directory服務接口(簡稱ADSI)。Active Directory服務接口提供一種構造復雜計算機網絡的簡單方法。Active Directory服務接口系統以分層樹狀結構排列。每個節點表示網絡上的一個資源或服務(對應網絡中的域或工作組),並且這個節點包含一組可檢索和操作的屬性(對應網絡中的主機)。本文就是通過它們來實現一個比較有用的網絡功能--構建一個網絡組成的計算機樹形結構圖。

一.Active Directory服務接口和DirectoryEntry類

Active Directory服務接口是Microsoft Windows Active Directory的編程接口。它允許應用程序使用單個接口與網絡上的不同目錄進行交互。Visual C#是通過創建DirectoryEntry和 DirectorySearcher能夠輕松訪問這個接口。而這種操作對其他編程語言而言,卻意味著要調用需要WinAPI函數。

Active Directory服務接口可以實現很多操作,本文所實現的訪問Active Directory樹,以構建網絡配置的計算機分層樹形結構圖,只是其中的一個很小的部分。若要使用Active Directory服務接口,必須在客戶端計算機上安裝 ADSI 2.5或更高版本。Windows 2000自動安裝了ADSI 2.5,而對Win 98及以下的系統,則沒有安裝ADSI 2.5,這也就是下面介紹的這個網絡功能無法獲得系統是Win 98及以下操作系統在網絡樹形圖對應的位置。所以下面介紹的網絡功能成功構建網絡的計算機樹形圖前提之一就是網絡上的計算機的操作系統在Windows 2000及以上。

由於本文只使用了DirectoryEntry類,故只介紹DirectoryEntry的結構和使用方法,表01和表02是DirectoryEntry類常用屬性、常用方法及其說明:

屬性 說明 AuthenticationType 獲取或設置要使用的身份驗證的類型。 Children 獲取DirectoryEntries實例,它包含Active Name 獲取用基礎目錄服務命名的對象的名稱。 NativeObject 獲取本機Active Directory服務接口(ADSI)對象。 Parent 獲取Active Directory層次結構中的此項的父級。 Password 獲取或設置在對客戶端進行身份驗證時使用的密碼。 Path 獲取或設置此DirectoryEntry的路徑。 Properties 獲取在此對象上設置的屬性的PropertyCollection。 SchemaClassName 獲取用於此DirectoryEntry的架構的名稱。 SchemaEntry 獲取DirectoryEntry,它保存此項的架構信息。項的架構確定其強制屬性和可選屬性的名稱的列表。 UsePropertyCache 獲取或設置一個值,該值指示在每次運算之後是否應提交緩存。 Username 獲取或設置在對客戶端進行身份驗證時使用的用戶名。

表01:DirectoryEntry類的常用屬性及其說明

方法 說明 Close 關閉DirectoryEntry並釋放與此組件關聯的任何系統資源。 CommitChanges 保存對Active CopyTo 創建此項的副本,並將其作為指定父級的子項。 DeleteTree 從Active Directory層次結構中刪除此項及其整個子樹。 Exists 搜索指定路徑處的目錄存儲區,以查看是否存在項。 Invoke 在本機Active Directory上調用方法。 MoveTo 將此項移至指定父級。 RefreshCache 將此目錄項的屬性值加載到屬性緩存中。 Rename 更改此項的名稱。

表02:DirectoryEntry類的常用方法及其說明

二.Visual C#使用ADSI構建網絡計算機樹形圖

創建DirectoryEntry類實例後,並為該實例指定一個路徑,指示所訪問的系統上使用的提供程序的類型以及要綁定到的對象。表03為DirectoryEntry類可以訪問的服務提供程序以及每種服務提供程序的標識符。

服務提供程序 路徑標識符 Windows 2000或Windows XP WinNT://path 輕量目錄訪問協議(LDAP) LDAP://path Novell NetWare目錄服務 NDS://path Novell Netware 3.x NWCOMPAT://path

表03:DirectoryEntry類訪問的服務提供程序以及每種服務提供程序的標識符

當創建DirectoryEntry類實例,並把此實例綁定到指定路徑的Active Directory中的節點。如果是此節點對應的是Windows NT服務提供程序,那就可以訪問此節點下域、計算機、打印隊列和會話。本文就是通過DirectoryEntry此種功能訪問網絡中計算機,從而構建網絡計算機樹形圖的。下面就來介紹具體的實現方法。

三.本文中介紹的程序設計及運行環境

(1).微軟視窗2000 服務器版。

(2).Visual Studio .Net 2003企業結構版,.Net Framework SDK 4322。

四.Visual C#構建網絡計算機樹形圖的實現步驟

Visual C#構建網絡計算機樹形圖的具體步驟如下:

1. 啟動Visual Studio .Net。

2. 選擇菜單【文件】|【新建】|【項目】後,彈出【新建項目】對話框。

3. 將【項目類型】設置為【Visual C#項目】。

4. 將【模板】設置為【Windows應用程序】。

5. 在【名稱】文本框中輸入【Visual C#構建網絡計算機樹形圖】。

6. 在【位置】的文本框中輸入【E:\VS.NET項目】,然後單擊【確定】按鈕,這樣在"E:\VS.NET項目"目錄中就產生了名稱為"Visual C#構建網絡計算機樹形圖"的文件夾,並在裡面創建了名稱為"Visual C#構建網絡計算機樹形圖"的項目文件。

7. 把Visual Studio .Net的當前窗口切換到【Form1.cs(設計)】窗口,並從【工具箱】中的【Windows窗體組件】選項卡中往Form1窗體中拖入下列組件,並執行相應的操作:

一個TreeView組件,名稱為treeView1,使用此組件來顯示網絡計算機的樹形圖。

一個Button組件,通過此組件的Click事件來讀取網絡中域和工作組,並在此Button組件拖入Form1的設計窗體後,雙擊它,則系統會在Form1.cs文件分別產生此組件的Click事件對應的處理代碼。

8. 在【解決方案資源管理器】窗口中,雙擊Form1.cs文件,進入Form1.cs文件的編輯界面。並在Form1.cs文件的開頭,用下列導入命名空間代碼替代系統缺省的導入命名空間代碼。

using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
using System.Threading ;

9. 在Form1.cs的class代碼區中添加下列代碼,下列代碼是創建DirectoryEntry類實例,並把此實例綁定到Windows NT服務提供程序:

private DirectoryEntry entryPC = new DirectoryEntry ( "WinNT:" ) ;

10. 以下面代碼替代系統產生的InitializeComponent過程,下列代碼的作用是初始化程序中的組件,並定義treeView1組件的DoubleClick事件:

private void InitializeComponent ( )
{
 this.treeView1 = new System.Windows.Forms.TreeView ( ) ;
 this.button1 = new System.Windows.Forms.Button ( ) ;
 this.SuspendLayout ( ) ;
 this.treeView1.ImageIndex = -1;
 this.treeView1.Location = new System.Drawing.Point ( 16 , 8 ) ;
 this.treeView1.Name = "treeView1" ;
 this.treeView1.SelectedImageIndex = -1 ;
 this.treeView1.Size = new System.Drawing.Size ( 316 , 302 ) ;
 this.treeView1.TabIndex = 0 ;
 this.treeView1.DoubleClick += new System.EventHandler ( this.treeView1_DoubleClick ) ;
 this.button1.Location = new System.Drawing.Point ( 118 , 324 ) ;
 this.button1.Name = "button1" ;
 this.button1.Size = new System.Drawing.Size ( 82 , 34 ) ;
 this.button1.TabIndex = 1 ;
 this.button1.Text = "獲取" ;
 this.button1.Click += new System.EventHandler ( this.button1_Click ) ;
 this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;
 this.ClientSize = new System.Drawing.Size ( 350 , 369 ) ;
 this.Controls.Add ( this.button1 ) ;
 this.Controls.Add ( this.treeView1 ) ;
 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle ;
 this.MaximizeBox = false ;
 this.Name = "Form1" ;
 this.Text = "Visual C#構建網絡計算機樹形圖" ;
 this.ResumeLayout ( false ) ;
}

至此【Visual C#構建網絡計算機樹形圖】項目的界面設計和功能實現的准備工作就完成了,設計後的界面如圖01所示:

圖01:【Visual C#構建網絡計算機樹形圖】項目的設計界面

11. 用下列代碼替換Form1.cs中的button1的Click事件對應的處理代碼,下列代碼讀取網絡中域或工作組,並加入到樹形圖中:

private void button1_Click ( object sender , System.EventArgs e )
{
 foreach ( DirectoryEntry child in entryPC.Children )
 {
  TreeNode node = new TreeNode ( ) ;
  node.Text = child.Name ;
  treeView1.Nodes.Add ( node ) ;
  //在treeView1組件中添加節點
 }
 //利用foreach語句實現對網絡域和工作組的遍歷,
 //並通過treeView1組件顯示出來
}

12. 在Form1.cs中的button1的Click代碼之後, 添加下列代碼,下列代碼的作用是定義treeView1的DoubleClick事件,在此事件中讀取選定域或工作組中對應的計算機主機:

private void treeView1_DoubleClick ( object sender , System.EventArgs e )
{
 if ( treeView1.SelectedNode!= null )
 {
  string s =treeView1.SelectedNode.Text ;
  treeView1.SelectedNode.Nodes.Clear ( ) ;
  DirectoryEntry temp= new DirectoryEntry ( ) ;
  temp.Path ="WinNT://" + s ;
  TreeNode node = treeView1.SelectedNode ;
  foreach ( DirectoryEntry pc in temp.Children )
  {
   if ( String.Compare ( pc.SchemaClassName ,"computer" ,true ) == 0 )
   //判斷此節點是否為計算機
   {
    TreeNode son = new TreeNode ( ) ;
    son.Text = pc.Name ;
    node.Nodes.Add ( son ) ;
   }
  }
 }
 treeView1.SelectedNode.Expand ( ) ;
 //展開treeView1選中的節點
}

13. 至此在上述步驟都正確完成後,【Visual C#構建網絡計算機樹形圖】項目的全部工作就基本完成了。此時單擊快捷鍵F5運行程序,單擊【讀取】按鈕,則程序會讀取網絡中的域或工作組,並通過treeView1組件顯示出來,此時再雙擊treeView1中的節點,則程序會讀取當前節點對應的域或工作組中的計算機,並顯示出來。圖02是【Visual C#構建網絡計算機樹形圖】項目的運行界面:

圖02:【Visual C#構建網絡計算機樹形圖】項目的運行界面

五.總結

Visual C#構建網絡計算機樹形圖其實是ADSI解決網絡問題的一個應用,Visual C#之所以能夠輕松、靈活的使用ADSI接口就是因為.Net FrameWork SDK中提供了可操作ADSI的類,靈活使用這些類庫的確能夠解決看似很煩雜的實際問題。當然本文介紹的網絡功能也存在一些弊端,譬如:網絡中的Windows 98及以下的計算機就無法訪問,從而也無法顯示在樹形圖中,這是因為Windows 98及以下計算機沒有安裝ADSI 2.5。並且此網絡功能只能構建簡單型的網絡樹形圖,如果網絡存在多個網段,那此網絡功能也只能構建運行此程序主機所在網段的樹形圖,如果此網絡還存在多個Vlan(虛擬子網),那此網絡功能也只能構建運行此程序主機所在網段及所在Vlan的網絡樹形圖。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved