ASP.NET获取IP与MAC[using C#]

获取服务器的IP地址方法以DNS法较为简单实用,如下:
  using System.Net;

 

 private void ButtonIP_Click(object sender, System.EventArgs e)
  { 
     System.Net.IPAddress[] addressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;
     if ( addressList.Length>1)
     {  
TextLIP.Text = addressList[0].ToString();
          
TextSIP.Text = addressList[1].ToString();
     }
     else
     {
          
TextLIP.Text = addressList[0].ToString();
         
TextSIP.Text = "没有可用的连接";
     }
  }

获取服务器的IP地址与MAC地址另一方法如下:

   using System.Management;

 

   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();
     
TextMAC.Text = stringMAC.ToString();
     string[] IPAddresses = (string[])
MO["IPAddress"];
     if(IPAddresses.Length > 0)
     
stringIP = IPAddresses[0];
     
TextIP.Text = stringIP.ToString();
    }
   } 

 

获取客户端本机的IP地址相当简易,方法如下:

using System.Net;

 

TextIP.Text=Page.Request.UserHostAddress;

如要获取客户端本机的MAC地址就相对复杂些,得导入调用两个API,用ARP协议获取,但这样只能获取到同网段机器的MAC,对于跨网段的得利用IP扫描或cmdnbtstat命令获取MAC地址。也可通过读取系统注册表值或WMI的数据库来获取。各位如有简易可行的好办法请留言告诉我。

 

posted on 2005-04-20 18:42 Zeus 阅读(8870) 评论(33)  编辑 收藏 网摘

评论

#1楼  2005-04-20 20:04 听棠.NET      

要是机器没装网卡,那么这个值是什么??
用这个MAC可以做什么判断吗?   回复  引用  查看    

#2楼  2005-04-20 20:44 montaque      

晕,还可以获得客户端的mac.要么用activex,其他根本不可能.   回复  引用  查看    

#3楼  2005-04-20 20:57 XiaoHui [未注册用户]

关注.

在CS的Roadmap中就提到了根据MAC封锁帐号.
http://www.communityserver.org/forums/468121/ShowPost.aspx   回复  引用    

#4楼  2005-04-20 23:01 Zeus      

要是机器没装网卡,那么这个值是空的,因为string初始值为空啊;
请注意下面做了if ((bool)MO["IPEnabled"] == true) 的判断,如果没有网卡当然还是保持上面的初始值了。   回复  引用  查看    

#5楼  2005-04-20 23:06 Zeus      

当然可以获得客户端的MAC了,而且不用ActiveX,只不过一般而言获得本网段内的比较容易,有疑问吗?要么我去写个代码贴上来?
hehe,nothing is impossible:)   回复  引用  查看    

#6楼  2005-04-21 01:57 mikespook      

通过ARP获得远程机器的MAC是可行的,不过有个问题,ARP无法穿透无ARP代理的网关~~~而好象现在搭建网关,很少有配置ARP代理的~~~~

应该说不是获得本网段比较容易,而是只能获得在同一个网关内的~~~
别说跨网段了,就是中间有不带ARP转发的桥接设备也不行啊~~~   回复  引用  查看    

#7楼  2005-04-21 06:51 Zeus      

兄弟言之有理,等下今天我用检索WMI库的方法试试跨网段的行不行,稍候贴代码上来。   回复  引用  查看    

#8楼  2005-04-21 06:55 Zeus      

在CS的Roadmap中就提到了根据MAC封锁帐号那个我刚看了,呵呵,深感水平不足啊,自己还在摸索中的人家老外已经应用于实践了啊。   回复  引用  查看    

#9楼  2005-04-25 01:26 XiaoHui [未注册用户]

期待下文... :)   回复  引用    

#10楼  2005-04-25 09:21 Zeus      

使用WMI数据库的类查询MAC可以找到系统中安装的每一个网络接口,并显示返回的IP和MAC信息,这种方法得到的IP/MAC信息应该是与从本机注册表中得到的是相同的.可以远程获取IP/SUBNET/MAC等信息,试过了可以.

using System;
using System.Management;

class WMIqueryIPMAC
{
public static void Main()
{
ManagementObjectSearcher query = new
ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'") ;
ManagementObjectCollection queryCollection = query.Get();
foreach( ManagementObject MO in queryCollection )
{
string[] addresses = (string[])MO["IPAddress"];
string[] subnets = (string[])MO["IPSubnet"];
string[] defaultgateways = (string[])MO["DefaultIPGateway"];

Console.WriteLine("Network Card: {0}", MO["Description"]);
Console.WriteLine("MAC Address: {0}", MO["MACAddress"]);

foreach(string ipaddress in addresses)
{
Console.WriteLine("IP Address: {0}", ipaddress);
}
foreach(string subnet in subnets)
{
Console.WriteLine("Subnet Mask: {0}", subnet);
}
foreach(string defaultgateway in defaultgateways)
{
Console.WriteLine("Gateway: {0}", defaultgateway);
}
}
}
}   回复  引用  查看    

#11楼  2005-09-03 14:30 lizicheng [未注册用户]

这个代码的确可以获取电脑网卡mac
但是如何用在asp.net 的网页里并保存到数据库里啊
我急啊,请Q我 346689577
万分感谢!!
  回复  引用    

#12楼  2005-09-03 21:43 lizicheng [未注册用户]

这个东东搞成exe文件是可以的,但就保存不到数据库里了!怎么办啊,搞到asp.net文件里根本就不行啊!!   回复  引用    

#13楼  2005-09-04 01:06 Zeus [未注册用户]

泛滥流传的这段试了吗?行不行?
using System.Text.RegularExpressions;
using System.Diagnostics;
public class test
{
public test
{}
public static string GetCustomerMac(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,}(?((.)*?))__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 "";
}
}
}
}

  回复  引用    

#14楼  2005-09-04 01:10 Zeus [未注册用户]

我那个也可以作为服务或在Diagnostics的ProcessStart下运行啊,如果你要asp的,可以用下面的:
<%
dim remoteaddr
if Request.ServerVariables("HTTP_X_FORWARDED_FOR")=empty then
remoteaddr=Request.ServerVariables("REMOTE_ADDR")
else
remoteaddr=Request.ServerVariables("HTTP_X_FORWARDED_FOR")
end if

Response.Write(GetMac(remoteaddr))
'由于读取某IP的网卡MAC地址
'本程序通过调用arp命令通过查询本机arp表读取特定IP的MAC地址
'使用本程序需注意以下事项:
' 本程序需要“WSCRIPT.SHELL”和“Scripting.FileSystemObject”两个组件,请确保您的服务器可以正常使用这两个组件
' 本程序需要调用cmd.exe程序,请确保IIS来宾帐号对程序有访问权限。
' 本程序需要临时文件保存结果,请确保IIS来宾帐号对临时目录有写权限。
'
function GetMac(IP)
On Error Resume Next
Dim oScript
Dim oFileSys, oFile
Dim All, szTempFile,ipc,phyc,typec
Dim TempPath
Set oScript = Server.CreateObject("WSCRIPT.SHELL")
Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")
TempPath="d:\temp\" '临时目录
szTempFile = TempPath & oFileSys.GetTempName() ' 获取临时文件名
Call oScript.Run ("cmd.exe /c ping -n 2 " & IP, 0, True) '保证arp表中有此IP
Call oScript.Run ("cmd.exe /c arp -a " & IP & " > " & szTempFile, 0, True)
Set oFile = oFileSys.OpenTextFile (szTempFile, 1, False, 0)
All=oFile.ReadAll()
oFile.Close
If (IsObject(oFile)) Then
Call oFileSys.DeleteFile(szTempFile, True)
End If
arr = Split(All, vbCrLf)
If UBound(arr) = 4 Then
ipc = InStr(1, arr(2), "Internet Address")
phyc = InStr(1, arr(2), "Physical Address")
typec = InStr(1, arr(2), "Type")
If typec > phyc And phyc > ipc And ipc > 0 Then
GetMac=Ucase(Trim(CStr(Mid(arr(3), phyc, typec - phyc))))
End If
End If
End function
%>
  回复  引用    

#15楼  2005-09-04 01:15 Zeus [未注册用户]

获取网卡地址 MAC也可以:
using System.Management;
public string GetMacAddress()
{
ManagementClass adapters = new ManagementClass("Win32_NetworkAdapterConfiguration");
string MACAddress = "unknown";
foreach (ManagementObject adapter in adapters.GetInstances())
{
if((bool)adapter["IPEnabled"] == true)
{
MACAddress = adapter.Properties["MACAddress"].Value.ToString();
break;
}
}
return MACAddress;
}   回复  引用    

#16楼  2005-09-04 21:40 lizicheng [未注册用户]

引用
{
2005-09-04 01:10 by Zeus
我那个也可以作为服务或在Diagnostics的ProcessStart下运行啊
}


你说的这句的意思是你写的哪个可以给asp.net调用并保存到数据库对吧,但是到底怎么做,我不知道啊!请你给我说一下好吗?


你说的哪个asp实现的哪个对服务器空间有要求不实用啊
哪个都说行的根本就不行的!!
最后哪个是服务器的根本和我的问题无关啊!



你可以Q我啊 470450520 我实在没法了,急死了,用asp实现也行但不能有安全提问更不能对空间有要求啊,


我有一个js脚本的,哪东东是哪机器运行获取哪台机器的!!也有安全提问但总比对服务器空间有要求的好啊,不知道怎么保存到服务器数据库里啊!有人说可以保存到cookies 然后用asp.net读并保存也可,但我不知哪脚本怎么保存到cookies啊!!




  回复  引用    

#17楼  2005-09-05 12:36 Zeus [未注册用户]

lizicheng你好,我这QQ上不了,有事可以发邮件realzeus@gmail.com联系。
上面方法对服务空间也有要求,不能有安全提问更不能对空间有要求的方法我不知道,如果你知道了烦请告诉我,谢谢!   回复  引用    

#18楼  2005-09-13 15:43 roopeman@gmail.com [未注册用户]

看了后收获不小,请问Zeus,如果想得到其它机器的HD,CPU大小要如何做?想写个硬件扫描工具.有MSN吗?加我吧,咱聊聊.roopeman@hotmail.com   回复  引用    

#19楼  2005-09-13 17:51 Zeus [未注册用户]

我很少用MSN,楼主可以看看下面页面有你需要的东西
http://dotnet.aspx.cc/ShowDetail.aspx?id=6977HLMY-ELPN-4KIR-BI89-7YS2LNENT5HR

http://www.baidu.com/s?ie=gb2312&bs=c%23+%D3%B2%C5%CC+%D0%F2+%BA%C5+CPU&sr=&z=&wd=c%23+%D3%B2%C5%CC+%D0%F2%C1%D0%BA%C5+CPU&ct=0&cl=3&f=8

http://www.wangmeng.cn/Article/SOFTDEVELOP/CSHARP/200507/146.html
  回复  引用    

#20楼  2005-12-06 09:03 z [未注册用户]

using System.Management;显示在System中命名空间不存在   回复  引用    

#21楼  2005-12-06 23:42 是我 [未注册用户]

using System.Management在使用之前需要添加引用System.Management组件,是个标准.Net组件,文件是system.management.dll   回复  引用    

#22楼  2005-12-07 00:40 是我      

关于上面各位提的无法执行等问题,原因在于ASP.NET要获取客户端MAC,默认的权限级别是不够的,所以有的兄弟做成exe就可以web的就不行,这个就需要提高ASP.NET在你服务器上的运行权限了。   回复  引用  查看    

#23楼  2005-12-07 10:16 DengDeng [未注册用户]

以上得到的是远程服务端的MAC地址。如果是B/S,服务要得到每个客户端的MAC地址呢?
请教!   回复  引用    

#24楼 [楼主] 2005-12-08 23:17 Zeus      

可以如文中所述先获得客户端的IP地址然后由IP地址利用nbtstat -a进程来获取到远程客户端的mac地址。   回复  引用  查看    

#25楼  2005-12-14 11:34 -Zeus-      

<%@ Page language="c#" Codebehind="mac.aspx.cs" AutoEventWireup="false" Inherits="testdatagridcolor.mac" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>mac</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 312px; POSITION: absolute; TOP: 176px" runat="server"
Text="Button"></asp:Button>
<asp:TextBox id="TextBox1" style="Z-INDEX: 102; LEFT: 280px; POSITION: absolute; TOP: 72px" runat="server"></asp:TextBox>
<asp:TextBox id="TextBox2" style="Z-INDEX: 103; LEFT: 280px; POSITION: absolute; TOP: 120px"
runat="server"></asp:TextBox>
</form>
</body>
</HTML>
-----------------------------------------------------------------------------------
mac.aspx as below,mac.aspx.cs as follow:
-----------------------------------------------------------------------------------   回复  引用  查看    

#26楼  2005-12-14 11:40 -Zeus-      

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;
using System.Diagnostics;

namespace testdatagridcolor
{
/// <summary>
/// mac 的摘要说明。
/// </summary>
public class mac : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.TextBox TextBox1;
protected System.Web.UI.WebControls.TextBox TextBox2;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void Button1_Click(object sender, System.EventArgs e)
{



string strip;
string strmac;
strip=Page.Request.UserHostAddress;
TextBox1.Text=strip;
if (strip=="127.0.0.1")
{
strip="21.25.20.108";
}

string dirResults="";
ProcessStartInfo psi = new ProcessStartInfo();
Process proc = new Process();
psi.FileName = "nbtstat";
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.Arguments = "-A " + strip;
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)
// {
// TextBox2.Text=mc.Groups["key"].Value;
// }
// else
// {
// reg=new Regex("Host not found",RegexOptions.IgnoreCase|RegexOptions.Compiled);
// mc=reg.Match(dirResults);
// if(mc.Success)
// {
// TextBox2.Text="Host not found!";
// }
// else
// {
// TextBox2.Text="";
// }
// }
Response.Write(dirResults.ToString());
int intstrmaclength=dirResults.Length;

strmac=dirResults.Substring(intstrmaclength-18,18);
strmac=strmac.Substring(1,17);
TextBox2.Text=strmac;
}
}
}
  回复  引用  查看    

#27楼  2006-05-10 17:16 海天cool      


------------比较急-------------------------------

我有一个程序,通常情况下可以用,但是,当一台电脑上装了两个或两个以上网卡,就没办法获得IP了。
还有当电脑是动态获取IP的情况下,也没办法取得IP。烦请各位帮忙。
有什么办法可以获得多网卡电脑的IP,和动态获取IP的电脑的IP。   回复  引用  查看    

#28楼  2006-05-18 10:39 card [未注册用户]

各位老大:
我是一名ASP.NET菜鸟,想要在asp.net(c#)页面中获取客户端的MAC地址,请问如何完成,麻烦说详细点,我刚学。万分感谢!
email:victory_polo@eyou.com   回复  引用    

#29楼  2006-06-24 16:37 Angel2007 [未注册用户]

Zeus
上面的代码我都看过和实验了, 不行(也许是因为我不太了解C#).
不知可否在Asp.net中实现, 条件: Using VB.NET, 而不是C#.
谢谢了!
asp.net(VB.net)页面中获取客户端的MAC地址   回复  引用    

#30楼  2006-06-30 15:26 魔王 [未注册用户]

没网卡能建立asp.net环境吗?   回复  引用    

#31楼  2007-02-02 11:27 cyc308 [未注册用户]

晕,都是.net的,看来俺也要转型啦 !
  回复  引用    

#32楼  2007-02-05 11:24 ?? [未注册用户]

防火墙后面的机器呢?   回复  引用    

#33楼  2007-04-06 12:54 nailzhou [未注册用户]

防火墙打开了,就无法得到客户端的MAC了,有没有穿透防火墙得到客户端的MAC的好方法呀!   回复  引用    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接:
 

导航

公告

  •  CSDN :清柳(zeusvenus)

  •  有话说?给我一个Mail

  •  帖子以现状提供,欢迎转载:)

  •  您可以通过狗狗订阅本Blog

  •  The posts are made "AS IS" without warrnties and confers no rights.

  • <2005年4月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    统计

    与我联系

    搜索

     

    常用链接

    留言簿(7)

    我参与的团队

    随笔分类(18)

    随笔档案(196)

    文章分类(7)

    新闻分类

    相册

    我参与的团队

    最新评论

    阅读排行榜

    评论排行榜