在Windows 7中使用c#获取网卡禁用时的MAC地址

本文关键字:地址 MAC 网卡 Windows 获取 | 更新日期: 2023-09-27 18:03:23

我需要一种方法来检索具有Windows 7的机器的MAC地址,当其Network Interface Card被禁用并使用C#时。我在网上搜索,也参考了以下链接。使用第二个链接中的答案,我可以在Windows XP中成功获得所需的详细信息,但当NIC被禁用时,Windows 7无法获得所需的详细信息。

获取MAC地址c#

当网卡被禁用时获取MAC地址?

有谁知道如何完成这项任务吗?

谢谢…

在Windows 7中使用c#获取网卡禁用时的MAC地址

我认为你需要缓存MAC地址。例如,当网卡启用时,您可以在缓存中更新网卡的MAC地址。之后,当它被禁用并且你无法从Windows中获取MAC时,你可以从缓存中获取它。

你无法从没有加载的驱动程序中获取MAC地址。驱动程序需要从网卡的ROM芯片加载MAC地址。因此,如果Windows确实有办法从禁用的网卡获取MAC地址,那么缓存MAC地址就必须与Windows使用的技术相同。

这是我想到的(Win7 64位):

var query = new SelectQuery("Win32_NetworkAdapter");
var scope = new ManagementScope("''root''cimv2");
scope.Connect();
var searcher = new ManagementObjectSearcher(scope, query);
var managementObjects = searcher.Get();
foreach (var mo in managementObjects)
{
    Debug.WriteLine("{0} : {1}", mo["Description"], mo["MACAddress"]);
}

我的蓝牙适配器是这样的:

蓝牙设备(个人局域网):70:F3:95:88:F7:7E

然而,当它被禁用时,MAC地址显示为空白。

你应该能够启用/禁用适配器,通过类上的方法来查询MAC,但这有点麻烦,因为你必须手动包装Win32_NetworkAdapter类。

您需要使用。net Framework SDK工具'mgmtclassgen.exe'为WMI对象生成一个类包装器

像这样调用它(生成的文件是80k):

 mgmtclassgen Win32_NetworkAdapter -p NetworkAdapter.cs

然后像这样增加代码:

var query = new SelectQuery("Win32_NetworkAdapter");
var scope = new ManagementScope("''root''cimv2");
scope.Connect();
var searcher = new ManagementObjectSearcher(scope, query);
var managementObjects = searcher.Get();
var adapters = managementObjects.Cast<ManagementBaseObject>().Select(s => new NetworkAdapter(s));
foreach (var adapter in adapters)
{
    adapter.Enable();
    Console.WriteLine("{0} : {1}", adapter.Name, adapter.MACAddress);
}

但是我无法让它工作,因为当我调用Enable()并且返回代码为0时没有发生任何事情。我把它贴出来,希望你或其他人可以推断出缺失的细节,使它能够工作。