Meminta Data WMI pada Platform 64-bit

Secara default, aplikasi atau skrip menerima data dari penyedia yang sesuai ketika ada dua versi penyedia. Penyedia 32-bit mengembalikan data ke aplikasi 32-bit, termasuk semua skrip, dan penyedia 64-bit mengembalikan data ke aplikasi yang dikompilasi 64-bit. Namun, aplikasi atau skrip dapat meminta data dari penyedia nondefault, jika ada, dengan memberi tahu WMI melalui bendera pada panggilan metode.

Bendera Konteks

Bendera string __ProviderArchitecture dan __RequiredArchitecture memiliki sekumpulan nilai yang ditangani oleh WMI tetapi tidak ditentukan dalam header SDK atau file pustaka jenis. Nilai ditempatkan dalam parameter konteks untuk memberi sinyal WMI bahwa nilai harus meminta data dari penyedia nondefault.

Berikut ini mencantumkan bendera dan kemungkinan nilainya.

__ProviderArchitecture

Nilai bilangan bulat, baik 32 atau 64, yang menentukan versi 32-bit atau 64-bit.

__RequiredArchitecture

Nilai Boolean yang digunakan selain __ProviderArchitecture untuk memuat paksa versi penyedia yang ditentukan. Jika versi tidak tersedia, WMI mengembalikan kesalahan 0x80041013, wbemErrProviderLoadFailure untuk Visual Basic dan WBEM_E_PROVIDER_LOAD_FAILURE untuk C++. Nilai default untuk bendera ini ketika tidak ditentukan adalah FALSE.

Pada sistem 64-bit yang memiliki versi penyedia berdampingan, aplikasi atau skrip 32-bit secara otomatis menerima data dari penyedia 32-bit, kecuali bendera ini disediakan dan menunjukkan bahwa data penyedia 64-bit harus dikembalikan.

Menggunakan Bendera Konteks

Aplikasi C++ dapat menggunakan antarmuka IWbemContext dengan IWbemServices::ExecMethod untuk mengomunikasikan penggunaan penyedia nondefault ke WMI.

Dalam pembuatan skrip dan Visual Basic, Anda harus membuat objek SWbemNamedValueSet yang berisi bendera untuk parameter objWbemNamedValueSet dari SWbemServices.ExecMethod. Untuk informasi selengkapnya tentang menyiapkan objek parameter untuk panggilan ini, lihat Membuat Objek InParameters dan Mengurai Objek OutParameters.

Anda dapat menjalankan skrip dan aplikasi dengan aman menggunakan bendera konteks di sistem operasi yang lebih lama, karena WMI mengabaikannya dalam sistem yang tidak diimplementasikan. Meskipun versi 32-bit dan 64-bit dari penyedia Registri Sistem ada, perhatikan bahwa hanya satu versi repositori WMI yang ada.

Mengakses Apache Hive Registri Default

Serangkaian contoh berikut menggunakan Penyedia Registri, yang memiliki versi 32-bit dan 64-bit berdampingan yang telah diinstal sebelumnya pada sistem operasi 64-bit. Dalam contoh ini, klien 32-bit mendapatkan data yang dikembalikan oleh penyedia dari simpul 32-bit HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft. Klien 64-bit mendapatkan data yang dikembalikan oleh penyedia dari simpul 64-bit HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Logging.

Skrip menunjukkan cara memanggil metode kelas Registry StdRegProv melalui SWbemServices.ExecMethod untuk mendapatkan data dari sarang registri 32-bit.

Skrip berikut mendapatkan kembali data dari penyedia yang cocok dengan lebar bit pemanggil, dalam hal ini 64 bit, karena ini adalah skrip yang berjalan di bawah Windows Script Host (WSH) 64-bit. Skrip mendapatkan nilai dari simpul registri 64-bit HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Logging daripada simpul 32-bit HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WBEM\CIMOM.

strComputer = "."
Const HKLM = &h80000002
Set objReg = Getobject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer _
    & "\root\default:stdregprov")
'Set up inParameters object
Set Inparams = objReg.Methods_("GetStringValue").Inparameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = "Software\Microsoft\Wbem\CIMOM"
Inparams.Svaluename = "Logging"
set Outparams = objReg.ExecMethod_("GetStringValue", Inparams)

'Show output parameters object and the registry value HKLM\SOFTWARE\
WScript.Echo Outparams.GetObjectText_
WScript.Echo "WMI Logging is set to  " & Outparams.SValue

Jika nilai Pengelogan di hive default diatur ke 1, maka output dari skrip akan terlihat seperti berikut ini:

instance of __PARAMETERS
{
    ReturnValue = 0;
    sValue = "1";
};
WMI Logging is set to 1

Contoh: Secara Khusus Meminta Hive Registri 32-bit pada Komputer 64-bit

Contoh skrip default yang dimodifikasi berikut menggunakan bendera string __ProviderArchitecture untuk meminta akses ke data registri 32-bit pada komputer 64-bit. Penelepon terhubung ke sarang 32-bit terlepas dari apakah itu aplikasi 32 atau 64-bit.

strComputer = "."
Const HKLM = &h80000002
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", 32
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer(strComputer,"root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv") 

Set Inparams = objStdRegProv.Methods_("GetStringValue").Inparameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = "Software\Microsoft\Wbem\CIMOM"
Inparams.Svaluename = "Logging"
set Outparams = objStdRegProv.ExecMethod_("GetStringValue", Inparams,,objCtx)

'show output parameters object and the registry value HKLM\SOFTWARE\
WScript.Echo Outparams.GetObjectText_
WScript.Echo "WMI Logging is set to  " & Outparams.SValue

Contoh: Memaksa WMI untuk Mengakses Hive Registri 32-bit di Komputer 64-bit

Modifikasi skrip berikut di atas dengan menambahkan bendera __ProviderArchitecture dan __RequiredArchitecture ke parameter konteks memaksa WMI memuat penyedia 32-bit dan mendapatkan data 32-bit. Jika penyedia tidak ada, maka terjadi kesalahan beban penyedia. Objek konteks harus disediakan dalam koneksi ke WMI dengan memanggil SWbemLocator.ConnectServer.

strComputer = "."
Const HKLM = &h80000002
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", 32
objCtx.Add "__RequiredArchitecture", TRUE
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer(strComputer,"root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv") 

' Use ExecMethod to call the GetStringValue method
Set Inparams = objStdRegProv.Methods_("GetStringValue").Inparameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = "Software\Microsoft\Wbem\CIMOM"
Inparams.Svaluename = "Logging"
set Outparams = objStdRegProv.ExecMethod_("GetStringValue", Inparams,,objCtx)

'Show output parameters object and the registry value HKLM\SOFTWARE\
WScript.Echo Outparams.GetObjectText_
WScript.Echo "WMI Logging is set to  " & Outparams.SValue

Mendapatkan dan Menyediakan Data di Komputer 64-bit