Aktualisieren einer gesamten Instanz

Die häufigste Methode zum Aktualisieren einer WMI-Klasseninstanz besteht darin, die gesamte Instanz gleichzeitig zu aktualisieren. Durch das Aktualisieren einer gesamten Instanz muss WMI die Instanz nicht in einzelne Eigenschaften analysieren und an Ihre Anwendung senden. Stattdessen kann WMI Ihnen einfach die gesamte Instanz senden. Wenn Sie fertig sind, kann WMI Ihre gesamte geänderte Instanz über die ursprünglichen Instanz kopieren.

Im folgenden Verfahren wird beschrieben, wie Sie eine Instanz mithilfe von PowerShell ändern oder aktualisieren.

So ändern oder aktualisieren Sie eine Instanz mit PowerShell

  1. Rufen Sie eine lokale Kopie des Objekts mit einem Aufruf von Get-WmiObject ab.

    $mySettings = get-WMIObject Win32_WmiSetting
    
  2. Zeigen Sie bei Bedarf die Eigenschaften des Objekts mit einem Aufruf der Properties-Collection an.

    Obwohl nicht erforderlich, möchten Sie möglicherweise den Wert der Eigenschaft kennen, bevor Sie sie ändern.

    $mySettings.Properties
    
  3. Nehmen Sie alle Änderungen an den lokalen Objekteigenschaften vor.

    Dadurch wird nur die lokale Kopie geändert. Um Ihre Änderungen in WMI zu speichern, müssen Sie die gesamte Kopie wieder im WMI-Repository ablegen.

    $mySettings.LoggingLevel = 1
    
  4. Platzieren Sie das Objekt mithilfe eines Aufrufs der Put-Methode wieder im WMI-Repository.

    $mySettings.Put()
    

Im folgenden Verfahren wird beschrieben, wie Sie eine Instanz mithilfe von C# ändern oder aktualisieren.

So ändern oder aktualisieren Sie eine Instanz mithilfe von C# (Microsoft.Management.Infrastructure)

  1. Rufen Sie eine lokale Kopie des Objekts mit einem Aufruf von CimSession.GetInstance ab, wie unter Abrufen einer WMI-Instanz beschrieben.

    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. Zeigen Sie bei Bedarf die Eigenschaften des Objekts mit einem Aufruf der Properties-Collection an.

    Obwohl nicht erforderlich, möchten Sie möglicherweise den Wert der Eigenschaft kennen, bevor Sie sie ändern.

    foreach (CimProperty property in myDisk.CimInstanceProperties)
    {
       Console.WriteLine(property.ToString());
    }
    
    Console.ReadLine();
    
  3. Nehmen Sie alle Änderungen an den lokalen Objekteigenschaften vor.

    Dadurch wird nur die lokale Kopie geändert. Um Ihre Änderungen in WMI zu speichern, müssen Sie die gesamte Kopie wieder im WMI-Repository ablegen.

    myDisk.CimInstanceProperties["VolumeName"].Value = "NewName";
    
  4. Platzieren Sie das Objekt mithilfe eines Aufrufs von CimSession.ModifyInstance wieder im WMI-Repository.

    session.ModifyInstance(Namespace,myDisk);
    

Im folgenden Verfahren wird beschrieben, wie Sie eine Instanz mithilfe von PowerShell ändern oder aktualisieren.

Hinweis

System.Management war der ursprüngliche .NET-Namespace, der für den Zugriff auf WMI verwendet wurde. Die APIs in diesem Namespace sind jedoch im Allgemeinen langsamer und skalieren im Vergleich zu ihren moderneren Microsoft.Management.Infrastructure-Entsprechungen nicht so gut.

 

So ändern oder aktualisieren Sie eine Instanz mithilfe von C# (Microsoft.Management)

  1. Rufen Sie eine lokale Kopie des Objekts mit einem Aufruf von ManagementObject.Get ab.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    myDisk.Get();
    
  2. Zeigen Sie bei Bedarf die Eigenschaften des Objekts mit einem Aufruf der Properties-Collection an.

    Obwohl nicht erforderlich, möchten Sie möglicherweise den Wert der Eigenschaft kennen, bevor Sie sie ändern.

    foreach (PropertyData property in myDisk.Properties)
    {
       Console.WriteLine(property.Name + " " + property.Value);
    }
    
    Console.ReadLine();
    
  3. Nehmen Sie alle Änderungen an den lokalen Objekteigenschaften vor.

    Dadurch wird nur die lokale Kopie geändert. Um Ihre Änderungen in WMI zu speichern, müssen Sie die gesamte Kopie wieder im WMI-Repository ablegen.

    myDisk["VolumeName"] = "newName";
    
  4. Platzieren Sie das Objekt mithilfe eines Aufrufs der Methode ManagementObject.Put wieder im WMI-Repository.

    myDisk.Put();
    

Im folgenden Verfahren wird beschrieben, wie Sie eine Instanz mithilfe von VBScript ändern oder aktualisieren.

So ändern oder aktualisieren Sie eine Instanz mit VBScript

  1. Rufen Sie eine lokale Kopie des Objekts mit einem Aufruf von GetObject ab.

  2. Zeigen Sie bei Bedarf die Eigenschaften des Objekts mit einem Aufruf der Methode Properties_ an.

    Obwohl nicht erforderlich, möchten Sie möglicherweise den Wert der Eigenschaft kennen, bevor Sie sie ändern.

  3. Nehmen Sie alle Änderungen an den Objekteigenschaften mit einem Aufruf der Methode SWbemProperty.Value vor.

    Die Methode Value ändert nur die lokale Kopie. Um Ihre Änderungen in WMI zu speichern, müssen Sie die gesamte Kopie wieder im WMI-Repository ablegen.

  4. Platzieren Sie das Objekt mit einem Aufruf der Methoden SWbemObject.Put_ oder SWbemObject.PutAsync_ wieder in das WMI-Repository.

Wie die Namen andeuten, wird Put_ synchron aktualisiert, während PutAsync_ asynchron aktualisiert wird. Beide Methoden kopieren die ursprüngliche Instanz mit Ihrer geänderten Instanz. Um die asynchrone Verarbeitung nutzen zu können, müssen Sie jedoch ein Objekt SWbemSink erstellen. Weitere Informationen finden Sie unter Aufrufen einer Methode.

Im folgenden Verfahren wird beschrieben, wie Sie eine Instanz mithilfe von C++ ändern oder aktualisieren.

So ändern oder aktualisieren Sie eine Instanz mit C++

  1. Rufen Sie eine lokale Kopie der Instanz mit einem Aufruf von IWbemServices::GetObject oder IWbemServices::GetObjectAsync ab.

  2. Zeigen Sie bei Bedarf die Eigenschaften des Objekts mit einem Aufruf der Methode IWbemClassObject::Get an.

    Obwohl nicht erforderlich, möchten Sie möglicherweise den Wert der Eigenschaft kennen, bevor Sie sie ändern.

  3. Nehmen Sie alle erforderlichen Änderungen an der Kopie mit einem Aufruf von IWbemClassObject::Put vor.

    Die Methode Put ändert nur die lokale Kopie. Um Ihre Änderungen in WMI zu speichern, müssen Sie die gesamte Kopie wieder im WMI-Repository ablegen.

  4. Platzieren Sie Ihre Kopie mit einem Aufruf der Methoden IWbemServices::PutInstance oder IWbemServices::PutInstanceAsync wieder in das WMI-Repository.

    Wie die Namen andeuten, wird PutInstance synchron aktualisiert, während PutInstanceAsync asynchron aktualisiert wird. Beide Methoden kopieren die ursprüngliche Instanz mit Ihrer geänderten Instanz. Um die asynchrone Verarbeitung nutzen zu können, müssen Sie jedoch die Schnittstelle IWbemObjectSink implementieren.

    Beachten Sie, dass ein Aktualisierungsvorgang für eine Instanz, die zu einer Klassenhierarchie gehört, aufgrund eines Fehlers, der eine andere Klasse in der Hierarchie einbezieht, möglicherweise nicht erfolgreich ist. WMI ruft die Methode PutInstanceAsync der einzelnen Anbieter auf, die für die Klassen verantwortlich sind, von denen die Klasse, die die ursprüngliche Instanz besitzt, abgeleitet wird. Wenn einer dieser Anbieter fehlschlägt, schlägt die ursprüngliche Aktualisierungsanforderung fehl. Weitere Informationen finden Sie unter PutInstanceAsync im Abschnitt Hinweise.

Weitere Informationen finden Sie unter Aufrufen einer Anbietermethode.

Hinweis

Da der Rückruf an die Senke möglicherweise nicht auf der Authentifizierungsebene zurückgegeben wird, die der Client benötigt, empfiehlt es sich, anstelle der asynchronen Kommunikation eine halbsynchrone Kommunikation zu verwenden. Weitere Informationen finden Sie unter Aufrufen einer Methode.