以编程方式管理 Windows 防火墙

Posted

技术标签:

【中文标题】以编程方式管理 Windows 防火墙【英文标题】:Programmatically manage Windows Firewall 【发布时间】:2012-03-17 07:42:14 【问题描述】:

我正在尝试以编程方式创建出站 Windows 防火墙规则。此外,我想以编程方式启用和禁用此规则。我该如何在 C# 中执行此操作?手动,我可以通过进入控制面板,单击 Windows 防火墙,然后单击高级设置来执行此操作。

【问题讨论】:

+1 不敢相信你没有先试用 Google @EdS.: 不确定您是否阅读过有关这方面的 cmets,但它存在涉及 Vista/Win7 的增强安全模型的问题。 @ChrisLively:难怪;一般来说,未经我的明确许可,我的防火墙应该很难弄脏。由于问题并未说明尚未尝试过任何事情,我认为链接到一般方法是合适的。 @KierenJohnstone - Google 把我带到了这里,该死的Stack Overflow Exception Occurred 【参考方案1】:

最好使用 Windows 库 C:\windows\system32\FirewallAPI.dll。此 DLL 自 Windows 7 起可用。如果您将其添加到项目引用中,Visual Studio 将自动为该 COM 库添加一个包装器,或者您可以使用 tlbimp.exe 手动创建包装器。

using NetFwTypeLib;

INetFwRule firewallRule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
firewallRule.Action = NET_FW_ACTION_.NET_FW_ACTION_BLOCK;
firewallRule.Description = "Your rule description";
firewallRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN; // inbound
firewallRule.Enabled = true;
firewallRule.InterfaceTypes = "All";
firewallRule.RemoteAddresses = "1.2.3.0/24"; // add more blocks comma separated
firewallRule.Name = "You rule name";
firewallPolicy.Rules.Add(firewallRule);

VS IntelliSense 应该为您提供有关该库的足够详细信息。

【讨论】:

【参考方案2】:

您可以将 netsh advfirewall 命令语法包装到一个小型库中,以允许您按需启用/禁用设置。否则,请参阅 http://msdn.microsoft.com/en-us/library/windows/desktop/ff956124(v=vs.85).aspx 了解具有高级安全 API 的 Windows 防火墙。

【讨论】:

【参考方案3】:

你可以使用这个nuget包WindowsFirewallHelper

PM> Install-Package WindowsFirewallHelper

示例代码为应用程序添加新的出站规则

var rule = FirewallManager.Instance.CreateApplicationRule(
    @"MyApp Rule",
    FirewallAction.Allow,
    @"C:\MyApp.exe"
);
rule.Direction = FirewallDirection.Outbound;
FirewallManager.Instance.Rules.Add(rule);

【讨论】:

您是否还知道如何通过单击按钮来激活或停用该规则?我没有找到任何类似“启用规则,禁用规则”的方法 看看代码github.com/nager/Nager.FirewallManagement/blob/master/src/… 仅供参考,您需要在 ( 和 @"MyApp Rule" 之间添加一个 FirewallManager.Instance.GetProfile().Type,否则它不起作用【参考方案4】:

您可以使用“netsh”命令。创建一个方法来调用它。 如果您不想引用 FirewallAPI.dll 或安装 nuget WindowsFirewallHelper,请使用此选项。

例子:


        /// <summary>
        /// Creates a Firewall Rule on current computer. Uses 'netsh'
        /// </summary>
        /// <param name="rulename"></param>
        /// <param name="protocol"></param>
        /// <param name="port"></param>
        /// <param name="direction">"in" or "out"</param>
        /// <param name="action"></param>
        /// <returns>netsh command response</returns>
        public static string CreateFirewalPort(string rulename, string protocol, int port, string direction = "in", string action = "allow")
        
            // https://support.microsoft.com/en-us/help/947709/how-to-use-the-netsh-advfirewall-firewall-context-instead-of-the-netsh

            //Remove any rule with the same name. Otherwise every time you run this code a new rule is added.  
            Process removeproc = new Process
            
                StartInfo = 
                    FileName = "netsh",
                    Arguments = $@"advfirewall firewall delete rule name=""rulename""",
                    UseShellExecute = false,
                    WindowStyle = ProcessWindowStyle.Hidden,
                    RedirectStandardOutput = true
                
            ;
            try
            
                removeproc.Start();
                var output = removeproc.StandardOutput.ReadToEnd();
                removeproc.WaitForExit();
            
            catch (Exception ex)
            
                Log.Info(ex.Message);
            

            Process process = new Process
            
                StartInfo = 
                    FileName = "netsh",
                    Arguments = $@"advfirewall firewall add rule name=""rulename"" protocol=protocol localport=port dir=direction action=action",
                    UseShellExecute = false,
                    WindowStyle = ProcessWindowStyle.Hidden,
                    RedirectStandardOutput = true
                
            ;

            try
            
                process.Start();
                var output = process.StandardOutput.ReadToEnd();
                process.WaitForExit();
                return output;
            
            catch (Exception ex)
            
                return ex.ExceptionToString();
            
        

【讨论】:

以上是关于以编程方式管理 Windows 防火墙的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式获取已安装的防病毒软件和防火墙?

适用于 XP 的 Windows 防火墙规则

在 C# 中以编程方式创建防火墙规则以打开每个应用程序的端口

windows防火墙规则有优先级吗

设置Windows防火墙以允许被ICMP Ping(两种配置方式)

win10关闭防火墙