获得局域网中计算机的列表(包括计算机名,IP和MAC)的方法(转) - Lcf
获得局域网中计算机的列表
需要引用的命名空间
获得本机的MAC地址
{
string strMac = string.Empty;
ManagementClass mc
= new ManagementClass(“Win32_NetworkAdapterConfiguration“);ManagementObjectCollection moc
= mc.GetInstances();foreach(ManagementObject mo in moc)
{
if ((bool)mo[“IPEnabled“] == true)
strMac
+= mo[“MacAddress“].ToString() ;
}
return strMac.ToUpper();
}
获得远程计算机的MAC地址
方法一:使用API,利用ARP协议,只能获得同网段计算机的MAC
private static extern int SendARP(Int32 dest,Int32 host,ref Int64 mac,ref Int32 length);
[DllImport(
“Ws2_32.dll“)]private static extern Int32 inet_addr(string ip);
public static string GetRemoteMac(string clientIP)
{
string ip = clientIP;
if ( ip == “127.0.0.1“)
ip
= GetLocalIP()[0];Int32 ldest
=inet_addr(ip);Int64 macinfo
=new Int64();Int32 len
=6;try
{
SendARP(ldest,
0,ref macinfo,ref len);}
catch
{
return “”;
}
string originalMACAddress = Convert.ToString(macinfo,16);
if (originalMACAddress.Length<12)
{
originalMACAddress
= originalMACAddress.PadLeft(12,\’0\’);}
string macAddress;
if(originalMACAddress!=“0000“ && originalMACAddress.Length==12)
{
string mac1,mac2,mac3,mac4,mac5,mac6;
mac1
=originalMACAddress.Substring(10,2);mac2
=originalMACAddress.Substring(8,2);mac3
=originalMACAddress.Substring(6,2);mac4
=originalMACAddress.Substring(4,2);mac5
=originalMACAddress.Substring(2,2);mac6
=originalMACAddress.Substring(0,2);macAddress
=mac1+“–“+mac2+“–“+mac3+“–“+mac4+“–“+mac5+“–“+mac6;}
else
{
macAddress
=“”;}
return macAddress.ToUpper();
}
方法二:使用windows的命令nbtstat
{
string ip = clientIP;
if ( ip == “127.0.0.1“)
ip
= GetLocalIP()[0];string dirResults=“”;
ProcessStartInfo psi
= new ProcessStartInfo();Process proc
= new Process();psi.FileName
= “nbtstat.exe“;//psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;psi.RedirectStandardError=true;
psi.Arguments
= “-A “ + ip;psi.UseShellExecute
= false;proc
= Process.Start(psi);dirResults
= proc.StandardOutput.ReadToEnd();string error = proc.StandardError.ReadToEnd();
proc.WaitForExit();
dirResults
=dirResults.Replace(“\r“,“”).Replace(“\n“,“”).Replace(“\t“,“”);
Regex reg
=new Regex(“Mac[ ]{0,}Address[ ]{0,}=[ ]{0,}(?((.)*?))__MAC“,RegexOptions.IgnoreCase|RegexOptions.Compiled);Match mc
=reg.Match(dirResults+“__MAC“);
if(mc.Success)
{
return mc.Groups[“key“].Value.ToUpper();
}
else
{
return “”;
}
}
使用此方法需要足够的操作系统的权限。在Web中,可以将ASP.net用户加入管理员组。
对于上面两个地方都用到的GetLocalIP是一个获取本机IP的方法:
{
string hostName = Dns.GetHostName();
IPHostEntry ipEntry
=Dns.GetHostByName(hostName);IPAddress[] arr
=ipEntry.AddressList;string[] result = new string[arr.Length];
for(int i=0;i {
result[i]
= arr[i].ToString();}
return result;
}
获得局域网内计算机的列表
方法一:使用逐个IP地址扫描的方式
利用多线程来对每个IP逐个扫描。
Thread thScan
= new Thread(new ThreadStart(cai.ScanComputers));thScan.Start();
//public class ComputerAddressInfo
{
private int startIP = 0;
private int endIP = 0;
private string ipPrefix = “”;
private ArrayList computerList = null;
public ComputerAddressInfo(string ipPrefix,int startIP,int endIP)
{
this.startIP = startIP;
this.endIP = endIP;
this.ipPrefix = ipPrefix;
computerList
= new ArrayList();}
public void ScanComputers()
{
for(int i=startIP;i<=endIP;i++)
{
string scanIP = ipPrefix +“.“+i.ToString();
IPAddress myScanIP
= IPAddress.Parse(scanIP);IPHostEntry myScanHost
= null;string[] arr = new string[2];
try
{
myScanHost
= Dns.GetHostByAddress(myScanIP);}
catch
{
continue;
}
if (myScanHost != null)
{
arr[
0] = myScanHost.HostName;arr[
1] = scanIP;computerList.Add(arr);
}
}
}
}
此方法速度比较慢。
方法二:使用Active Directory
{
ArrayList list
= new ArrayList();//or use “WinNT://your_domain_name”
DirectoryEntry root = new DirectoryEntry(“WinNT:“);
DirectoryEntries domains
= root.Children;domains.SchemaFilter.Add(
“domain“);foreach (DirectoryEntry domain in domains)
{
DirectoryEntries computers
= domain.Children;computers.SchemaFilter.Add(
“computer“);foreach (DirectoryEntry computer in computers)
{
object[] arr = new string[3];
IPHostEntry iphe
= null;try
{
iphe
= Dns.GetHostByName(computer.Name);}
catch
{
continue;
}
arr[
0] = domain.Name;arr[
1] = computer.Name;if ( iphe != null && iphe.AddressList.Length >0 )
{
for ( int i=0;i arr[2] += iphe.AddressList[i].ToString()+“,“;
arr[
2] = arr[2].ToString().Remove(arr[2].ToString().Length–1,1);}
else
arr[
2] = “”;list.Add(arr);
}
}
return list;
}
此方法速度也比较慢。
后记
上面两个获得局域网内的计算机列表的方法都很费时,目前还没有找到更好的办法。