我编写了一个使用防火墙COM库Interop.NetFwTypeLib
来管理TCP传输规则的Windows服务。两台计算机上的部署不报告问题,但我最近在另一台计算机上安装它并收到异常:
无法将“System .__ ComObject”类型的COM对象强制转换为接口类型“NetFwTypeLib.INetFwRule3”。此操作失败,因为对IID为“{B21563FF-D696-4222-AB46-4E89B73AB34A}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(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
问题:
答案 0 :(得分:2)
感谢@Hans评论,我可以写下这个答案。
阅读MSDN上的文档:
我找到了每个接口支持的最低客户端和服务器。
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.
}
如果您不需要INetFwRule
或INetFwRule2
的额外功能,则可以降级到应用中的INetFwRule3
。