我需要一种方法来检索具有Windows 7
的机器的MAC
地址,当其Network Interface Card
被禁用并使用C#
时。我在网上搜索,也参考了以下链接。使用第二个链接中的答案,我可以在Windows XP
中成功获得所需的详细信息,但当NIC
被禁用时,Windows 7
无法获得所需的详细信息。
获取MAC地址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时没有发生任何事情。我把它贴出来,希望你或其他人可以推断出缺失的细节,使它能够工作。