C# 操作 Windows 自带的防火墙分为启用(开启)/禁用(关闭)防火墙两种情况。在 C# 代码中,我们可以通过操作注册表中的 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WFDg 下的防火墙策略来实现这一步操作。
以下是详细的步骤:
使用 C# 中的 System.Runtime.InteropServices.DllImport("Shell32.dll") 属性定义以下函数:
[DllImport("Shell32.dll")]
private static extern uint SHNavigate2([In] ref SHELLEXECUTEINFO pSHELLEXECUTEINFO);
[DllImport("Kernel32.dll")]
private static extern uint RegOpenKeyEx(IntPtr hKey,
[MarshalAs(UnmanagedType.LPTStr), In] string lpSubKey,
int ulOptions, int samDesired, out IntPtr phkResult);
[DllImport("Kernel32.dll")]
private static extern int RegCloseKey(IntPtr hKey);
[DllImport("Advapi32.dll", EntryPoint = "RegQueryValueEx", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int RegQueryValueEx ([In, MarshalAs(UnmanagedType.LPTStr)]
string lpValueName, int reserved, out uint Type, byte[] lpData, ref uint lpcbData);
首先打开防火墙,执行以下代码:
SHELLEXECUTEINFO sei = CreateShellExecuteInfo(null, "cmd", "/c netsh advfirewall firewall add rule name=\"YourRuleNameHere\" dir=in action=allow protocol=any scope=per\_user", 0, null);
SHNavigate2(ref sei);
int retCode = HIWORD(sei.hResult);
Marshal.FreeCoTaskMem((IntPtr)sei);
regOpenKeyEx IntPtr hkey, "SYSTEM\CurrentControlSet\Services\WFDg", 0, 0, out IntPtr phkResult);
int retCode = RegOpenKeyEx(phkResult, "CurrentConfiguration", 1, 0, out hkey1);
int retCode = RegQueryValueEx (hkey1, "FirewallPolicy", 0, out uint nTType, string FirewallPolicy, ref uint ncbName);
在注册表中找到当前配置的 FirewallPolicy,然后查询该策略下的所有规则项,找到需要打开的规则,删除,然后重新新建。删除的方法是:将规则对应的类型从 registrykey 中删除,如果 registrykey 为 phkResult,可以直接删除。重新新建的方法是更新 phkResult 指向的 registrykey 下的 FirewallPolicy 对象。
禁用防火墙的方法是使用 System.Runtime.InteropServices.DllImport("Shell32.dll") 属性定义以下函数,然后将防火墙功能设置为 0,并将注册表中的 firewall policy 值设置为 0。
领取专属 10元无门槛券
手把手带您无忧上云