如何启用/禁用防火墙?

时间:2017-05-24 07:32:38

标签: c# .net windows firewall

INetFwPolicy2接口允许应用程序或服务访问防火墙策略。

我正在使用2017年的视觉工作室。

问题与此https://stackoverflow.com/a/33700472/2451446

有关

代码稍有不同,我有问题禁用防火墙。

禁用防火墙前的逻辑正常。

        public Task<StatusCodeResult> ResetFirewallStatus()
        {
            Type netFwPolicy2Type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
            dynamic mgr = Activator.CreateInstance(netFwPolicy2Type);

            var fwCurrentProfileTypes = mgr.CurrentProfileTypes;

            // Get current status
            bool firewallEnabled = mgr.FirewallEnabled(fwCurrentProfileTypes); // return true

            // Disables Firewall
            mgr.FirewallEnabled(false); //breaks here !!!!


            return Task.FromResult<StatusCodeResult>(Ok());
        }

错误信息是:

  

System.ArgumentException:'值不在预期范围内   范围'。

我尝试使用set_FirewallEnabled(fwCurrentProfileTypes,false);

以及put_FirewallEnabled(fwCurrentProfileTypes,false)

在这种情况下,错误是:

  

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:   ''System .__ ComObject'不包含。的定义   'set_FirewallEnabled''('put_FirewallEnabled'')

编辑

我的解决方案:

const int domainProfile = 1;
const int privateProfile = 2;
const int publicProfile = 4;

public bool EnableDisableFirewall(bool enableFirewall)
{
    dynamic mgr = getFwPolicy2();

    mgr.FirewallEnabled[domainProfile] = enableFirewall;
    mgr.FirewallEnabled[privateProfile] = enableFirewall;
    mgr.FirewallEnabled[publicProfile] = enableFirewall;

    return enableFirewall;
}

public bool IsFirewallOn()
{
    dynamic mgr = getFwPolicy2();

    // Get current status
    var isDomainProfileEnabled = mgr.FirewallEnabled(domainProfile);
    var isPrivateProfileEnabled = mgr.FirewallEnabled(privateProfile);
    var isPublicProfileEnabled = mgr.FirewallEnabled(publicProfile);

    return isDomainProfileEnabled && isPrivateProfileEnabled && isPublicProfileEnabled;
}

private object getFwPolicy2()
{
    Type netFwPolicy2Type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
    dynamic mgr = Activator.CreateInstance(netFwPolicy2Type);
    return mgr;
}

1 个答案:

答案 0 :(得分:2)

你有两个问题,编写这个代码后期并没有完全帮助你做到这一点。添加对c:\ windows \ system32 \ firewallapi.dll的引用,以便您可以直接使用INetFwPolicy2接口帮助您正确使用它。您正在争论的一个怪癖是FirewallEnabled属性是索引属性。 C#语言中没有等价物。 Anyhoo,做晚会需要:

  

bool firewallEnabled = mgr.FirewallEnabled(fwCurrentProfileTypes);

MSDN文档特别警告这一点,您不能使用CurrentProfileTypes返回的值。它需要指定specific profile。我建议你使用:

  int profile = 2;   // 1=domain, 2=private, 4=public
  bool firewallEnabled = mgr.FirewallEnabled[profile];

注意使用[尖括号],允许在COM实现的属性的特定情况下使用索引属性。

  

mgr.FirewallEnabled(假); //在这里休息!!!!

您必须选择要禁用的特定配置文件。正确的语法如下:

  mgr.FirewallEnabled[profile] = false;

请注意,当您的程序以管理员权限提升时,您只能修改防火墙。如果您还没有这样做,请添加required manifest