2

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

获取 MAC 地址 C#

禁用网络适配器时获取MAC地址?

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

谢谢...

4

2 回答 2

1

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

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

于 2011-09-02T15:04:32.673 回答
0

这是我想出的(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 时没有发生任何事情。我发布它是希望您或其他人可以推断出允许它工作的缺失细节。

于 2011-07-26T06:21:50.233 回答