• 利用DirectoryEntry组件来查看网络,显示域用户的列表


     


    摘要

    System.DirectoryServices.DirectoryEntry组件提供了对Active Directory的访问。本文以两个简单的小程序为例,阐述了如何利用此组件查看网络的各节点的信息。


    目录

    问题的提出

    问题的初步解决

    改进后的Windows Forms方案

    总结

    参考文献

    附注

    作者


    问题的提出

    刚接触.Net网络编程的时候,我常想,有没有办法列出局域网中的所有计算机呢?直到最近看了MSDN中关于DirectoryEntry 类的介绍,这才找到了答案。


    问题的初步解决

    DirectoryEntry组件提供了Path属性,根据文档,此属性指定了目录服务中用来访问对象的对象名,其格式如下:

    protocol://servername:port number/distinguished name

    此语句的第一部分定义了访问将使用的协议,如

    LDAP: (Lightweight Directory Access Protocol)

    IIS: (提供IIS元数据来读及配置Internet Infomation Server)

    WinNT: (提供在非常有限的性能下对Windows NT域的访问)

    NDS: (提供对Novell Directory Service的访问)

    等等(详细信息清参考MSDN)。

    据此,我们构造了一个DirectoryEntry实例,将它的Path设为"WinNT:",以通过对它的所有子项的枚举来发现网络上的所有域(以及工作组)。这样,再对所发现的域(以及工作组)的子项进行枚举,就可以发现网络上的所有计算机。下面的一个控制台小程序演示了这一点。

    using System;
    using System.DirectoryServices;
    
    class TempClass
    {
    	static void Main()
    	{
    		EnumComputers();
    	}
    
    	static void EnumComputers()
    	{
    		using(DirectoryEntry root = new DirectoryEntry("WinNT:"))
    		{
    			foreach(DirectoryEntry domain in root.Children)
    			{
    				Console.WriteLine("Domain | WorkGroup:\t"+domain.Name);
    				foreach(DirectoryEntry computer in domain.Children)
    				{
    					Console.WriteLine("Computer:\t"+computer.Name);
    				}
    			}
    		}
    	}
    }
    

    改进后的Windows Forms方案

    上面代码中两个嵌套的foreach循环看起来并不是太好,并且控制台的显示效果也并不那么美观。下面,我将对代码进行一些改动,并将它移植到WinForm上。

    新建一个Windows Application[C#],在Form上添加一个TreeView,命名为treeView1。

    添加以下几个函数:

    //用指定的文本构造一个节点,将其添加为参数parant的子节点,并返回刚构造的节点
    private TreeNode AddNode(TreeNode parant,string text)
    {
    	TreeNode node = new TreeNode(text);
    	parant.Nodes.Add(node);
    	return node;
    }
    
    //递归地找到参数entry的所有子节点,并在treeView1中显示;这里的entry与entryNode需相对应
    private void EnumChildren(DirectoryEntry entry,TreeNode entryNode)
    {
    	if(entry.Children!=null)		//如果无子节点则结束
    	{
    		foreach(DirectoryEntry i in entry.Children)
    		{
    			//将各子节点加入TreeView,并进行递归
    			EnumChildren(i,AddNode(entryNode,i.Name));
    		}
    	}
    }
    
    //用给定的字符串构造根节点,并列出其所有子节点
    private void Enumerate(string path)
    {
    	try 
    	{
    		using(DirectoryEntry root = new DirectoryEntry(path))
    		{
    			TreeNode node = new TreeNode(root.Name);
    			treeView1.Nodes.Add(node);
    			EnumChildren(root,node);
    		}
    	}
    	catch {}
    }
    

    这样,通过传递 "WinNT:" 给函数Enumerate(string),就可以在TreeView中看到网络上的所有计算机,以及每台计算机上的用户、组、服务等资源,效果如图:


    总结

    本文主要介绍了用DirectoryEntry组件来浏览网络中的各节点计算机的信息,实际上,DirectoryEntry组件功能强大,例如将"IIS:"作为DirectoryEntry的Path属性,就可以列出域中运行着IIS(Internet Infomation Server)的服务器,并可获得IIS元数据等属性;此外,还可以用它来对网络进行远程管理与配置,有兴趣者不妨一试。


    参考文献

    Windows Forms 高级编程 Wrox Press,清华大学出版社

  • 相关阅读:
    centos7安装mysql5.7
    centos7 多网卡绑定bond0 之mod4
    二、Windows Server 2016 AD 组织单位、组、用户的创建
    一、Windows Server 2016 AD服务器搭建
    (2)Linux中经常说的CPU上下文切换是什么意思
    (1)Linux系统中到底应该怎么理解系统的平均负载
    centos安装Docker与使用&&构建业务镜像挂载卷harbor仓库的高可用及网络模式和资源限制介绍
    windows和linux各类服务常用端口号汇总
    CentOS7.6搭建LAMP-wordpress论坛搭建
    centos下iptables防火墙规则用法和概述
  • 原文地址:https://www.cnblogs.com/binaryworms/p/1694608.html
Copyright © 2020-2023  润新知