WMI メソッドの呼び出し
WMI では、情報を取得したり、エンタープライズ システム内のオブジェクトを操作したりするための COM API のメソッドとスクリプト API を提供しています。 たとえば、WMI スクリプト メソッドSWbemServices.ExecQuery はデータのクエリを行います。 プロバイダーにも、登録するクラスで定義されたメソッドがあります。 Win32 プロバイダーによって提供される、Win32_LogicalDisk のメソッド Chkdsk と ScheduleAutoChk などがその例です。
このトピックでは次のセクションを扱います。
WMI メソッドとプロバイダー メソッドの比較
WMI method 呼び出しをプロバイダー メソッド呼び出しと組み合わせて使用することで、エンタープライズに関する情報を取得して操作できます。 詳細については、「WMI メソッドの呼び出し」と「プロバイダー メソッドの呼び出し」を参照してください。
WMI スクリプト オブジェクト SWbemObject のメソッドは、任意の WMI データ クラスに適用できるため、特別な状態があります。 詳細については、「SWbemObject を使用したスクリプト作成」を参照してください。
次のコード例では、WMI メソッドとプロバイダー メソッドの両方を呼び出します。
WMI 用スクリプト API には、次の WMI メソッドとプロバイダー メソッドがあります。
- objWMIService.ExecQuery は、WMI スクリプト メソッド SWbemServices.ExecQuery を呼び出す
- objService.StopService() は、プロバイダー メソッド Win32_Service.StopService を呼び出す
Win32_Service のリターン コード セクションの "戻り値" に表示される可能性のある コードを検索できます。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service where Name='Alerter'")
For Each objService in colServices
Return = objService.StopService()
If Return <> 0 Then
Wscript.Echo "Failed " &VBNewLine & "Error code = " & Return
Else
WScript.Echo "Succeeded"
End If
Next
$colServices= Get-WmiObject -Class Win32_Service -Filter 'Name = "Alerter"'
foreach ($objService in $colServices)
{
$objService.StopService()
}
WMI でのメソッド呼び出しモード
通常、半同期呼び出しモードでは、セキュリティとパフォーマンスの最適なバランスが提供されます。
使用可能な各モードの詳細については、次を参照してください。
同期モード
同期モードは、メソッド呼び出しが SWbemObjectSet コレクション オブジェクトを返すまでプログラムやスクリプトが一時停止したときに発生します。 WMI は、このコレクションをメモリ内にビルドしてから、呼び出し元のプログラムやスクリプトにコレクション オブジェクトを返します。
同期モードは、プログラムやスクリプトを実行しているコンピューターでプログラムやスクリプトのパフォーマンスに悪影響を及ぼす可能性があります。 たとえば、イベント ログから何千ものイベントを同期的に取得すると、時間がかかり、多くのメモリを使用する可能性があります。WMI は各イベントからオブジェクトを作成し、それらのオブジェクトをコレクションに格納した後、コレクションを メソッドに渡すためです。
同期モードでは。大きなデータ セットを返すことがないメソッドのみを呼び出すようにする必要があります。 次の SWbemServices のメソッドは、同期モードで安全に呼び出すことができます。
名前に "Async" という単語がない SWbemServices のメソッドは、iFlags パラメーターに wbemFlagReturnWhenComplete 値を設定することで、同期モードで呼び出すことができます。
非同期モード
非同期モードは、メソッドを呼び出した後もプログラムやスクリプトが引き続き実行されるときに発生します。 WMI は、各オブジェクトが作成されると、メソッドから SWbemSink オブジェクトにすべてのオブジェクトを返します。 呼び出し元のプログラムやスクリプトには、返されたオブジェクトを処理するために SWbemSink オブジェクトと SWbemSink.OnObjectReady イベント ハンドラーが必要です。 非同期モードのイベント ハンドラーの作成の詳細については、「WMI イベントの受信」を参照してください。
このモードには同期モードのパフォーマンスとリソースの不利益はありませんが、SWbemSink オブジェクトに格納された結果が呼び出し元のプログラムやスクリプトからのものではない可能性があるため、非同期モードでは重大なセキュリティ リスクが発生する可能性があります。 WMI は、メソッドが成功するまで SWbemSink オブジェクトの認証レベルを下げます。 これらのセキュリティ リスクを軽減する方法の詳細については、「非同期呼び出しでのセキュリティの設定」を参照してください。
Async という単語が付加されたメソッドは、非同期モードのメソッドです。 次のメソッドは非同期呼び出しです。
- SWbemServices.AssociatorsOfAsync
- SWbemServices.DeleteAsync
- SWbemServices.ExecMethodAsync
- SWbemServices.ExecNotificationQueryAsync
- SWbemServices.ExecQueryAsync
- SWbemServices.InstancesOfAsync
- SWbemServices.ReferencesToAsync
- SWbemServices.SubclassesOfAsync
非同期モードの詳細については、次を参照してください。
半同期モード
半同期モードは、メソッドを呼び出した後もプログラムやスクリプトが引き続き実行されるという点で、非同期モードに似ています。 半同期モードでは、スクリプトやプログラムの実行が続行され、WMI はバックグラウンドでオブジェクトを取得します。 WMI は、呼び出し元のメソッドに返される各オブジェクトを、オブジェクトが作成されるとすぐに返します。
WMI がオブジェクトを管理するため、半同期モードの方が非同期モードよりもセキュリティが高くなります。 ただし、1,000 を超えるインスタンスで半同期モードを使用すると、使用可能なリソースがインスタンスの取得によって独占され、プログラムやスクリプトのパフォーマンス、プログラムやスクリプトを使用するコンピューターのパフォーマンスが低下する可能性があります。 各オブジェクトは、メモリが解放されるまで必要なリソースを占有します。
この条件を回避するには、iFlags パラメーターを wbemFlagForwardOnly フラグと wbemFlagReturnImmediately フラグと共に設定してメソッドを呼び出して、WMI に順方向専用の SWbemObjectSet を返すように指示します。 順方向専用の SWbemObjectSet によって、オブジェクトの列挙後にメモリを解放することで、大きなデータ セットによって発生するパフォーマンスの問題が解消されます。
同期モードでも非同期モードでも呼び出すことができない SWbemServices メソッドは、半同期モードで呼び出されます。
次のメソッドは、半同期モードで呼び出されます。
- SWbemServices.AssociatorsOf
- SWbemServices.Delete
- SWbemServices.ExecMethod
- SWbemServices.ExecNotificationQuery
- SWbemServices.ExecQuery
- SWbemServices.Get
- SWbemServices.InstancesOf
- SWbemServices.ReferencesTo
- SWbemServices.SubclassesOf
- SWbemServices.Put
半同期モードの詳細については、「C++ を使用した半同期呼び出しの作成」と「VBScript を使用した半同期呼び出しの作成」を参照してください。
関連トピック