C#编程启用/禁用指定网络接口的指定网络协议
通过WMI实现
简单的方法只适用于Windows 10:
思路是使用WMI接口的MSFT_NetAdapterBindingSettingData类型。
以下示例禁用"以太网"连接上的IPV6协议:
var query = new ObjectQuery(string.Format("select * from MSFT_NetAdapterBindingSettingData where Name='{0}' and BindName='{1}'", "以太网","Tcpip6"));
var search = new ManagementObjectSearcher(new ManagementScope("root\\StandardCimv2"),query);
try
{
var objc = search.Get();
if (objc.Count <= 0)
{
return 94; //Path, file or object not found
}
var objs = new ManagementObject[objc.Count];
objc.CopyTo(objs, 0);
string s = "";
var ret= (UInt32)objs[0].InvokeMethod(
"Disable",
new object[] {
s });
return ret;
}catch(Exception ex)
{
return (UInt32)ex.HResult;
}
适用性更强的解决方案
适用性更强的是使用INetCfg COM API。
接口P/Invoke实现
这个实现直接拿来主义:
How to enable / disable network protocols from C# code in Windows
using System;
using System.Runtime.InteropServices;
namespace COMInterop
{
[Flags]
public enum CLSCTX : uint
{
CLSCTX_INPROC_SERVER = 0x1,
CLSCTX_INPROC_HANDLER = 0x2,
CLSCTX_LOCAL_SERVER = 0x4,
CLSCTX_INPROC_SERVER16 = 0x8,
CLSCTX_REMOTE_SERVER = 0x10,
CLSCTX_INPROC_HANDLER16 = 0x20,
CLSCTX_RESERVED1 = 0x40,
CLSCTX_RESERVED2 = 0x80,
CLSCTX_RESERVED3 = 0x100,
CLSCTX_RESERVED4 = 0x200,
CLSCTX_NO_CODE_DOWNLOAD = 0x400,
CLSCTX_RESERVED5 = 0x800,
CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
CLSCTX_NO_FAILURE_LOG = 0x4000,
CLSCTX_DISABLE_AAA = 0x8000,
CLSCTX_ENABLE_AAA = 0x10000,
CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
CLSCTX_ACTIVATE_32_BIT_SERVER = 0x40000,
CLSCTX_ACTIVATE_64_BIT_SERVER = 0x80000,
CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER
}
public class Ole32Methods
{
[DllImport("ole32.Dll")]
static public extern int CoCreateInstance(ref Guid clsid, [MarshalAs(UnmanagedType.IUnknown)] object inner, CLSCTX context, ref Guid uuid, [Out, MarshalAs(UnmanagedType.IUnknown)] out object rReturnedComObject);
public static uint CLSCTX_INPROC_SERVER = 1;
}
}
namespace Interops
{
public abstract class INetCfgGuid
{
public static Guid CLSID_CNetCfg = new Guid("5B035261-40F9-11D1-AAEC-00805FC1270E");
public static Guid IID_INetCfg = new Guid("C0E8AE93-306E-11D1-AACF-00805FC1270E");
public static Guid IID_INetCfgLock = new Guid("C0E8AE9F-306E-11D1-AACF-00805FC1270E");
public static Guid IID_INetCfgClass = new Guid("C0E8AE97-306E-11D1-AACF-00805FC1270E");
public static Guid IID_INetCfgComponentBindings = new Guid("C0E8AE9E-306E-11D1-AACF-00805FC1270E");
public static Guid IID_DevClassNet = new Guid(0x4d36e972, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18); // Network adapters
public static Guid IID_DevClassNetClient = new Guid(0x4d36e973, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18); // Deprecated
public static Guid IID_DevClassNetService = new Guid(0x4d36e974, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18); //
public static Guid IID_DevClassNetTrans = new Guid(0x4d36e975, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18); // Protocols
}
// ---- Enums ------ //
enum COMPONENT_CHARACTERISTICS
{
NCF_VIRTUAL = 0x00000001,
NCF_SOFTWARE_ENUMERATED = 0x00000002,
NCF_PHYSICAL = 0x00000004,
NCF_HIDDEN = 0x00000008,
NCF_NO_SERVICE = 0x00000010,
NCF_NOT_USER_REMOVABLE = 0x00000020,
NCF_MULTIPORT_INSTANCED_ADAPTER = 0x00000040, // This adapter has separate instances for each port
NCF_HAS_UI = 0x00000080,
NCF_SINGLE_INSTANCE = 0x00000100,
// = 0x00000200, // filter device
NCF_FILTER = 0x00000400, // filter component
NCF_DONTEXPOSELOWER = 0x00001000,
NCF_HIDE_BINDING = 0x00002000