怎样获得局域网内处于开机状态的计算机的用户名? 我想在某个时间,获得局域网内,没有关机的计算机的IP地址,和计算机的用户名 局域网IP不是固定ip而是通过DHCP服务自动获取的IP 麻烦大大们帮忙解决一下啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://topic.csdn.net/t/20040921/08/3392857.html 下面测试过了,是从本机的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); } 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); } } 麻烦楼上DirectoryEntry 我该添加什么引用啊 忽然发现我的函数没写 return....我汗 用 Ping Cherishny的方法已经能够实现我的功能了,我再调试一下他的方法里面,能获得现在网内开机的计算机名,没有获取IP,我试试能不能把IP给加进去完事之后就过来结贴 return到是一个小问题,加上就可以了,但是你传入的参数的IP地址需要怎么写?2进制的IP地址? 解决顺便问一下8楼的兄弟,你的这个方法,能获取到PC的IP地址么?我没找到 给你写了个获取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"); } } } } 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(); } } 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(); } } 对,你前面给的那个方法,我试过了,是正确的,但是对整个网段内的每个IP进行try,这样速度太慢了你下面的这个方法,只有运行程序的计算机的IP是局域网的IP,其他的都是一样的广域网的那个IP 汗.....你们局域网的机子有独立的公网IP的啊?.....那个方法是在本机的 dns 表里面去获取的各个电脑IP,如果你们之间的连接是通过广域网的,那么就是记录广域网IP了..也许可以有其他办法来实现而且后面的这个方法比前面的方法速度更慢,因为是用try 的异常控制实现的,速度比.NET的ping类实现更慢但是后面的通过工作组来遍历局域网电脑的办法只能获取 pc 的 name ,也许可以通过调用windows API来达到更快的探测效率 我前面写的那个遍历IP探测的代码段,你可以自己改写成多线程的,那样速度就绝对上来了各个IP的探测是独立的,你维持100个线程的话,应该几轮就搞定了 我通过各种查询,得到的结果基本都是回帖里面给的方法,我们的局域网是通过DHCP服务获取的局域网IP所有机器连接到一个路由上面的,不知道为啥获取到的确实相同的一个广域网IP,郁闷了我再去查找一下其他的方法吧结贴了 xml-rpc WordPress离线发布文章的问题 WCF 问题 原来机上有一套.net系统 但重装系统后,出现好多错误。!! sqlAdapter和 sqlcommand 遍例所有textbox页面,取得该值,怎么出错呢.. 100分求助 HttpWebResponse 返回的Headers内location带有中文的编码问题 .NET中TextBox的应用问,请高手赐教。 怎样吃掉输入到RichTextBox的某个字符。 DropDownList控件问题?高分求助! 怎么样获取打印机最小的边距,急!!! 谁能给解释一下,这是怎么回事? C#静态数组使用的一个问题
如果你想获取实时的信息的话,可以自己写包探测 /// <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);
}
{
//取工作组
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);
}
}
他的方法里面,能获得现在网内开机的计算机名,没有获取IP,我试试能不能把IP给加进去
完事之后就过来结贴
return到是一个小问题,加上就可以了,但是你传入的参数的IP地址需要怎么写?2进制的IP地址?
解决顺便问一下8楼的兄弟,你的这个方法,能获取到PC的IP地址么?我没找到
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");
}
}
}
}
{
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(); } }
{
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(); } }
对,你前面给的那个方法,我试过了,是正确的,但是对整个网段内的每个IP进行try,这样速度太慢了你下面的这个方法,只有运行程序的计算机的IP是局域网的IP,其他的都是一样的广域网的那个IP
你们局域网的机子有独立的公网IP的啊?.....那个方法是在本机的 dns 表里面去获取的各个电脑IP,如果你们之间的连接是通过广域网的,那么就是记录广域网IP了..也许可以有其他办法来实现而且后面的这个方法比前面的方法速度更慢,因为是用try 的异常控制实现的,速度比.NET的ping类实现更慢
但是后面的通过工作组来遍历局域网电脑的办法只能获取 pc 的 name ,也许可以通过调用windows API来达到更快的探测效率
各个IP的探测是独立的,你维持100个线程的话,应该几轮就搞定了
所有机器连接到一个路由上面的,不知道为啥获取到的确实相同的一个广域网IP,郁闷了
我再去查找一下其他的方法吧
结贴了