2014-02-11 118 views
2

我目前在Windows 7 Bootcamp(運行在Macbook Pro上)上檢索MAC地址時使用了兩種方法。我目前正在研究一些在虛擬機上運行C#寫入應用程序的人遇到的問題,他們無法通過MAC地址認證機制進行身份驗證。我手邊沒有VM版本,所以我選擇了最接近的替代品 - 我的新手陣營。兩個MAC地址檢索方法返回兩個不同的MAC地址

第一種方法根據物理卡連接到PCI接口的事實檢索MAC地址。

public static string returnMAC1() 
{ 
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select MACAddress, PNPDeviceID FROM Win32_NetworkAdapter WHERE MACAddress IS NOT NULL AND PNPDEVICEID IS NOT NULL"); 
    ManagementObjectCollection mObject = searcher.Get(); 

    foreach (ManagementObject obj in mObject) 
    { 
     string pnp = obj["PNPDeviceID"].ToString(); 
     if (pnp.Contains("PCI\\")) 
     { 
      string mac = obj["MACAddress"].ToString(); 
      mac = mac.Replace(":", string.Empty); 
      return mac; 
     } 
    } 
    return "Nothing happened..."; 
} 

第二種方法是從MSDN文檔的標準方法:

public static string returnMAC2() 
{ 
    string mac = string.Empty; 
    foreach (System.Net.NetworkInformation.NetworkInterface nic in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) 
    { 
     if (nic.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up) 
     { 
      macAddresses += nic.GetPhysicalAddress().ToString(); 
      break; 
     } 
    } 
    return mac; 
} 

使用這兩種方法,我得到兩個完全不同的結果:

這裏是被我的兩個方法印刷:

enter image description here

當我檢查出Network and Sharing Center - >Wireless Network Connection的MAC地址,它對應於method 2的結果。

enter image description here

的,這對我得到兩個完全不同的結果與事實,方法#1是給我不是無線網卡的MAC的結果做的,但實際的PCI網卡的MAC?這似乎是解釋中最簡單的,但可能的。

回答

3

看起來我的假設是正確的。

我拿了一個局域網端口(不知道爲什麼我以前沒有這樣做)並將其插入到MAC中。再次運行腳本,這次檢查了Local Area Connection的地址,這一次它顯示了method 1的地址。

教訓:

  1. 本地連接MAC =/=無線網絡連接。無線和LAN適配器使用的MAC地址不同。

  2. 不同的C#MAC地址檢索方法從不同的硬件連接中檢索MAC地址。在我們的例子中,兩種不同的方法可以讓你獲得相同的結果,從無線端口檢索一個MAC,從LAN端口檢索一個MAC。

+2

我很高興你能得出你自己的結論。你是對的,每個物理設備都有不同的MAC /物理地址。儘管你的'returnMAC2'和'returnMAC1'方法做了不同的事情,這就是它們返回不同結果的原因。在機器啓動時,'returnMAC2'方法很可能按設備就緒狀態的順序檢索設備。 'returnMAC1'方法可能只是按照設備ID或一些物理佈局來抓取它們。 –

+0

謝謝邁克爾。你會發現在虛擬機上運行上述腳本有什麼不同嗎?我現在要在明天的Windows 8.1試用版上設置Visual Studio來測試它。 – theGreenCabbage

+0

是的,虛擬機變得棘手。如果你在虛擬機上運行它,它可能會連接到各種虛擬集線器,網橋,交換機和其他奇怪的東西。這可能會歪曲操作系統認爲是您主要界面的東西。我寫了一個類,基本上根據已傳輸,接收的數據,接口類型,確定它不是回送或通道接口以及檢查它是否處於啓動狀態來確定最可能的接口。如果這是你的目標,你可以像使用'NetworkInterface'那樣寫這樣的東西。 –