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
    }
}