在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 編輯過