C#如何判断Windows系统防火墙服务已经开启并在使用中,如果不在使用中如何重新开启
|
admin
2025年3月14日 12:12
本文热度 188
|
在C#中判断Windows防火墙服务是否运行并启用,可以通过以下步骤实现:
检查防火墙服务状态:确认Windows Firewall服务(MpsSvc)是否正在运行。
检查防火墙配置:通过COM接口INetFwPolicy2
查询各网络配置文件的防火墙启用状态。
以下是实现代码:
using System;
using System.ServiceProcess;
using System.Runtime.InteropServices;
public class FirewallStatusChecker
{
public static bool IsFirewallEnabledAndRunning()
{
if (!IsFirewallServiceRunning())
return false;
try
{
return IsFirewallEnabled();
}
catch (COMException)
{
return false;
}
}
private static bool IsFirewallServiceRunning()
{
try
{
using (ServiceController sc = new ServiceController("MpsSvc"))
{
return sc.Status == ServiceControllerStatus.Running;
}
}
catch (InvalidOperationException)
{
return false;
}
}
private static bool IsFirewallEnabled()
{
INetFwPolicy2 firewallPolicy = null;
try
{
Type type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(type);
bool domain = firewallPolicy.FirewallEnabled(NET_FW_PROFILE_TYPE2.NET_FW_PROFILE2_DOMAIN);
bool privateProfile = firewallPolicy.FirewallEnabled(NET_FW_PROFILE_TYPE2.NET_FW_PROFILE2_PRIVATE);
bool publicProfile = firewallPolicy.FirewallEnabled(NET_FW_PROFILE_TYPE2.NET_FW_PROFILE2_PUBLIC);
return domain || privateProfile || publicProfile;
}
finally
{
if (firewallPolicy != null)
Marshal.ReleaseComObject(firewallPolicy);
}
}
[ComImport]
[Guid("E2B3C97F-6AE1-41AC-817A-F6F92166D7DD")]
private interface INetFwPolicy2
{
[DispId(7)]
bool FirewallEnabled(NET_FW_PROFILE_TYPE2 profileType);
}
private enum NET_FW_PROFILE_TYPE2
{
NET_FW_PROFILE2_DOMAIN = 0x1,
NET_FW_PROFILE2_PRIVATE = 0x2,
NET_FW_PROFILE2_PUBLIC = 0x4,
NET_FW_PROFILE2_ALL = 0x7FFFFFFF
}
}
代码说明:
服务状态检查:使用ServiceController
类检查“MpsSvc”服务的运行状态。
COM接口调用:通过HNetCfg.FwPolicy2
创建防火墙策略对象,查询各网络配置文件(域、专用、公共)的防火墙启用状态。
异常处理:捕获可能的异常,如服务不存在或权限不足。
注意事项:
调用IsFirewallEnabledAndRunning()
方法,返回true
表示防火墙服务已启用并运行。
如果检测到不在使用,开启防火墙服务并且启动使用代码如下:
using System;
using System.ServiceProcess;
using System.Runtime.InteropServices;
using System.Security.Principal;
public class FirewallController
{
public static void EnableFirewall()
{
if (!IsRunAsAdmin())
{
Console.WriteLine("需要以管理员权限运行!");
return;
}
try
{
StartFirewallService();
SetFirewallStatus(true);
}
catch (Exception ex)
{
Console.WriteLine($"操作失败: {ex.Message}");
}
}
private static bool IsRunAsAdmin()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
private static void StartFirewallService()
{
using (ServiceController sc = new ServiceController("MpsSvc"))
{
if (sc.Status != ServiceControllerStatus.Running)
{
Console.WriteLine("正在启动防火墙服务...");
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(30));
Console.WriteLine("服务已启动");
}
}
}
private static void SetFirewallStatus(bool enable)
{
INetFwPolicy2 firewallPolicy = null;
try
{
Type type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(type);
firewallPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2.NET_FW_PROFILE2_DOMAIN] = enable;
firewallPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2.NET_FW_PROFILE2_PRIVATE] = enable;
firewallPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2.NET_FW_PROFILE2_PUBLIC] = enable;
Console.WriteLine(enable ? "防火墙已启用" : "防火墙已禁用");
}
finally
{
if (firewallPolicy != null)
Marshal.ReleaseComObject(firewallPolicy);
}
}
[ComImport]
[Guid("E2B3C97F-6AE1-41AC-817A-F6F92166D7DD")]
private interface INetFwPolicy2
{
[DispId(7)]
bool FirewallEnabled(NET_FW_PROFILE_TYPE2 profileType);
[DispId(7)]
void FirewallEnabled(NET_FW_PROFILE_TYPE2 profileType, [MarshalAs(UnmanagedType.Bool)] bool enabled);
}
private enum NET_FW_PROFILE_TYPE2
{
NET_FW_PROFILE2_DOMAIN = 0x1,
NET_FW_PROFILE2_PRIVATE = 0x2,
NET_FW_PROFILE2_PUBLIC = 0x4,
NET_FW_PROFILE2_ALL = 0x7FFFFFFF
}
}
使用说明:
需要以管理员权限运行程序(右键 -> 以管理员身份运行)
调用入口方法:
FirewallController.EnableFirewall();
代码功能分解:
权限验证:
服务控制:
防火墙策略控制:
错误处理:
注意事项:
系统兼容性:
仅支持Windows Vista及更新版本
需要.NET Framework 3.5+
依赖项:
需要防火墙服务存在且未被禁用
需要Windows防火墙组件未被卸载
权限要求:
如果需要更细粒度的控制(如单独设置某个配置文件),可以修改SetFirewallStatus
方法,添加参数指定具体配置文件类型。
该文章在 2025/3/14 12:12:44 编辑过