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
{
// 1. 啟動防火墻服務
StartFirewallService();
// 2. 啟用防火墻策略
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);
}
// 啟動Windows防火墻服務
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);
}
}
// COM接口定義
[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
}
}