获取指定IP的终端的MAC地址

    因为业务需要,需要给公司部分终端进行登记,以保证授权终端能够登录业务系统,最好的方法就是记录下每台终端的MAC地址来进行验证是否有授权。

    下面是采用调用API的方式获取指定IP的终端的MAC地址:

  [DllImport("Iphlpapi.dll")]
  public static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
  //dest为目标机器的IP;Host为本机器的IP

  [DllImport("Ws2_32.dll")]
  public static extern Int32 inet_addr(string ip);

  public static string GetNetCardAddress(string strIp)
  {
   try
   {
    IPHostEntry host = Dns.GetHostByName(System.Environment.MachineName);
    Int32 local = inet_addr(host.AddressList[0].ToString());
    Int32 remote = inet_addr(strIp);

    Int64 macinfo = new Int64();
    Int32 length = 6;
    SendARP(remote, local, ref macinfo, ref length);

    string temp = System.Convert.ToString(macinfo, 16).PadLeft(12, '0').ToUpper();

    StringBuilder strReturn = new StringBuilder();
    int x = 12;
    for(int i=0;i<6;i++)
    {
     strReturn.Append(temp.Substring(x-2, 2));
     x -= 2;
    }

    return strReturn.ToString();
   }
   catch(Exception error)
   {
    throw new Exception(error.Message);
   }
  }

    在上面的方式使用一段时间之后发现只能获取到同一网段或没有经过任何路由的终端的MAC地址,而对那些不同网段或经过了路由的终端的MAC地址则无法正常获取到MAC地址。下面的操作系统命令方式可以解决此问题:

  public static string GetNetCardAddress2(string strIp)
  {
   string mac = "";

   System.Diagnostics.Process process = new System.Diagnostics.Process();
   process.StartInfo.FileName = "nbtstat";
   process.StartInfo.Arguments = "-a "+strIp;
   process.StartInfo.UseShellExecute = false;
   process.StartInfo.CreateNoWindow = true;
   process.StartInfo.RedirectStandardOutput = true;
 
   process.Start();
 
   string output = process.StandardOutput.ReadToEnd();
   int length = output.IndexOf("MAC Address = ");

   if(length>0)
   {
    mac = output.Substring(length+14, 17);
   }
 
   process.WaitForExit();
 
   return mac.Replace("-", "").Trim();
  }

时间: 2024-08-01 09:47:22

获取指定IP的终端的MAC地址的相关文章

Linux 下获取LAN中指定IP的网卡的MAC(物理地址)

// all.h// 2005/06/20,a.m. wenxy #ifndef _ALL_H#define _ALL_H #include <memory.h>#include <stdio.h>#include <stdlib.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/socket.h>#include <net/if.h>#include

php中获取指定IP的物理地址的代码(正则表达式)

自己搭建IP数据库占资源,而且更新不便,何不使用现成的IP查询呢?下面自己写了个获取IP物理地址的PHP代码(有一定的瑕疵,请高手不吝赐教) 复制代码 代码如下: <!DOCTYPE html> <html lang="en"> <head> <title></title> <meta charset="UTF-8" /> <meta name="author" con

php中获取指定IP的物理地址的代码(正则表达式)_php技巧

自己搭建IP数据库占资源,而且更新不便,何不使用现成的IP查询呢?下面自己写了个获取IP物理地址的PHP代码(有一定的瑕疵,请高手不吝赐教) 复制代码 代码如下: <!DOCTYPE html> <html lang="en"> <head> <title></title> <meta charset="UTF-8" /> <meta name="author" con

ios-iOS中如何获取本机手机号码和蓝牙mac地址

问题描述 iOS中如何获取本机手机号码和蓝牙mac地址 最近的项目需要获取这两项,而且需要能通过苹果审核,应该用哪个sdk呢? 解决方案 NSString *number = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"]; 只能获取的是机主设置的本机号码,不能读取sim卡上的电话号码 解决方案二: C++获取本机MAC地址java获取本机mac地址 解决方案三: 额, 借楼问

Windows 7/8电脑IP地址设置方法(自动获取/指定IP地址)

电脑IP地址的获取与设置有两种,一种是让系统自动获取由路由器分配,另一种是人工设置绑定IP地址,具体如下. 自动获取ip地址: 第一步:点击桌面右下角的网络图标,打开"网络和共享中心" 第二步:点击"更改适配器设置" 第三步:右键点击"以太网"选择"属性" 第四步:双击"Internet协议版本4(TCP/IP)" 第五步:选择"自动获得IP地址","自动获得DNS服务器地址&

获取同一网段下所有机器MAC地址的shell脚本_linux shell

复制代码 代码如下: #!/bin/bash for ((i = 1; i < 254; i++)) do arping -I eth0 192.168.0.$i -c 1 done arp -a > /tmp/mactable.txt 那个/tmp/mactable.txt文件即同一网段下所有机器IP/MAC对应地址

C#应用:获取cpu序列号,硬盘ID,网卡MAC地址

硬盘 private void GetInfo()  {   string cpuInfo = "";//cpu序列号   ManagementClass cimobject = new ManagementClass("Win32_Processor");   ManagementObjectCollection moc = cimobject.GetInstances();   foreach(ManagementObject mo in moc)   {   

php正则匹配获取指定url网页页面超级链接地址

 在数据采集与页面分析中,常需要抓取给定url页面的内容,或者第二.第三层次深度页面内容. 这里是一个测试例子的实现,仅供参考. 代码如下: /* 匹配给定页面链接 return:array match[link,content,all] */ function match_links($host, $document) {  $pattern = '/<a(.*?)href="(.*?)"(.*?)>(.*?)</a>/i';   preg_match_all

用C#获取硬盘序列号,CPU序列号,网卡MAC地址的源码_C#教程

privatestring[]GetMoc() { string[]str=newstring[3]; ManagementClassmcCpu=newManagementClass("win32_Processor"); ManagementObjectCollectionmocCpu=mcCpu.GetInstances(); foreach(ManagementObjectminmocCpu) { str[0]=m["ProcessorId"].ToStrin