ped*_*ree 6 c# wmi networking adapter
我有一个问题,我需要启用已经禁用的卡,WMI NetworkAdapter上的搜索器不返回该对象.
我可以想到一种可能的方法来做到这一点,但我一直无法让它工作,那就是创建一个使用它作为构造函数名称的managementObject.但这只是抛出异常
{\\.\root\CIMV2:Win32_NetworkAdapter.NetConnectionID='Wireless Network Connection'}
另一种方法是封装netsh并启用设备,这有点难看,或者使用shell32/dll"启用"来执行相同操作,再次,只传递名称.我已经从注册表扫描中获取名称HKLM\SYSTEM\CurrentControlSet\Network并查找MediaType = 2以获取无线设备的字符串列表.如果我在启用适配器的同时运行应用程序,那么一切都很好,因为我可以获得无线设备的networkObject,但是如果应用程序在禁用无线设备时启动,则一切都会崩溃.
谢谢
编辑:这是我喜欢的代码,但没有去:(
using System;
using System.Management;
class Sample
{
public static int Main(string[] args)
{
ManagementObject mObj = new ManagementObject("\\\\.\\root\\CIMV2:Win32_NetworkAdapter.NetConnectionID=\"Wireless Network Connection\"");
mObj.InvokeMethod("Enable", null);
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
该方法本质上是使用 C# 来利用 WMI 和Win32_NetworkAdapter类。它应该有内置的方法:
这样您就可以在选定的界面上执行您的命令。
您可以通过以下方式实现:
SelectQuery query = new SelectQuery("Win32_NetworkAdapter", "NetConnectionStatus=2");
ManagementObjectSearcher search = new ManagementObjectSearcher(query);
foreach(ManagementObject result in search.Get())
{
NetworkAdapter adapter = new NetworkAdapter(result);
// Identify the adapter you wish to disable here.
// In particular, check the AdapterType and
// Description properties.
// Here, we're selecting the LAN adapters.
if (adapter.AdapterType.Equals("Ethernet 802.3"))
{
adapter.Disable();
}
}
Run Code Online (Sandbox Code Playgroud)
有一个博客实际上概述了这样的任务;它定义了如何围绕 WMI 类创建包装器。
另一种解决方案可能是也使用( ControlServiceadvapi32)。
[DllImport("advapi32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ControlService(IntPtr hService, SERVICE_CONTROL dwControl, ref SERVICE_STATUS lpServiceStatus);
Run Code Online (Sandbox Code Playgroud)
希望其中一种方法有帮助..