2010-07-01 4 views
2

Я нашел этот код для получения MAC-адреса, но он возвращает длинную строку и не включает ':'.Получение MAC-адреса C#

Можно ли добавить в ':' или разделить строку и добавить ее сам?

вот код:

private object GetMACAddress() 
{ 
    string macAddresses = ""; 

    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) 
    { 
     if (nic.OperationalStatus == OperationalStatus.Up) 
     { 
      macAddresses += nic.GetPhysicalAddress().ToString(); 
      break; 
     } 
    } 

    return macAddresses; 
} 

Он возвращает значение 00E0EE00EE00, тогда как я хочу его показать что-то вроде 00: E0: EE: 00: EE: 00.

Любые идеи?

Спасибо.

ответ

10

я использую следующий код для доступа к MAC-адрес в формате, который вы хотите:

public string GetSystemMACID() 
     { 
      string systemName = System.Windows.Forms.SystemInformation.ComputerName; 
      try 
      { 
       ManagementScope theScope = new ManagementScope("\\\\" + Environment.MachineName + "\\root\\cimv2"); 
       ObjectQuery theQuery = new ObjectQuery("SELECT * FROM Win32_NetworkAdapter"); 
       ManagementObjectSearcher theSearcher = new ManagementObjectSearcher(theScope, theQuery); 
       ManagementObjectCollection theCollectionOfResults = theSearcher.Get(); 

       foreach (ManagementObject theCurrentObject in theCollectionOfResults) 
       { 
        if (theCurrentObject["MACAddress"] != null) 
        { 
         string macAdd = theCurrentObject["MACAddress"].ToString(); 
         return macAdd.Replace(':', '-'); 
        } 
       } 
      } 
      catch (ManagementException e) 
      { 
          } 
      catch (System.UnauthorizedAccessException e) 
      { 

      } 
      return string.Empty; 
     } 
+1

это дает надежный MAC-адрес? Потому что у меня возникла проблема получения виртуальных. – Crazyd22

+0

да, это работает для меня –

+0

Да, отлично работает, спасибо! – Crazyd22

0

Используйте GetAddressBytes метод:

byte[] bytes = address.GetAddressBytes(); 
    for(int i = 0; i< bytes.Length; i++) 
    { 
     // Display the physical address in hexadecimal. 
     Console.Write("{0}", bytes[i].ToString("X2")); 
     // Insert a hyphen after each byte, unless we are at the end of the 
     // address. 
     if (i != bytes.Length -1) 
     { 
      Console.Write("-"); 
     } 
    } 
+0

адрес не существует в текущем контексте? – Crazyd22

+1

Это пример. Очевидно, вам нужно заменить переменную 'address' переменной, которую вы используете. – Sjoerd

0
function string GetSplitedMacAddress(string macAddresses) 
{ 
    for (int Idx = 2; Idx <= 15; Idx += 3) 
    { 
     macAddresses = macAddresses.Insert(Idx, ":"); 
    } 

    return macAddresses; 
} 
+0

Это не работает, возвращает то же значение – Crazyd22

+0

Эта работа, которую я тестировал, и результат 00: E0: EE: 00: EE: 00 – Svisstack

8

Вы можете использовать BitConverter.ToString() метод:

var hex = BitConverter.ToString(nic.GetPhysicalAddress().GetAddressBytes()); 
hex.Replace("-", ":"); 
+0

Лучшее решение для меня ... – Paya

1

You ca п использовать этот код (использует LINQ):

using System.Linq; 
using System.Net; 
using System.Net.NetworkInformation; 

// .... 

private static string GetMACAddress() 
{ 
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) 
    { 
     if (nic.OperationalStatus == OperationalStatus.Up) 
      return AddressBytesToString(nic.GetPhysicalAddress().GetAddressBytes()); 
    } 

    return string.Empty; 
} 

private static string AddressBytesToString(byte[] addressBytes) 
{ 
    return string.Join(":", (from b in addressBytes 
          select b.ToString("X2")).ToArray()); 
} 
3

Использование LINQ просто заменить

macAddresses += nic.GetPhysicalAddress().ToString(); 
// Produces "00E0EE00EE00" 

с

macAddresses += String.Join(":", nic.GetPhysicalAddress() 
            .GetAddressBytes() 
            .Select(b => b.ToString("X2")) 
            .ToArray()); 
// Produces "00:E0:EE:00:EE:00" 

Вы также можете играть с ToString параметром, например, если вам нравится больше 00:e0:ee:00:ee:00 чем 00:E0:EE:00:EE:00, то вы можете просто пройти "x2" вместо "X2".

+0

Возможно, вам понадобится .ToArray() после .Select(), чтобы он скомпилировался. – Andrew

+0

@ Андрей: Спасибо, изначально я использовал .NET 4.0, где 'String.Join' имеет перегруз, принимающий' IEnumerable 'аргумент. Обновлен мой код, чтобы включить '.ToArray()' – Regent

Смежные вопросы