2017-06-19 39 views
0

我試圖以編程方式獲取我的系統的MAC地址。我正在用C#編寫,在Windows 10操作系統上使用Visual Studios .NET框架。我已經包含了System.Net.NetworkInformation命名空間(對於像我這樣的其他.NET新手而言,必須將其手動添加到解決方案資源管理器的「參考」部分,然後使用「使用」關鍵字)。要獲得MAC地址,我使用下面的代碼:當我嘗試獲取我的MAC地址時,爲什麼會收到空字符串?

try 
{ 
    var macAddr = 
     (
      from nic in NetworkInterface.GetAllNetworkInterfaces() 
      where nic.OperationalStatus == OperationalStatus.Up 
      select nic.GetPhysicalAddress().ToString() 
     ).FirstOrDefault(); 
    Console.WriteLine("MAC address is: {0}", macAddr); 

} 
catch (Exception e) 
{ 
    Console.WriteLine("Could not collect MAC Address;\nERROR: {0}", e); 
} 

,我期待的輸出可以是:

Attempting to collect MAC Address...

MAC address is: XXXXXXXXXXXX

其中XXX ....是12個字符的MAC地址,或:

Attempting to collect MAC Address...

Could not collect MAC Address;

ERROR: [error report inserted here]

什麼我得到,但是,是這樣的:

Attempting to collect MAC Address...

MAC address is:

其中macAddr變量似乎收集了一個空字符串。

所以......我的問題是,爲什麼我得到一個明顯爲空的字符串,而不是我期待的12個字符的MAC地址?

+0

什麼是生成的異常? –

+0

正在生成沒有例外。 try語句成功,但沒有打印MAC地址。 – MrSpudtastic

回答

0

您將獲得您的Software Loopback Interface 1的空MAC地址。
在嘗試運行此代碼之前,請確保您具有與網絡的活動連接。 活躍的意思是接口被激活(向上)並且連接到一個具有DHCP給定IP地址或靜態IP地址的網絡。

Loopback Device

爲了解決這個問題,你可以簡單地從查詢通過

var macAddresses = from nic in NetworkInterface.GetAllNetworkInterfaces() 
        where nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback 
        select nic.GetPhysicalAddress().ToString(); 

編輯刪除所有Loopback Interfaces,你可以做一個檢查,無論你的網卡的OperationalStatus和簡單的「問」爲非空MAC地址:

var macAddresses = from nic in NetworkInterface.GetAllNetworkInterfaces() 
        where !string.IsNullOrEmpty(nic.GetPhysicalAddress().ToString()) 
        select nic.GetPhysicalAddress().ToString(); 
+0

啊。我正在使用沒有Internet連接的虛擬機。我可以在虛擬機上運行ipconfig/all,並在其他值中獲得一個12位MAC地址,並且我試圖以編程方式檢索相同的地址。有沒有辦法說服代碼跳過Loopback接口並搜索非空MAC地址? – MrSpudtastic

+0

您可以對所有設備的'PhysicalAddress'進行字符串檢查,而不考慮'OperationalStatus',我將進行編輯,相應地做出回答,語法高亮顯示在註釋中效果不佳。 – jAC

+0

不幸的是,該解決方案並不適用於我,並且我仍然爲macAddresses提供了一個空字符串。我還嘗試@ Iomed的解決方案將其過濾爲以太網類型,但我在那裏得到了相同的結果。 – MrSpudtastic

0

有許多類型的網絡適配器沒有物理a ddress像tunelLoopback

濾波器Ethernet類型:

where nic.OperationalStatus == OperationalStatus.Up && 
nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet 
+0

不幸的是,我得到了和以前相同的結果,一個看似空的macAddresses字符串。 – MrSpudtastic

相關問題