QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

查看: 1746|回复: 0

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

[复制链接]

等级头衔

积分成就    金币 : 2810
   泡泡 : 1516
   精华 : 6
   在线时间 : 1245 小时
   最后登录 : 2024-5-17

丰功伟绩

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

联系方式
发表于 2020-10-29 11:49:07 | 显示全部楼层 |阅读模式
       通过代码操作防火墙的方式有两种:一是代码操作修改注册表启用或关闭防火墙;二是直接操作防火墙对象来启用或关闭防火墙。不论哪一种方式,都需要使用管理员权限,所以操作前需要判断程序是否具有管理员权限。# P) E) `7 r0 [( ^7 M: j  l6 P2 H% [
1、判断程序是否拥有管理员权限
/ f% e% @2 b$ ~2 G+ K       需要引用命名空间:System.Security.Principal
- L3 ~' A' |0 ^) D" A& X7 d
  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、注册表修改防火墙
* \) s; F% ]. G# Y       需要引用命名空间:Microsoft.Win32
% w$ m; V" ]$ [* O) I
  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、直接操作防火墙对象+ \' n) `/ Q+ d. Y& f
       需要在项目引用中添加对NetFwTypeLib的引用,并引用命名空间NetFwTypeLib
; L4 g- `5 L" Q# U; J) T" D) q2 W- a* L3 A
  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号 )

GMT+8, 2024-5-17 16:10

Powered by paopaomj X3.4 © 2016-2024 sitemap

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