インスタンスの一部の更新

場合によっては、インスタンスの一部のみを更新する必要があります。 たとえば、一部のインスタンスに多数のプロパティが含まれているとします。 このような多数のインスタンスを更新する必要がある場合、システム パフォーマンスが低下することがあります。 そのため、インスタンスの一部のみを更新し、WMI との間で送受信する必要がある情報の量を減らすことができます。 ただし、WMI は部分インスタンス操作を直接サポートしておらず、ほとんどのプロバイダーもサポートしていません。 したがって、部分インスタンス操作を使用するアプリケーションを作成する場合は、C++ の WBEM_E_PROVIDER_NOT_CAPABLE または WBEM_E_NOT_SUPPORTED エラー コードでの呼び出しの失敗に備えて準備してください。 スクリプト言語でのエラー コードは、wbemErrProviderNotCapable または wbemErrNotSupported のいずれかになります。

スクリプトでは、この操作は、エンタープライズ上の非常に多くのオブジェクトで 1 つまたは 2 つの書き込み可能なプロパティを更新する場合にのみ、パフォーマンスを向上させるために必要です。 それ以外の場合、通常の VBScript は、SWbemObject.Put_ または SWbemObject.PutAsync_ を呼び出します。これは、オブジェクト全体を書き込んでいるように見えますが、実際にはプロバイダーが書き込み可能なプロパティのみを更新しています。

次の手順では、PowerShell を使用して部分インスタンス更新を要求する方法について説明します。

PowerShell を使用して部分インスタンスの更新を要求するには

  1. 更新するオブジェクトのパスを取得します。

    パスは手動で記述するか、またはオブジェクトに対してクエリを実行してから __Path プロパティを取得することができます。

    $myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path
    #or
    $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
    
  2. 更新するプロパティの名前を一覧表示するハッシュ テーブルを設定し、Set-WmiInstance の呼び出しでこのハッシュ テーブルを使用します。

    $newDriveName = @{VolumeName = "OSDisk"}
    Set-WmiInstance -Path $myWMIDrivePath -Arguments $newDriveName
    

次の手順では、C# を使用して部分インスタンス更新を要求する方法について説明します。

注意

System.Management は、元来 WMI へのアクセスに使用されていた .NET 名前空間でした。しかし、この名前空間の API は一般に、より最しい Microsoft.Management.Infrastructure の対応する API と比較して低速で、拡張性も劣ります。

 

C# を使用して部分インスタンスの更新を要求するには

  1. 更新する特定のインスタンスを表す新しい ManagementObject オブジェクトを作成します。

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    
  2. ManagementObject.SetPropertyValue の呼び出しでプロパティ値を設定します。

    myDisk.SetPropertyValue("VolumeName", "OSDisk");
    

次の手順では、VBScript を使用して部分インスタンス更新を要求する方法について説明します。

VBScript を使用して部分インスタンスの更新を要求するには

  1. SWbemNamedValueSet コンテキスト オブジェクトを作成します。

    Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
    
  2. SWbemNamedValueSet.Add メソッドを使用して、Put 拡張値 "__PUT_EXTENSIONS" と "__PUT_EXT_CLIENT_REQUEST" をコンテキスト オブジェクトに追加します。

    objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True
    objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
    
  3. 更新するプロパティの名前を一覧表示する配列を設定し、Put 拡張値 "__PUT_EXT_PROPERTIES" を持つ SWbemNamedValueSet コンテキスト オブジェクトにこの配列を追加します。

    arProperties = Array("propertyname1", "propertyname2") 
    objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
    
  4. SWbemObject.Put_ 呼び出しの iFlags パラメーターを wbemChangeFlagUpdateOnly に設定します。 このフラグがないと、呼び出しは無効なコンテキストで失敗します。

  5. SWbemObject.Put_ または SWbemObject.PutAsync のいずれかの objwbemNamedValueSet パラメーターで、フラグとコンテキスト オブジェクトをプロバイダーに渡します。

    call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
    

次の手順では、C++ を使用して部分インスタンス更新を要求する方法について説明します。

C++ を使用して部分インスタンスの更新を要求するには

  1. CoCreateInstance を呼び出して IWbemContext オブジェクトを作成します。

    コンテキスト オブジェクトは、WMI プロバイダーに詳細情報を渡すために WMI が使用するオブジェクトです。 この場合、IWbemContext オブジェクトを使用して、部分インスタンス更新を受け入れるようにプロバイダーに指示します。

  2. IWbemContext::SetValue を呼び出して、名前付きの値 "__PUT_EXTENSIONS" と "__PUT_EXT_CLIENT_REQUEST" を IWbemContext オブジェクトに追加します。

    次の表に、"__PUT_EXTENSIONS" と "__PUT_EXT_CLIENT_REQUEST" の意味を示します。

    名前付きの値 説明
    "__PUT_EXTENSIONS" VARIANT_TRUE に設定された VT_BOOL。 他のコンテキスト値の 1 つ以上が指定されていることを示す値。 これにより、プロバイダー内のコンテキスト オブジェクトを簡単にチェックして、部分インスタンス更新が使用されているかどうかを判断することができます。
    "__PUT_EXT_CLIENT_REQUEST" VARIANT_TRUE に設定された VT_BOOL。 最初の要求中にクライアントによって設定されます。 この値は、再入エラーを防ぐために使用されます。

     

  3. IWbemContext::SetValue を別に呼び出して、必要に応じて任意の組み合わせで __PUT_EXT_STRICT_NULLS、__PUT_EXT_PROPERTIES、または __PUT_EXT_ATOMIC を IWbemContext オブジェクトに追加します。

    次の表に、名前付きの値の意味を示します。

    名前付きの値 説明
    "__PUT_EXT_STRICT_NULLS" VARIANT_TRUE に設定された VT_BOOL。 クライアントが意図的にプロパティを VT_NULL に設定し、書き込み操作の成功を想定していることを示します。 プロバイダーが値を NULL に設定できない場合は、エラーを報告します。
    "__PUT_EXT_PROPERTIES" 更新するプロパティ名のリストを含む文字列の SAFEARRAY。 単独で使用することも、"__PUT_EXT_PROPERTIES" と組み合わせて使用することもできます。 値は、書き込まれるインスタンス内にあります。
    "__PUT_EXT_ATOMIC" VARIANT_TRUE に設定された VT_BOOL。 すべての更新が同時に成功するか (アトミック セマンティクス)、プロバイダーが元に戻す必要があることを示します。 部分的な成功はあり得ません。 単独で使用することも、他のフラグと組み合わせて使用することもできます。

     

  4. iFlags パラメーターを WBEM_FLAG_UPDATE_ONLY に設定します。 このフラグがないと、呼び出しは無効なコンテキストで失敗します。

  5. IWbemContext コンテキスト オブジェクトを、pCtx パラメーターの IWbemServices::PutInstance または IWbemServices::PutInstanceAsync の呼び出しに渡します。

    IWbemContext オブジェクトを渡すと、部分インスタンスの更新を許可するようにプロバイダーに指示します。 完全なインスタンス更新では、pCtxNULL に設定します。

    呼び出しに存在するコンテキスト オブジェクトに "__PUT_EXTENSIONS" が含まれていない場合、プロバイダーが必要なプロパティを書き込むことがあります。 コンテキスト オブジェクトに "__PUT_EXTENSIONS" が存在する場合、WMI では、プロバイダーが操作のセマンティクスに正確に従うか、そうでなければ、呼び出しの失敗が要求されます。 詳細については、「プロバイダーでのアクセス拒否メッセージの処理」を参照してください。