1

我正在开发一个项目,必须可以通过程序启用/禁用 Windows 7 Embedded 系统的集成 Windows 防火墙。

使用代码:

private static INetFwPolicy2 getCurrPolicy()
    {
        INetFwPolicy2 fwPolicy2;
        Type tNetFwPolicy2 = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
        if (tNetFwPolicy2 != null)
            fwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(tNetFwPolicy2);
        else
            return null;
        return fwPolicy2;
    }

    public static bool GetFirewallStatus()
    {
        bool result = false;
        try
        {
            INetFwPolicy2 fwPolicy2 = getCurrPolicy();
            NET_FW_PROFILE_TYPE2_ fwCurrentProfileTypes;
            //read Current Profile Types (only to increase Performace)
            //avoids access on CurrentProfileTypes from each Property
            fwCurrentProfileTypes = NET_FW_PROFILE_TYPE2_)fwPolicy2.CurrentProfileTypes;
            result = (fwPolicy2.get_FirewallEnabled(fwCurrentProfileTypes));
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
        return result;
    }

    public static void SetFirewallStatus(bool newStatus)
    {
        try
        {
            NET_FW_PROFILE_TYPE2_ fwCurrentProfileTypes;
            INetFwPolicy2 currPolicy = getCurrPolicy();
            //read Current Profile Types (only to increase Performace)
            //avoids access on CurrentProfileTypes from each Property
            fwCurrentProfileTypes = NET_FW_PROFILE_TYPE2_)currPolicy.CurrentProfileTypes;
            currPolicy.set_FirewallEnabled(fwCurrentProfileTypes, newStatus);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

发生的情况是,在 currPolicy 对象的每个函数调用中,我都会收到以下消息:

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

现在有我的问题:为什么我会收到这个错误,我怎样才能让它工作?

谢谢!

4

1 回答 1

3

再次阅读文档后,我遇到了“当您传递从 CurrentProfileTypes 属性获得的配置文件类型时,请确保您仅将一种配置文件类型传递给 get_FirewallEnabled 和 put_FirewallEnabled。请注意,get_CurrentProfileTypes 可以返回多个配置文件。”

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365316%28v=vs.85%29.aspx

是的,我实际上返回了不止一种配置文件类型。因此,当您只将一个配置文件传递给 FirewallEnabled 的 get 和 set 方法时,该 API 就可以工作。例如:

result = (fwPolicy2.get_FirewallEnabled(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC));
于 2013-02-19T07:23:42.607 回答