Bagikan melalui


Memperbarui Bagian Instans

Terkadang, Anda mungkin hanya ingin memperbarui sebagian instans. Misalnya, beberapa instans memiliki sejumlah besar properti. Jika Anda harus memperbarui sejumlah besar instans ini, Anda dapat mengurangi performa sistem. Oleh karena itu, Anda dapat memilih untuk memperbarui hanya sebagian instans, dan dengan demikian mengurangi jumlah informasi yang harus Anda kirim dan ambil ke dan dari WMI. Namun, WMI tidak secara langsung mendukung operasi instans parsial, juga tidak sebagian besar penyedia. Oleh karena itu, jika Anda menulis aplikasi yang menggunakan operasi instans parsial, bersiaplah agar panggilan Anda gagal dengan kode kesalahan WBEM_E_PROVIDER_NOT_CAPABLE atau WBEM_E_NOT_SUPPORTED di C++. Dalam bahasa skrip, kode kesalahannya adalah wbemErrProviderNotCapable atau wbemErrNotSupported.

Dalam pembuatan skrip, operasi ini hanya diperlukan untuk membantu performa saat memperbarui satu atau dua properti yang dapat ditulis dalam sejumlah besar objek melalui perusahaan. Jika tidak, panggilan VBScript normal ke SWbemObject.Put_ atau SWbemObject.PutAsync_, sambil tampaknya menulis seluruh objek, sebenarnya hanya memperbarui properti yang diaktifkan oleh penyedia untuk menulis.

Prosedur berikut menjelaskan cara meminta pembaruan instans parsial menggunakan PowerShell.

Untuk meminta pembaruan instans parsial menggunakan PowerShell

  1. Ambil jalur objek yang ingin Anda perbarui.

    Anda dapat menjelaskan jalur baik secara manual, atau mengkueri objek lalu mengambil properti __Path .

    $myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path
    #or
    $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
    
  2. Siapkan tabel hash yang mencantumkan nama properti yang akan diperbarui, dan gunakan tabel hash ini dalam panggilan ke Set-WmiInstance.

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

Prosedur berikut menjelaskan cara meminta pembaruan instans parsial menggunakan C#.

Catatan

System.Management adalah namespace .NET asli yang digunakan untuk mengakses WMI; namun, API di namespace ini umumnya lebih lambat dan tidak menskalakan juga relatif terhadap mitra Microsoft.Management.Infrastructure yang lebih modern.

 

Untuk meminta pembaruan instans parsial menggunakan C #

  1. Buat objek ManagementObject baru yang mewakili instans tertentu untuk diperbarui.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    
  2. Atur nilai properti dengan panggilan ke ManagementObject.SetPropertyValue.

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

Prosedur berikut menjelaskan cara meminta pembaruan instans parsial menggunakan VBScript.

Untuk meminta pembaruan instans parsial menggunakan VBScript

  1. Buat objek konteks SWbemNamedValueSet .

    Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
    
  2. Tambahkan nilai Put extension "__PUT_EXTENSIONS" dan "__PUT_EXT_CLIENT_REQUEST" ke objek konteks menggunakan metode SWbemNamedValueSet.Add .

    objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True
    objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
    
  3. Siapkan array yang mencantumkan nama properti yang akan diperbarui dan tambahkan array ini ke objek konteks SWbemNamedValueSet dengan nilai ekstensi Put "__PUT_EXT_PROPERTIES".

    arProperties = Array("propertyname1", "propertyname2") 
    objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
    
  4. Atur parameter iFlags dari panggilan SWbemObject.Put_ ke wbemChangeFlagUpdateOnly. Tanpa bendera ini, panggilan akan gagal dengan konteks yang tidak valid.

  5. Teruskan bendera dan objek konteks Anda ke penyedia dalam parameter objwbemNamedValueSet dari SWbemObject.Put_ atau SWbemObject.PutAsync_.

    call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
    

Prosedur berikut menjelaskan cara meminta pembaruan instans parsial menggunakan C++.

Untuk meminta pembaruan instans parsial menggunakan C++

  1. Buat objek IWbemContext dengan panggilan ke CoCreateInstance.

    Objek konteks adalah objek yang digunakan WMI untuk meneruskan informasi lebih lanjut ke penyedia WMI. Dalam hal ini, Anda menggunakan objek IWbemContext untuk menginstruksikan penyedia untuk menerima pembaruan instans parsial.

  2. Tambahkan nilai bernama "__PUT_EXTENSIONS" dan "__PUT_EXT_CLIENT_REQUEST" ke objek IWbemContext dengan panggilan ke IWbemContext::SetValue.

    Tabel berikut mencantumkan arti "__PUT_EXTENSIONS" dan "__PUT_EXT_CLIENT_REQUEST".

    Nilai bernama Deskripsi
    "__PUT_EXTENSIONS" VT_BOOL diatur ke VARIANT_TRUE. Nilai yang menunjukkan bahwa satu atau beberapa nilai konteks lainnya telah ditentukan. Ini memungkinkan pemeriksaan cepat objek konteks di dalam penyedia untuk menentukan apakah pembaruan instans parsial sedang digunakan.
    "__PUT_EXT_CLIENT_REQUEST" VT_BOOL diatur ke VARIANT_TRUE. Diatur oleh klien selama permintaan awal. Nilai ini digunakan untuk mencegah kesalahan reentrancy.

     

  3. Tambahkan __PUT_EXT_STRICT_NULLS, __PUT_EXT_PROPERTIES, atau __PUT_EXT_ATOMIC dalam kombinasi apa pun sesuai kebutuhan ke objek IWbemContext dengan panggilan lain ke IWbemContext::SetValue.

    Tabel berikut ini mencantumkan arti dari nilai bernama.

    Nilai bernama Deskripsi
    "__PUT_EXT_STRICT_NULLS" VT_BOOL diatur ke VARIANT_TRUE. Menunjukkan bahwa klien sengaja mengatur properti ke VT_NULL dan mengharapkan operasi tulis berhasil. Jika penyedia tidak dapat mengatur nilai ke NULL, kesalahan harus dilaporkan.
    "__PUT_EXT_PROPERTIES" SAFEARRAY string yang berisi daftar nama properti yang akan diperbarui. Dapat digunakan sendiri atau dalam kombinasi dengan "__PUT_EXT_PROPERTIES". Nilai dalam instans sedang ditulis.
    "__PUT_EXT_ATOMIC" VT_BOOL diatur ke VARIANT_TRUE. Menunjukkan bahwa semua pembaruan harus berhasil secara bersamaan (semantik atom) atau penyedia harus kembali. Tidak mungkin ada keberhasilan parsial. Dapat digunakan sendiri atau dalam kombinasi dengan bendera lain.

     

  4. Atur parameter iFlags ke WBEM_FLAG_UPDATE_ONLY. Tanpa bendera ini, panggilan akan gagal dengan konteks yang tidak valid.

  5. Teruskan objek konteks IWbemContext ke dalam panggilan apa pun IWbemServices::P utInstance atau IWbemServices::P utInstanceAsync dalam parameter pCtx .

    Meneruskan objek IWbemContext menginstruksikan penyedia untuk mengizinkan pembaruan instans parsial. Dalam pembaruan instans lengkap, Anda akan mengatur pCtx ke NULL.

    Penyedia dapat menulis properti yang diperlukan jika objek konteks yang ada dalam panggilan tidak berisi "__PUT_EXTENSIONS". Jika "__PUT_EXTENSIONS" ada di objek konteks, WMI mengharuskan penyedia untuk mematuhi semantik operasi dengan tepat atau gagal dalam panggilan. Untuk informasi selengkapnya, lihat Menangani Pesan Akses Ditolak di Penyedia.