我编写了一个Windows服务,该服务使用防火墙COM库Interop.NetFwTypeLib来管理TCP传输规则。两台计算机上的部署不会报告问题,但是我最近将其安装在另一台计算机上并收到异常:


  无法将类型为“ System .__ ComObject”的COM对象转换为接口类型为“ NetFwTypeLib.INetFwRule3”。此操作失败,因为具有以下错误的IID为'{B21563FF-D696-4222-AB46-4E89B73AB34A}'的接口的COM组件上的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT的异常:0x80004002(E_NOINTERFACE))


看完这篇文章后:


Exception from HRESULT: 0x80004002 (E_NOINTERFACE)
Why cannot I cast my COM object to the interface it implements in C#
InvalidCastException , Exception from HRESULT: 0x80004002 (E_NOINTERFACE)


我将STAThreadAttribute设置为此代码的Main方法,以测试是否可以解决此问题,但没有任何解决方案:

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        try{
            var type = Type.GetTypeFromProgID("HNetCfg.FWRule");
            var instance = (INetFwRule3) Activator.CreateInstance(type);

            Console.WriteLine("OK");
        }
        catch (Exception exception){
            Console.WriteLine(exception);
        }
    }
}


我很惊讶我运行此脚本以在注册表上找到CLSID,并且在两台计算机上都不会返回任何结果,在这两个计算机上都可以工作,而不能工作。

reg query HKCR\CLSID | find /i "{B21563FF-D696-4222-AB46-4E89B73AB34A}"


这些是服务运行所在计算机的信息:

**OS**
Windows Server 2012 R2 Standard

**FirewallAPI.dll file on Windows/system32**
File version: 6.3.9600.17415
Product version: 6.3.9600.17415
Size: 736 kb
Date modified: 4/28/2015 8:51 PM


来自服务失败的计算机的信息:

**OS**
Windows Server 2011 Service Pack 1

**FirewallAPI.dll file on Windows/system32**
File version: 6.1.7600.16385
Product version: 6.3.7600.16385
Size: 730 kb
Date modified: 7/13/2009 8:51 PM


问题:


可能是FirewallAPI.dll版本不同导致问题的原因?
如果这样的话,更新dll就足够了,尽管在注册表上可能出现不一致之处似乎有点危险?

最佳答案

感谢@Hans评论,我可以写这个答案。

阅读有关MSDN的文档后:


INetFwRule interface
INetFwRule2 interface
INetFwRule3 interface


我找到了每个接口支持的最低客户端和服务器。

var osVersion = Environment.OSVersion.Version;

if(osVersion.Major < 6)
    throw new Exception("INetFwRule is not available for current OS version. Minimun OS version required is Windows Vista or Windows Server 2008.");

if (osVersion.Major == 6)
{
    switch (osVersion.Minor)
    {
        case 0:
            //INetFwRule is available. Windows Server 2008 or Windows Vista
            break;
        case 1:
            //INetFwRule2 is available. Windows 7 or Windows Server 2008 R2
            break;
        default:
            //INetFwRule3 is available. Windows 8.1, Windows Server 2012 R2, Windows 8 or Windows Server 2012.
            break;
        }
    }
    else
    {
        //INetFwRule3 is available. Windows Server 2016 Technical Preview or Windows 10.
    }


如果不需要INetFwRuleINetFwRule2的其他功能,则可以在应用程序上降级为INetFwRule3

10-08 08:50