13

ファイアウォールのチェックに取り組んでいます。次のコードは、既定の Windows ファイアウォールの状態を非常に簡単に確認します。

    INetFwMgr manager = GetFireWallManager();
    bool isFirewallEnabled = manager.LocalPolicy.CurrentProfile.FirewallEnabled;
    if (isFirewallEnabled == false)
    {
      Console.WriteLine("Firewall is not enabled.");
    }
    else
    {
      Consoe.WriteLine("Firewall is enabled.");
    }
    Console.ReadLine();

   private static INetFwMgr GetFireWallManager()
   {
     Type objectType = Type.GetTypeFromCLSID(new Guid(firewallGuid));
     return Activator.CreateInstance(objectType) as INetFwMgr;
   }

問題は、次のようになります。Windows 以外のファイアウォールの状態を確認するにはどうすればよいですか? ファイアウォールが適切に統合されている場合、上記のチェックはまったく同じように機能しますか、それともこれを行うためのより良い方法はありますか? この投稿を確認しました: C# Windows セキュリティ センターの設定とこの投稿: C# - 外部ファイアウォールが有効になっているかどうかを確認する方法 しかし、どちらも比較的役に立たないことが判明しました。

私は WMI API を調べてきましたが、これまでのところかなり混乱しており、MSDN のドキュメントはあまり有望ではありませんでした。私もSelectQueryをいじってみましたが、これまでのところ成功していません。新しい出発点、またはサードパーティのファイアウォールに関するより良いドキュメント/手順を見つけることができる場所で、誰かが私を助けてくれますか?

編集:現在、私はWMI、特にFirewallProduct投稿で提案されているクラスをさらに調査しています。

更新 2:次のスニペットをテストしています。

  string wmiNameSpace = "SecurityCenter2";
  ManagementScope scope;
  scope = new ManagementScope(String.Format("\\\\{0}\\root\\{1}", "localhost", wmiNameSpace), null);
  scope.Connect();
  ObjectQuery query = new ObjectQuery("SELECT * FROM FirewallProduct");
  ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

しかし、これを実行すると次のエラーが発生し、 Exception Invalid namespace 39 行目を指します ( scope.Connect())。単純にパラメーターを見逃したり、何かを不適切にフォーマットしたりしても、まったく驚かないでしょう。それが何であるかわからないだけです。

UPDATE 3 から に切り替えSecurityCenter2SecurityCenterも、同じinvalid namespaceエラーが発生します。

更新 4 コンソール アプリを別のボックス (winserver08r2 ではなく win7) に移動したところ、期待どおりに適切に報告されました。そのため、現在テストしている VM の問題である可能性があります。次のステップは、アクティブ/非アクティブのステータスを解析することです

更新 5 別の Server08 ボックスでテストされ、同じinvalid namespaceエラーが表示されます。SecurityCenterの代わりに使用SecurityCenter2しても問題は解決しません。ファイアウォールの改ざんを防止するために Windows Server OS が使用する基本的なセキュリティ機能はありますか、それともサーバー OS には WMI 機能の特定のキー セットが付属していませんか?

4

1 に答える 1

11

MicrosoftによるとQ:Windowsセキュリティセンターはサードパーティ製品とそのステータスをどのように検出しますか?

A:Windowsセキュリティセンターは、ステータスの検出に2層のアプローチを使用しています。1つの層は手動で、もう1つの層はWindows Management Instrumentation(WMI)を介して自動です。手動検出モードでは、Windowsセキュリティセンターは、独立したソフトウェアメーカーからMicrosoftに提供されているレジストリキーとファイルを検索します。これらのレジストリキーとファイルにより、Windowsセキュリティセンターは独立したソフトウェアのステータスを検出できます。WMIモードでは、ソフトウェアメーカーは自社の製品ステータスを判断し、そのステータスをWMIプロバイダーを介してWindowsセキュリティセンターに報告します。どちらのモードでも、Windowsセキュリティセンターは次のことが当てはまるかどうかを判断しようとします。

  • ウイルス対策プログラムが存在します。
  • ウイルス対策シグネチャは最新です。
  • ウイルス対策プログラムでは、リアルタイムスキャンまたはオンアクセススキャンがオンになっています。
  • ファイアウォールの場合、Windowsセキュリティセンターは、サードパーティのファイアウォールがインストールされているかどうか、およびファイアウォールがオンになっているかどうかを検出します。

したがって、WMIを使用して、FirewallProductクラスを使用してサードパーティのファイアウォールがインストールされているかどうかを判断できます。以前、このトピックに関する記事を作成し、WMIを使用してこの情報を取得する方法を説明しました。

このサンプルC#を試して、現在のサードパーティファイアウォールの名前と状態をインストールしてください。

using System;
using System.Collections.Generic;
using System.Management;
using System.Text;

namespace GetWMI_Info
{
    class Program
    {
        
        static void Main(string[] args)
        {
            try
            {
                //select the proper wmi namespace depending of the windows version
                string WMINameSpace = System.Environment.OSVersion.Version.Major > 5 ? "SecurityCenter2" : "SecurityCenter";
 
                ManagementScope Scope;
                Scope = new ManagementScope(String.Format("\\\\{0}\\root\\{1}", "localhost", WMINameSpace), null);

                Scope.Connect();
                ObjectQuery Query = new ObjectQuery("SELECT * FROM FirewallProduct");
                ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);

                foreach (ManagementObject WmiObject in Searcher.Get())
                {
                    
                    Console.WriteLine("{0,-35} {1,-40}","Firewall Name",WmiObject["displayName"]);                      
                    if (System.Environment.OSVersion.Version.Major < 6) //is XP ?
                    {
                    Console.WriteLine("{0,-35} {1,-40}","Enabled",WmiObject["enabled"]);    
                    }
                    else
                    {
                        Console.WriteLine("{0,-35} {1,-40}","State",WmiObject["productState"]); 
                    }   
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
            }
            Console.WriteLine("Press Enter to exit");
            Console.Read();
        }
    }
}
于 2012-11-29T05:03:21.150 に答える