インスタンス全体の更新

WMI クラス インスタンスを更新する最も一般的な方法は、インスタンス全体を一度に更新することです。 インスタンス全体を更新すれば、WMI はインスタンスを個々のプロパティへと解析し、アプリケーションに送信する必要がありません。 代わりに、WMI は単にインスタンス全体を送信できます。 完了後、WMI は変更されたインスタンス全体を元のインスタンスにコピーできます。

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

PowerShell を使用してインスタンスを変更または更新するには

  1. Get-WmiObject を呼び出して、オブジェクトのローカル コピーを取得します。

    $mySettings = get-WMIObject Win32_WmiSetting
    
  2. 必要な場合は、Properties コレクションを呼び出してオブジェクトのプロパティを表示します。

    必須ではありませんが、変更する前にプロパティの値を確認したい場合もあるでしょう。

    $mySettings.Properties
    
  3. ローカル オブジェクトのプロパティに変更を加えます。

    これにより、ローカル コピーのみが変更されます。 変更を WMI に保存するには、コピー全体を WMI リポジトリに戻す必要があります。

    $mySettings.LoggingLevel = 1
    
  4. Put メソッドの呼び出しを使用して、オブジェクトを WMI リポジトリに戻します。

    $mySettings.Put()
    

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

C# を使用してインスタンスを変更または更新するには (Microsoft.Management.Infrastructure)

  1. WMI インスタンスの取得に関するページで説明されているように、CimSession.GetInstance を呼び出してオブジェクトのローカル コピーを取得します。

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "win32_logicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    diskDrive.CimInstanceProperties.Add(CimProperty.Create("DeviceID", "C:", CimFlags.Key));
    
    CimSession session = CimSession.Create("localhost");
    CimInstance myDisk = session.GetInstance(Namespace, diskDrive);
    
  2. 必要な場合は、Properties コレクションを呼び出してオブジェクトのプロパティを表示します。

    必須ではありませんが、変更する前にプロパティの値を確認したい場合もあるでしょう。

    foreach (CimProperty property in myDisk.CimInstanceProperties)
    {
       Console.WriteLine(property.ToString());
    }
    
    Console.ReadLine();
    
  3. ローカル オブジェクトのプロパティに変更を加えます。

    これにより、ローカル コピーのみが変更されます。 変更を WMI に保存するには、コピー全体を WMI リポジトリに戻す必要があります。

    myDisk.CimInstanceProperties["VolumeName"].Value = "NewName";
    
  4. CimSession.ModifyInstance の呼び出しを使用して、オブジェクトを WMI リポジトリに戻します。

    session.ModifyInstance(Namespace,myDisk);
    

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

注意

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

 

C# を使用してインスタンスを変更または更新するには (Microsoft.Management)

  1. ManagementObject.Get を呼び出して、オブジェクトのローカル コピーを取得します。

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    myDisk.Get();
    
  2. 必要な場合は、Properties コレクションを呼び出してオブジェクトのプロパティを表示します。

    必須ではありませんが、変更する前にプロパティの値を確認したい場合もあるでしょう。

    foreach (PropertyData property in myDisk.Properties)
    {
       Console.WriteLine(property.Name + " " + property.Value);
    }
    
    Console.ReadLine();
    
  3. ローカル オブジェクトのプロパティに変更を加えます。

    これにより、ローカル コピーのみが変更されます。 変更を WMI に保存するには、コピー全体を WMI リポジトリに戻す必要があります。

    myDisk["VolumeName"] = "newName";
    
  4. ManagementObject.Put メソッドの呼び出しを使用して、オブジェクトを WMI リポジトリに戻します。

    myDisk.Put();
    

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

VBScript を使用してインスタンスを変更または更新するには

  1. GetObject を呼び出して、オブジェクトのローカル コピーを取得します。

  2. 必要な場合は、Properties_ メソッドを呼び出してオブジェクトのプロパティを表示します。

    必須ではありませんが、変更する前にプロパティの値を確認したい場合もあるでしょう。

  3. SWbemProperty.Value メソッドを呼び出して、オブジェクト プロパティを変更します。

    Value メソッドは、ローカル コピーのみを変更します。 変更を WMI に保存するには、コピー全体を WMI リポジトリに戻す必要があります。

  4. SWbemObject.Put_ メソッドまたは SWbemObject.PutAsync_ メソッドを呼び出して、オブジェクトを WMI リポジトリに戻します。

名前が示すように、Put_ では同期的に更新が行われますが、PutAsync_ では非同期的に更新が行われます。 どちらのメソッドでも、変更したインスタンスを使用して、元のインスタンスへのコピーが行われます。 ただし、非同期処理を利用するには、SWbemSink オブジェクトを作成する必要があります。 詳細については、メソッドの呼び出しに関するページを参照してください。

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

C++ を使用してインスタンスを変更または更新するには

  1. IWbemServices::GetObject または IWbemServices::GetObjectAsync を呼び出して、インスタンスのローカル コピーを取得します。

  2. 必要な場合は、IWbemClassObject::Get を呼び出してオブジェクトのプロパティを表示します。

    必須ではありませんが、変更する前にプロパティの値を確認したい場合もあるでしょう。

  3. IWbemClassObject::Put を呼び出して、コピーに必要な変更を加えます。

    Put メソッドは、ローカル コピーのみを変更します。 変更を WMI に保存するには、コピー全体を WMI リポジトリに戻す必要があります。

  4. IWbemServices::P utInstance メソッドまたは IWbemServices::P utInstanceAsync メソッドを呼び出して、コピーを WMI リポジトリに戻します。

    名前が示すように、PutInstance では同期的に更新が行われますが、PutInstanceAsync では非同期的に更新が行われます。 どちらのメソッドでも、変更したインスタンスを使用して、元のインスタンスへのコピーが行われます。 ただし、非同期処理を利用するには、IWbemObjectSink インターフェイスを実装する必要があります。

    クラス階層に属するインスタンスに対する更新操作は、階層内の別のクラスに関連するエラーが原因で成功しない可能性があることに注意してください。 WMI は、元のインスタンスを所有しているクラスの派生元のクラスを担当する各プロバイダーの PutInstanceAsync メソッドを呼び出します。 これらのプロバイダーのいずれかが失敗した場合、元の更新要求は失敗します。 詳細については、PutInstanceAsync の「解説」セクションを参照してください。

詳細については、「プロバイダー メソッドの呼び出し」を参照してください。

注意

シンクへのコールバックはクライアントが必要とするのと同じ認証レベルでは返されない可能性があるため、非同期ではなく半同期通信を使用することをお勧めします。 詳細については、「メソッドの呼び出し」を参照してください。