QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 1812|回复: 0

[C#/.NET] 通过代码开启或关闭防火墙C#版

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1294 小时
   最后登录 : 2024-11-21

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2020-10-29 11:49:07 | 显示全部楼层 |阅读模式
       通过代码操作防火墙的方式有两种:一是代码操作修改注册表启用或关闭防火墙;二是直接操作防火墙对象来启用或关闭防火墙。不论哪一种方式,都需要使用管理员权限,所以操作前需要判断程序是否具有管理员权限。7 q0 o! F; C' O* [% A# u0 P
1、判断程序是否拥有管理员权限
; B  Z, z0 G+ l% X7 P8 Q       需要引用命名空间:System.Security.Principal
, [8 u  t3 l% t8 q6 M& \6 x. G) K& x
  1. /// <summary>
  2. /// 判断程序是否拥有管理员权限
  3. /// </summary>
  4. /// <returns>true:是管理员;false:不是管理员</returns>
  5. public static bool IsAdministrator()
  6. {
  7.   WindowsIdentity current = WindowsIdentity.GetCurrent();
  8.   WindowsPrincipal windowsPrincipal = new WindowsPrincipal(current);
  9.   return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
  10. }
2、注册表修改防火墙
" L# ^3 Q( R7 {5 K" q, O       需要引用命名空间:Microsoft.Win32
0 m9 a2 s! j  {/ W! N& H! S
  1. /// <summary>
  2. /// 通过注册表操作防火墙
  3. /// </summary>
  4. /// <param name="domainState">域网络防火墙(禁用:0;启用(默认):1)</param>
  5. /// <param name="publicState">公共网络防火墙(禁用:0;启用(默认):1)</param>
  6. /// <param name="standardState">专用网络防火墙(禁用:0;启用(默认):1)</param>
  7. /// <returns></returns>
  8. public static bool FirewallOperateByRegistryKey(int domainState=1, int publicState = 1, int standardState = 1)
  9. {
  10.   RegistryKey key = Registry.LocalMachine;
  11.   try
  12.   {
  13.     string path = "HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\SharedAccess\\Defaults\\FirewallPolicy";
  14.     RegistryKey firewall = key.OpenSubKey(path, true);
  15.     RegistryKey domainProfile = firewall.OpenSubKey("DomainProfile", true);
  16.     RegistryKey publicProfile = firewall.OpenSubKey("PublicProfile", true);
  17.     RegistryKey standardProfile = firewall.OpenSubKey("StandardProfile", true);
  18.     domainProfile.SetValue("EnableFirewall", domainState, RegistryValueKind.DWord);
  19.     publicProfile.SetValue("EnableFirewall", publicState, RegistryValueKind.DWord);
  20.     standardProfile.SetValue("EnableFirewall", standardState, RegistryValueKind.DWord);
  21.   }
  22.   catch (Exception e)
  23.   {
  24.     string error = $"注册表修改出错:{e.Message}";
  25.     throw new Exception(error);
  26.   }
  27.   return true;
  28. }
3、直接操作防火墙对象  m6 K9 ^0 [8 S' Y* ]
       需要在项目引用中添加对NetFwTypeLib的引用,并引用命名空间NetFwTypeLib) a0 |5 l9 h  M( V+ }
$ i$ s4 ^/ n) w9 P) ?6 S
  1. /// <summary>
  2. /// 通过对象防火墙操作
  3. /// </summary>
  4. /// <param name="isOpenDomain">域网络防火墙(禁用:false;启用(默认):true)</param>
  5. /// <param name="isOpenPublicState">公共网络防火墙(禁用:false;启用(默认):true)</param>
  6. /// <param name="isOpenStandard">专用网络防火墙(禁用: false;启用(默认):true)</param>
  7. /// <returns></returns>
  8. public static bool FirewallOperateByObject(bool isOpenDomain = true, bool isOpenPublicState = true, bool isOpenStandard = true)
  9. {
  10.   try
  11.   {
  12.     INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
  13.     // 启用<高级安全Windows防火墙> - 专有配置文件的防火墙
  14.     firewallPolicy.set_FirewallEnabled(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE, isOpenStandard);
  15.     // 启用<高级安全Windows防火墙> - 公用配置文件的防火墙
  16.     firewallPolicy.set_FirewallEnabled(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC, isOpenPublicState);
  17.     // 启用<高级安全Windows防火墙> - 域配置文件的防火墙
  18.     firewallPolicy.set_FirewallEnabled(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_DOMAIN, isOpenDomain);
  19.   }
  20.   catch (Exception e)
  21.   {
  22.     string error = $"防火墙修改出错:{e.Message}";
  23.     throw new Exception(error);
  24.   }
  25.   return true;
  26. }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2024-11-22 00:50

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表