有的时候需要根据MAC来限定登录的计算机,为此查找了不少资料(有来自博客堂和CSDN),下面是获得远程计算机的MAC和局域网中计算机列表的方法。
需要引用的命名空间
using System;
using System.Collections;
using System.Diagnostics;
using System.Management;
using System.Net;
using System.DirectoryServices;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
获得本机的MAC地址
public static string GetLocalMac()
{
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
[DllImport("Iphlpapi.dll")]
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
public static string GetRemoteMacByNetBIOS(string clientIP)
{
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的方法:
public static string[] GetLocalIP()
{
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逐个扫描。
ComputerAddressInfo cai = new ComputerAddressInfo("192.168.1",42,53);
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
public static ArrayList GetComputerList()
{
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;
}
此方法速度也比较慢。
后记
上面两个获得局域网内的计算机列表的方法都很费时,目前还没有找到更好的办法。
分享到:
相关推荐
获得局域网中计算机的列表(包括计算机名,ip和mac)的方法.rar
批处理bat实现扫描局域网所有机器IP、MAC地址和计算机名
C#实现获取局域网内所有计算机的IP地址和MAC地址的控制台应用程序源码 程序启动时首先获取本机的IP和MAC地址; 然后获取局域网内所有计算机的IP地址; 输入IP地址回车,获取该IP的MAC地址; 输入“STARTSCAN”回车...
易语言源码取局域网内的所有计算机名、IP、网卡地址.zip
批处理bat实现扫描局域网所有机器IP、MAC地址和计算机名.bat
delphi扫描局域网IP和计算机名称&网卡MAC码
VC++枚举局域网内计算机IP和NAME MAC地址的还未实现
局域网扫描器 包括IP+Mac+计算机名
易语言取局域网内的所有计算机信息。@易语言入门教程。
简单初级的局域网IP扫描工具及源码,由VS2010编写,可用于局域网IP扫描和对应IP计算机名扫描。
扫描局域网IP和计算机名称&网卡MAC码1、采用向计算机137端口发数据包(UDP包)2、采用线程方式3、优点,速度极快
vc 网络扫描 获取局域网中电脑的IP、MAC、用户名
用C#设计程序,通过该代码可以获取本机的IP ,mac,主机名,用户名,子网掩码,默认网关,也可以获得局域网所有电脑的IP ,主机名
c#学习获取本地计算机信息的方法,仅供参考
C# 通过计算机名获取IP地址、MAC 获取本机MAC地址、计算机名、IP地址 DNS GetHost
网络维护必备,求热心值,可查看局域网IP,计算机名,MAC,工作组,操作系统。
局域网扫描查看工具!检索维修网络必备! 可一键扫描查看局域网内所有ip设备信息,(包括计算机名,操作系统,IP地址,MAC地址
扫描局域网内ip地址和mac地址的对应关系
版本历史 1.6 修改当时间为 9:08:01时,不能正确计算耗费时间的问题 1.5 汉化ping的结果 1.3 去掉配置文件中保存的结果文件名 1.4 保留备份结果文件的功能 1.2 把默认文件名改为"IP年月日时分秒.txt...
绝对好用的局域网扫描器,速度快,信息详细。包括ip,以及对应的计算机名,mac地址,工作组