2017-05-28 264 views
1

我有4个以太网接口,在我的电脑(获得由ipconfig信息/全部)C#获取本地IP(多个接口)本地MAC地址

例如:
1)IP:192.168.15.161 ,MAC:00-E2-4C-98-18-89
2)IP:172.168.11.126,MAC:00-FF-4C-98-18-44
3)IP:10.0.13.136,MAC:00-EE-89-98-13-44
4)IP:195.22.18.146,MAC:00-12-89-98-13-33

我需要一个返回功能给定IP时的MAC地址。

例如getMacByIP("192.168.15.161")将返回"00-E2-4C-98-18-89"

使用arp不工作的地方!

例如arp -a不会与MAC
给本地地址于是所有的问题/像here答案是没有帮助我。

在问这个问题之前,我在网上搜了很多。

编辑:

这个答案:(link)不帮助我

public static string GetMacAddressUsedByIp(string ipAddress) 
    { 
     var ips = new List<string>(); 
     string output; 

     try 
     { 
      // Start the child process. 
      Process p = new Process(); 
      // Redirect the output stream of the child process. 
      p.StartInfo.UseShellExecute = false; 

      p.StartInfo.RedirectStandardOutput = true; 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.CreateNoWindow = true; 
      p.StartInfo.FileName = "ipconfig"; 
      p.StartInfo.Arguments = "/all"; 
      p.Start(); 
      // Do not wait for the child process to exit before 
      // reading to the end of its redirected stream. 
      // p.WaitForExit(); 
      // Read the output stream first and then wait. 
      output = p.StandardOutput.ReadToEnd(); 
      p.WaitForExit(); 

     } 
     catch 
     { 
      return null; 
     } 

     // pattern to get all connections 
     var pattern = @"(?xis) 
(?<Header> 
    (\r|\n) [^\r]+ : \r\n\r\n 
) 
(?<content> 
    .+? (?= ((\r\n\r\n)|($))) 
)"; 

     List<Match> matches = new List<Match>(); 

     foreach (Match m in Regex.Matches(output, pattern)) 
      matches.Add(m); 

     var connection = matches.Select(m => new 
     { 
      containsIp = m.Value.Contains(ipAddress), 
      containsPhysicalAddress = Regex.Match(m.Value, @"(?ix)Physical \s Address").Success, 
      content = m.Value 
     }).Where(x => x.containsIp && x.containsPhysicalAddress) 
     .Select(m => Regex.Match(m.content, @"(?ix) Physical \s address [^:]+ : \s* (?<Mac>[^\s]+)").Groups["Mac"].Value).FirstOrDefault(); 

     return connection; 
    } 

因为如果我使用,例如,中国版本的Windows,正则表达式将无法正常工作!

+1

[可靠的方法,在C#中获取机器的MAC地址(的可能的复制https://stackoverflow.com/questions/850650/可靠的方法来获取机器mac地址在c-sharp) – Svek

+0

不!这是不正确的!所有的答案都没有解决我的问题。他们返回第一个/主动。我想通过IP来获得特定的MAC。一个答案给这个功能,但它不是很好的答案!因为如果我的窗户不是英文的,它不会起作用! – cheziHoyzer

+0

您没有阅读所有答案,或试图了解这类问题的复杂性。还有很多其他的事情需要考虑,比如分配给一个接口的地址的数量,以及你试图匹配的地址的类型等。 – Svek

回答

1

这里是一个建议的解决方案,做你的要求为:

void Main() 
{ 
    Console.WriteLine(GetMacByIP("192.168.15.161")); // will return "00-E2-4C-98-18-89" 
} 

public string GetMacByIP(string ipAddress) 
{ 
    // grab all online interfaces 
    var query = NetworkInterface.GetAllNetworkInterfaces() 
     .Where(n => 
      n.OperationalStatus == OperationalStatus.Up && // only grabbing what's online 
      n.NetworkInterfaceType != NetworkInterfaceType.Loopback) 
     .Select(_ => new 
     { 
      PhysicalAddress = _.GetPhysicalAddress(), 
      IPProperties = _.GetIPProperties(), 
     }); 

    // grab the first interface that has a unicast address that matches your search string 
    var mac = query 
     .Where(q => q.IPProperties.UnicastAddresses 
      .Any(ua => ua.Address.ToString() == ipAddress)) 
     .FirstOrDefault() 
     .PhysicalAddress; 

    // return the mac address with formatting (eg "00-00-00-00-00-00") 
    return String.Join("-", mac.GetAddressBytes().Select(b => b.ToString("X2"))); 
} 
+0

你为什么使用q.IPProperties.UnicastAddresses?为什么你需要具有单播地址的接口? – cheziHoyzer

+0

@cheziHoyzer - 这正是我之前试图提醒你的。这并不总是很简单。你有'Anycast','Unicast','Multicast',更多信息... https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipinterfaceproperties(v=vs.110)的.aspx – Svek