次の方法で共有


管理オブジェクトのコレクションの取得

次に示すのは、System.Management コレクション クラスを使用してコンピュータの環境変数を列挙するコード例です。この例ではローカル コンピュータから情報を取得するため、一部のパラメータは既定値のままで使用できます。この例は、指定したクラス (Win32_Environment) のすべてのオブジェクトのコレクションを返します。コレクションを取得したら、foreach ステートメントを使用してコレクション内の各変数の名前と値を表示することによってコレクションを列挙します。WMI の Scripting API に習熟している場合には、いくつかの類似点があることがわかります。ここでは 2 種類の例を示します。最初の例では、完全列挙を表す最も単純な形式のクエリと共に使用される ManagementObjectSearcher クラスを使用しています。2 番目の例では、Win32_Environment のクラス オブジェクトを取得し、GetInstances() メソッドを使用してそのインスタンスを列挙します。

using System;
using System.Management;

// This example demonstrates how to perform a synchronous instance enumeration.

public class EnumerateInstances {
    public static int Main(string[] args) {
      // Build a query for enumeration of Win32_Environment instances
      SelectQuery query = new SelectQuery("Win32_Environment");

      // Instantiate an object searcher with this query
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 

      // Call Get() to retrieve the collection of objects and loop through it
      foreach (ManagementBaseObject envVar in searcher.Get())
         Console.WriteLine("Variable : {0}, Value = {1}", 
            envVar["Name"],envVar["VariableValue"]);
      return 0;
    }
}

[Visual Basic]
Imports System
Imports System.Management
' This example demonstrates how to perform a synchronous instance enumeration.

Public Class EnumerateInstances  
   Overloads Public Shared Function Main(args() As String) As Integer
      ' Build a query for enumeration of Win32_Environment instances
      Dim query As New SelectQuery("Win32_Environment")

      ' Instantiate an object searcher with this query
      Dim searcher As New ManagementObjectSearcher(query)

      ' Call Get() to retrieve the collection of objects and loop through it
      Dim envVar As ManagementBaseObject
      For Each envVar In  searcher.Get()
         Console.WriteLine("Variable : {0}, Value = {1}", _
            envVar("Name"), envVar("VariableValue"))
      Next envVar
      Return 0
   End Function 
End Class

多くの場合は、管理情報へのアクセスは分散環境で実行され、大量のデータ処理を必要とすることがあります。このような処理をサポートするために、管理操作を非同期で実行することもできます。コンピュータ上のすべてのサービスを非同期のコーディング パターンで列挙する例を次に示します。操作を非同期で呼び出すために使用されるメソッドは、結果のコールバックを処理するための ManagementOperationObserver 型の追加のパラメータを使用する同期メソッドをオーバーロードしています。このオブジェクトは、処理結果と処理の完了を通知するイベントを定義します。このイベントに対して、これらのイベントが発生したときに実行するハンドラをサブスクライブします。

using System;
using System.Management;

// This example demonstrates how to perform an asynchronous instance enumeration.

public class EnumerateInstancesAsync {
    public static int Main(string[] args) {
      //Enumerate asynchronously using Object Searcher
      //===============================================

      //Instantiate an object searcher with the query
      ManagementObjectSearcher searcher = 
         new ManagementObjectSearcher(new SelectQuery("Win32_Service")); 

      // Create a results watcher object, and handler for results and completion
      ManagementOperationObserver results = new ManagementOperationObserver();
      ObjectHandler objectHandler = new ObjectHandler();

      // Attach handler to events for results and completion
      results.ObjectReady += new ObjectReadyEventHandler(objectHandler.NewObject);
      results.Completed += new CompletedEventHandler(objectHandler.Done);

      //Call the asynchronous overload of Get() to start the enumeration
      searcher.Get(results);
         
      //Do something else while results arrive asynchronously
      while (!objectHandler.IsCompleted) {
         System.Threading.Thread.Sleep (1000);
      }

      objectHandler.Reset();
      return 0;
   }


   //Handler for asynchronous results
   public class ObjectHandler {
      private bool isCompleted = false;

      public void NewObject(object sender, ObjectReadyEventArgs obj) {
         Console.WriteLine("Service : {0}, State = {1}", 
            obj.NewObject["Name"], obj.NewObject["State"]);
      }

      public bool IsCompleted {
         get { 
            return isCompleted;
         }
      }
      
      public void Reset()   {
         isCompleted = false;
      }

      public void Done(object sender, CompletedEventArgs obj) {
         isCompleted = true;
      }
   }
}

参照

System.Management による管理情報へのアクセス | 管理情報のクエリ | 管理イベントへのサブスクライブと管理イベントの処理 | 管理オブジェクトのメソッドの実行 | リモート管理と接続オプション | 厳密に型指定されたオブジェクトの使用