跨网段,如何获取客户端的MAC地址!求助!

ftart 2010-08-07 09:51:07
在登录系统时,希望可以获取到客户端的MAC地址,保留到数据库中。 同网段的MAC地址可以获取到,但一旦跨网段或走一下路由就无法获取到MAC地址。郁闷中。。小弟新手,求解。。。。。
...全文
846 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ab_study_c 2012-05-15
  • 打赏
  • 举报
回复
大家解决了没有,我也正需要获取跨网段的MAC,不知有什么好的方法?
xinda2005 2011-09-09
  • 打赏
  • 举报
回复
有解决的办法吗?现在正在找这解决方案,楼主解决的话,记得分享下啊!谢谢!
myhope88 2010-08-07
  • 打赏
  • 举报
回复
我也是遇到同样问题,楼主解决了,记得分享下啊
ftart 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zmcici 的回复:]
读取网卡地址
using System.Management;

string strMac = string.Empty;
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances(……
[/Quote]

问下 ManagementClass 这个类是???
没找到。
骑猪看海 2010-08-07
  • 打赏
  • 举报
回复
读取网卡地址
using System.Management;

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() + "";
}
}
Label1.Text = strMac;
ftart 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wisdonlz 的回复:]
这个够详细吧


//获取远程客户端的网卡物理地址(MAC)
public string GetMac(string IP) //para IP is the client's IP
{
string dirResults = "";
ProcessStartInfo psi = new ProcessStartInfo();
Process proc = new Process();
psi.FileName = "nbtstat";
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.Arguments = "-A " + IP;
psi.UseShellExecute = false;
proc = Process.Start(psi);
dirResults = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
dirResults = dirResults.Replace("\r", "").Replace("\n", "").Replace("\t", "");

Regex reg = new Regex("Mac[ ]{0,}Address[ ]{0,}=[ ]{0,}(?<key>((.)*?))__MAC", RegexOptions.IgnoreCase | RegexOptions.Compiled);
Match mc = reg.Match(dirResults + "__MAC");

if (mc.Success)
{
return mc.Groups["key"].Value;
}
else
{
reg = new Regex("Host not found", RegexOptions.IgnoreCase | RegexOptions.Compiled);
mc = reg.Match(dirResults);
if (mc.Success)
{
return "Host not found!";
}
else
{
return "";
}
}
}

[/Quote]

这个返回的是空值呀。我原先就是用这个方法。比如说服务器是在172.*.*.* ;但客户端是通过路由连接的,他的IP是192.*.*.* 这样就取不到了。


网上的那些代码是只能去的本网段的MAC地址。跨网段就不行了。
wisdonlz 2010-08-07
  • 打赏
  • 举报
回复
这个够详细吧

protected void Page_Load(object sender, EventArgs e)
{
//ReadMSG();

if (!IsPostBack)
{
Label1.Text =
"//客户端ip:" +

Request.ServerVariables.Get("Remote_Addr").ToString() + "<br>" +
" //客户端主机名:" +
Request.ServerVariables.Get("Remote_Host").ToString() + "<br>" +
"//客户端浏览器IE:" +
Request.Browser.Browser + "<br>" +
"//客户端浏览器 版本号:" +
Request.Browser.MajorVersion + "<br>" +
"//客户端操作系统:" +
Request.Browser.Platform + "<br>" +
"//服务器ip:" +
Request.ServerVariables.Get("Local_Addr").ToString() + "<br>" +
"//服务器名:" +
Request.ServerVariables.Get("Server_Name").ToString() + "<br>";

string stringMAC = "";
string stringIP = "";
ManagementClass MC = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection MOC = MC.GetInstances();

foreach (ManagementObject MO in MOC)
{
if ((bool)MO["IPEnabled"] == true)
{
stringMAC += MO["MACAddress"].ToString(); //获取网卡的地址
string[] IPAddresses = (string[])MO["IPAddress"]; //获取本地的IP地址
if (IPAddresses.Length > 0)
stringIP = IPAddresses[0];
Label1.Text += "<br>MAC:" + stringMAC + "/ IP:" + stringIP;
if (stringIP == "192.168.1.45")
Label1.Text += "<br>I get you :192.168.1.45<br>";
}
}


//在页面上打印出客户端的网卡物理地址(MAC)
//Response.Write(this.GetMac(Request.UserHostAddress.ToString())+"<br>");
GetInfo();
}
}
//获取cpu序列号,硬盘ID,网卡MAC地址
private void GetInfo()
{
string cpuInfo = "";//cpu序列号
ManagementClass cimobject = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = cimobject.GetInstances();
foreach (ManagementObject mo in moc)
{
cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
Label1.Text += "cpu序列号:" + cpuInfo.ToString();
}

//获取硬盘ID
String HDid;
ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
ManagementObjectCollection moc1 = cimobject1.GetInstances();
foreach (ManagementObject mo in moc1)
{
HDid = (string)mo.Properties["Model"].Value;
Label1.Text += "硬盘序列号:" + HDid.ToString();
}

}

//protected void Button1_Click(object sender, EventArgs e)
//{

// try
// {
// File.Delete(@"D:\html.html");
// }
// catch (Exception e2)
// {
// Response.Write(e2.Message);
// }
// Response.Write("Delete Successed!");

//}



//获取远程客户端的网卡物理地址(MAC)
public string GetMac(string IP) //para IP is the client's IP
{
string dirResults = "";
ProcessStartInfo psi = new ProcessStartInfo();
Process proc = new Process();
psi.FileName = "nbtstat";
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.Arguments = "-A " + IP;
psi.UseShellExecute = false;
proc = Process.Start(psi);
dirResults = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
dirResults = dirResults.Replace("\r", "").Replace("\n", "").Replace("\t", "");

Regex reg = new Regex("Mac[ ]{0,}Address[ ]{0,}=[ ]{0,}(?<key>((.)*?))__MAC", RegexOptions.IgnoreCase | RegexOptions.Compiled);
Match mc = reg.Match(dirResults + "__MAC");

if (mc.Success)
{
return mc.Groups["key"].Value;
}
else
{
reg = new Regex("Host not found", RegexOptions.IgnoreCase | RegexOptions.Compiled);
mc = reg.Match(dirResults);
if (mc.Success)
{
return "Host not found!";
}
else
{
return "";
}
}
}



cyljay 2010-08-07
  • 打赏
  • 举报
回复
去收一下,网上有很多现成的方法。
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kkbac 的回复:]
取不到浏览者的mac地址吧.
要么通过flash看看能实现不?
[/Quote]

按理说,如果flash有这个功能,那么这就是个漏洞。对于silverlight也是一样。

当然这要看具体怎样实现。例如silverlight当切换为桌面应用程序模式时,客户端要弹出严重的警告,而且也要客户确认了才可以切换。
  • 打赏
  • 举报
回复
internet是不传递MAC的,只传递IP。即使是IP,也只是NAT路由器映射的地址和(临时)端口,而不是内网客户机的。

除非客户机部署有你的本地程序。
kkbac 2010-08-07
  • 打赏
  • 举报
回复
取不到浏览者的mac地址吧.
要么通过flash看看能实现不?
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ftart 的回复:]
引用 4 楼 zmcici 的回复:
读取网卡地址
using System.Management;

string strMac = string.Empty;
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = ……
[/Quote]

不用问。取本地MAC地址,跟你的毫无关系。
lcomplete 2010-08-07
  • 打赏
  • 举报
回复
huiaccp 2010-08-07
  • 打赏
  • 举报
回复
有点黑客味道
wwfgu00ing 2010-08-07
  • 打赏
  • 举报
回复
学习了

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧