2016-05-13 205 views
1

ファイアウォールCOMライブラリInterop.NetFwTypeLibを使用してTCP送信のルールを管理するWindowsサービスを作成しました。 2台のマシンの展開では、問題を報告していないが、私は別のコンピュータ上で、最近それをインストールし、例外を受け取る:タイプ 'System .__ ComObject'のCOMオブジェクトをSTAThread属性でキャストできません

Unable to cast COM object of type 'System.__ComObject' to interface type 'NetFwTypeLib.INetFwRule3'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{B21563FF-D696-4222-AB46-4E89B73AB34A}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))

この記事を読んで後:

セット私はこの問題を解決するこれでどうかをテストするには、このコードの主な方法が、任意の解決なしに210:私は驚きました

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を見つけるために、このスクリプトを実行し、戻りません行ってきました

**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 

情報をコンピュータどこから:作品とは動作しません。:

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

これらは、サービスが動作するコンピュータからの情報であり、両方のコンピュータ、上の任意の結果サービスに障害が発生した:

**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を更新するには十分ですが、レジストリに矛盾があると少し危険ですか?
+1

Windows 8とServer 2012でINetFwRule3インターフェイスが追加されたという単純な説明です。「Windows Server 2011」とは何ができるのでしょうか。確かに1ではありません。INetFwRule2に制限する必要があります。もっと少なく。 Fwiw、HKCR \ CLSIDキーはクラスguidのホームであり、インターフェースのGUIDではありません。 –

+0

あなたのお勧めを試し、INetFwRule2インターフェースのOSの制限を知っていますか? – Joseph

+1

RTFMだけで、インターフェイスのMSDN記事の一番下を見てください。 –

答えて

1

@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. 
    } 

あなたがINetFwRule2またはINetFwRule3の余分な機能を必要としない場合は、アプリケーションにINetFwRuleにダウングレードすることができます。

関連する問題