我需要一种方法来检索MAC
机器的地址,Windows 7
当它Network Interface Card
被禁用并使用C#
. 我在网上搜索并参考了以下链接。使用第二个链接中的答案,我可以成功获得所需的详细信息,Windows XP
但不能在禁用Windows 7
时获得。NIC
有谁知道如何完成这项任务???
谢谢...
我需要一种方法来检索MAC
机器的地址,Windows 7
当它Network Interface Card
被禁用并使用C#
. 我在网上搜索并参考了以下链接。使用第二个链接中的答案,我可以成功获得所需的详细信息,Windows XP
但不能在禁用Windows 7
时获得。NIC
有谁知道如何完成这项任务???
谢谢...
我认为您需要缓存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 时没有发生任何事情。我发布它是希望您或其他人可以推断出允许它工作的缺失细节。