我想在某个时间,获得局域网内,没有关机的计算机的IP地址,和计算机的用户名 
局域网IP不是固定ip而是通过DHCP服务自动获取的IP 
麻烦大大们帮忙解决一下啊

解决方案 »

  1.   

    http://topic.csdn.net/t/20040921/08/3392857.html
      

  2.   

    下面测试过了,是从本机的DNS里获取信息的
    如果你想获取实时的信息的话,可以自己写包探测       /// <summary>
            /// 获取IP段中的活动IP列表
            /// </summary>
            /// <param name="startIP">开始IP</param>
            /// <param name="endIP">结束IP</param>
            /// <returns></returns>
            private List<IPAddress> GetLiveIP(IPAddress startIP, IPAddress endIP)
            {
                List<IPAddress> ipList = new List<IPAddress>();
                IPAddress currentIP = new IPAddress(startIP.Address);
                currentIP = startIP;
                while (currentIP.Address <= endIP.Address)
                {
                    try
                    {
                        IPHostEntry host = Dns.GetHostByAddress(currentIP);
                        ipList.Add(currentIP);
                        //richTextBox1.AppendText("host: " + host.HostName + "IPAddress: " + host.AddressList[0].ToString() + "\n");
                    }
                    catch
                    {
                        //richTextBox1.AppendText(currentIP + " Host not found\n");
                    }
                    currentIP = NextIP(currentIP);
                }
            }
            /// <summary>
            /// 从一个IPAddress 获取它的下一个 IPAddress
            /// </summary>
            /// <param name="theIP">IPAddress</param>
            /// <returns></returns>
            private IPAddress NextIP(IPAddress theIP)
            {
                uint startuint = (uint)IPAddress.NetworkToHostOrder((int)theIP.Address);            long NetWorklong = (long)IPAddress.HostToNetworkOrder((int)(startuint + 1));            return new IPAddress(NetWorklong);
            }
      

  3.   

     using(DirectoryEntry   root=new   DirectoryEntry("WinNT:"))   
      {   
               //取工作组   
      foreach(DirectoryEntry   domain   in   root.Children)   
      {   
      lb_pcName.Items.Add("==="+domain.Name+"===");   
                        //取工作组内的计算机   
      foreach(DirectoryEntry   pc   in   domain.Children)   
      {   
      if(pc.Name!="Schema")   
                                  //End   of   Schema   
                                  //将获取的计算机加入列表   
      lb_pcName.Items.Add("   "+pc.Name);   
      }   
      }   
      

  4.   

    麻烦楼上DirectoryEntry  我该添加什么引用啊
      

  5.   

    忽然发现我的函数没写 return....我汗
      

  6.   

    用 Ping
      

  7.   

    Cherishny的方法已经能够实现我的功能了,我再调试一下
    他的方法里面,能获得现在网内开机的计算机名,没有获取IP,我试试能不能把IP给加进去
    完事之后就过来结贴
      

  8.   


    return到是一个小问题,加上就可以了,但是你传入的参数的IP地址需要怎么写?2进制的IP地址?
      

  9.   


    解决顺便问一下8楼的兄弟,你的这个方法,能获取到PC的IP地址么?我没找到
      

  10.   

    给你写了个获取IP的, 我前面那个传入的是IPAddress对象啊
                using (DirectoryEntry root = new DirectoryEntry("WinNT:"))
                {
                    //取工作组
                    foreach (DirectoryEntry domain in root.Children)
                    {
                        richTextBox1.AppendText("===" + domain.Name + "===\n");
                        //取工作组内的计算机  
                        foreach (DirectoryEntry pc in domain.Children)
                        {
                            if (pc.Name != "Schema")
                            //将获取的计算机加入列表  
                            {
                                richTextBox1.AppendText(" ----> " + pc.Name + "  UserName:" + pc.Username + "\n");
                            }
                            try
                            {
                                IPHostEntry host = System.Net.Dns.GetHostByName(pc.Name);
                                foreach (IPAddress ipadd in host.AddressList)
                                {
                                    richTextBox1.AppendText("                   IP: " + ipadd.ToString() + "\n");
                                }
                            }
                            catch
                            {
                                richTextBox1.AppendText("                     此主机尚未联入网络!:\n");
                            }
                        }
                    }
                }
      

  11.   

    class Program
        {
            static void Main(string[] args)
            {
                using (DirectoryEntry root = new DirectoryEntry("WinNT:"))
                {
                    //取工作组
                    foreach (DirectoryEntry domain in root.Children)
                    {
                        Console.WriteLine("===" + domain.Name + "===\n");
                        //取工作组内的计算机  
                        foreach (DirectoryEntry pc in domain.Children)
                        {
                            if (pc.Name != "Schema")
                            //将获取的计算机加入列表  
                            {
                                Console.WriteLine(" ----> " + pc.Name + "  UserName:" + pc.Username + "\n");
                            }
                            try
                            {
                                IPHostEntry host = System.Net.Dns.GetHostByName(pc.Name);
                                foreach (IPAddress ipadd in host.AddressList)
                                {
                                    Console.WriteLine("                   IP: " + ipadd.ToString() + "\n");
                                }
                            }
                            catch
                            {
                                Console.WriteLine("                     此主机尚未联入网络!:\n");
                            }
                        }
                    }
                }
                Console.ReadLine();        }    }
      

  12.   

    class Program
        {
            static void Main(string[] args)
            {
                using (DirectoryEntry root = new DirectoryEntry("WinNT:"))
                {
                    //取工作组
                    foreach (DirectoryEntry domain in root.Children)
                    {
                        Console.WriteLine("===" + domain.Name + "===\n");
                        //取工作组内的计算机  
                        foreach (DirectoryEntry pc in domain.Children)
                        {
                            if (pc.Name != "Schema")
                            //将获取的计算机加入列表  
                            {
                                Console.WriteLine(" ----> " + pc.Name + "  UserName:" + pc.Username + "\n");
                            }
                            try
                            {
                                IPHostEntry host = System.Net.Dns.GetHostByName(pc.Name);
                                foreach (IPAddress ipadd in host.AddressList)
                                {
                                    Console.WriteLine("                   IP: " + ipadd.ToString() + "\n");
                                }
                            }
                            catch
                            {
                                Console.WriteLine("                     此主机尚未联入网络!:\n");
                            }
                        }
                    }
                }
                Console.ReadLine();        }    }
      

  13.   


    对,你前面给的那个方法,我试过了,是正确的,但是对整个网段内的每个IP进行try,这样速度太慢了你下面的这个方法,只有运行程序的计算机的IP是局域网的IP,其他的都是一样的广域网的那个IP
      

  14.   

    汗.....
    你们局域网的机子有独立的公网IP的啊?.....那个方法是在本机的 dns 表里面去获取的各个电脑IP,如果你们之间的连接是通过广域网的,那么就是记录广域网IP了..也许可以有其他办法来实现而且后面的这个方法比前面的方法速度更慢,因为是用try 的异常控制实现的,速度比.NET的ping类实现更慢
    但是后面的通过工作组来遍历局域网电脑的办法只能获取 pc 的 name ,也许可以通过调用windows API来达到更快的探测效率
      

  15.   

    我前面写的那个遍历IP探测的代码段,你可以自己改写成多线程的,那样速度就绝对上来了
    各个IP的探测是独立的,你维持100个线程的话,应该几轮就搞定了
      

  16.   

    我通过各种查询,得到的结果基本都是回帖里面给的方法,我们的局域网是通过DHCP服务获取的局域网IP
    所有机器连接到一个路由上面的,不知道为啥获取到的确实相同的一个广域网IP,郁闷了
    我再去查找一下其他的方法吧
    结贴了