Memanggil Metode Penyedia
Metode penyedia adalah metode yang diterapkan oleh penyedia Instrumentasi Manajemen Windows (WMI). Metode ini ditemukan di kelas yang ditentukan oleh penyedia untuk mewakili data dari perangkat lunak atau perangkat keras. Misalnya, kelas Win32_Service memiliki metode untuk memulai, menghentikan, melanjutkan, menjeda, dan mengubah layanan.
Metode penyedia tidak boleh dikacaukan dengan jenis metode berikut:
- Metode pada kelas sistem WMI , seperti metode GetSD pada __SystemSecurity .
- Metode pada objek dalam Scripting API untuk WMI, seperti SWbemServices.InstancesOf.
- Metode dalam COM API untuk WMI, seperti IWbemLocator::ConnectServer.
Memanggil Metode Penyedia Menggunakan Pemrograman Skrip
Bahasa otomatisasi apa pun, seperti VBScript, PowerShell, atau Perl, dapat memanggil metode WMI. Beberapa bahasa dapat menggunakan akses langsung, tetapi yang lain harus menggunakan SWbemServices.ExecMethod untuk menjalankan metode dari penyedia secara tidak langsung.
Prosedur berikut menjelaskan cara memanggil metode penyedia menggunakan Scripting API dan menggunakan akses langsung.
Untuk memanggil metode dari penyedia menggunakan Scripting API dan akses langsung
Gunakan pendekatan ini untuk VBScript atau PowerShell.
Tentukan apakah metode yang ingin Anda jalankan diimplementasikan.
Beberapa kelas memiliki metode yang ditentukan yang tidak didukung oleh penyedia. Jika metode tidak diimplementasikan, Anda tidak dapat menjalankannya. Untuk menentukan apakah metode diimplementasikan, periksa apakah metode memiliki kualifer Diimplementasikan. Untuk informasi selengkapnya, lihat Kualifikasi WMI dan Kualifikasi WMIMengakses. Anda juga dapat menentukan apakah metode kelas penyedia memiliki kualifikasi yang diimplementasikan dengan menjalankan utilitas Wbemtest.exe yang tidak didukung, tersedia pada sistem operasi apa pun dengan WMI yang diinstal.
Tentukan apakah metode yang ingin Anda jalankan adalah metode statis atau metode nonstatis.
Metode statis hanya berlaku untuk kelas WMI dan bukan untuk instans kelas tertentu. Misalnya, metode Create dari kelas Win32_Process adalah metode statis karena menggunakannya untuk membuat proses baru tanpa instans kelas ini. Metode nonstatis hanya berlaku untuk instans kelas. Misalnya, metode Hentikan kelas Win32_Process adalah metode nonstatis karena hanya masuk akal untuk mengakhiri proses jika ada instans proses tersebut. Anda dapat menentukan apakah suatu metode bersifat statis dengan memeriksa apakah pengait Statis dikaitkan dengan metode tersebut.
Ambil kelas atau instans yang berisi metode yang ingin Anda jalankan.
Untuk informasi lebih lanjut, lihat Mengambil Data Kelas atau Instans WMI.
Siapkan pengaturan keamanan apa pun yang mungkin diperlukan metode.
Anda sering dapat menentukan hak istimewa yang diperlukan metode dengan memeriksa nilai dalam Hak Istimewa kualifikasi metode. Misalnya, metode Shutdown dari kelas Win32_OperatingSystem mengharuskan Anda untuk mengatur hak istimewa "SeShutdownPrivilege". Untuk informasi selengkapnya, lihat Menjalankan Operasi Istimewa.
Panggil metode dan periksa nilai pengembalian untuk menentukan apakah metode berhasil.
Contoh kode berikut membuat proses Notepad dan mendapatkan ID proses menggunakan akses langsung.
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer _
& "\root\cimv2:Win32_Process")
Error = objWMIService.Create("notepad.exe", null, _
null, intProcessID)
If Error = 0 Then
Wscript.Echo "Notepad was started with a process ID of " _
& intProcessID & "."
Else
Wscript.Echo "Notepad could not be started due to error " _
& Error & "."
End If
try
{
$myProcess = ([wmiclass]"win32_process").create("notepad.exe", $null, $null)
}
catch
{
"Notepad could not be started due to the following error:"
$error[0]
return
}
#else
"Notepad was started with a process ID of " + $myProcess.ProcessID
Prosedur berikut menjelaskan cara memanggil metode penyedia menggunakan Scripting API dan SWbemServices.ExecMethod.
Untuk memanggil metode penyedia menggunakan Scripting API dan SWbemServices.ExecMethod
- Ambil definisi kelas WMI untuk menjalankan metode statis. Ambil instans kelas WMI untuk menjalankan metode nonstatis.
- Ambil metode untuk dijalankan dari koleksi SWbemObject.Methods_ kelas atau instans Anda dengan menggunakan metodeSWbemObjectSet.Item.
- Dapatkan sebuah objek InParameters untuk fungsi metode ini dan siapkan parameter sebagaimana dijelaskan dalam Membuat Objek InParameters.
- Panggil metode SWbemServices.ExecMethod untuk mengeksekusi dan menetapkan nilai pengembalian ke objekSWbemObjectuntuk menyimpan parameter output.
- Periksa nilai dalam objek parameter output untuk memverifikasi bahwa metode dijalankan dengan benar.
Contoh kode VBScript berikut melakukan operasi yang sama dengan skrip sebelumnya dengan pendekatan tidak langsung melalui panggilan SWBemServices.ExecMethod.
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer _
& "\root\cimv2")
Set objProcess = objWMIService.Get("Win32_Process")
' Obtain an InParameters object specific to
' the Win32_Process.Create method.
Set objInParam = _
objProcess.Methods_("Create").inParameters.SpawnInstance_()
' Add the input parameters.
objInParam.Properties_.item("CommandLine") = "Notepad"
objInParam.Properties_.item("CurrentDirectory") = NULL
objInParam.Properties_.item("ProcessStartupInformation") = NULL
Set objOutParams = objProcess.ExecMethod_("Create", objInParam)
If Error = 0 Then
Wscript.Echo "Notepad was started with a process ID of " _
& objOutParams.ProcessId
Else
Wscript.Echo "Notepad could not be started due to error " & _
objOutParams.ReturnValue
End If
Prosedur berikut menjelaskan cara memanggil metode penyedia menggunakan C++.
Untuk memanggil metode penyedia menggunakan C++
Sambungkan ke WMI.
Untuk memanggil metode di WMI, pertama-tama Anda harus memiliki koneksi yang berfungsi ke namespace layanan WMI. Untuk informasi selengkapnya, lihat Membuat Aplikasi WMI Menggunakan C++ dan Menginisialisasi COM untuk aplikasi WMI.
Contoh berikut menunjukkan cara menyambungkan ke WMI. Untuk informasi selengkapnya tentang masalah keamanan dalam panggilan penyedia WMI, lihat Mempertahankan Keamanan WMI.
HRESULT hr = CoInitialize(0);
hr = CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
NULL);
hr = CoCreateInstance(CLSID_WbemLocator, 0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLocator);
hr = pLocator->ConnectServer(path, NULL, NULL,
NULL, 0, NULL, NULL, &pNamespace);
Panggil IWbemServices::GetObject untuk mengambil definisi kelas metode yang ingin Anda panggil.
Metode GetObject mengembalikan pointerIWbemClassObject yang menunjuk ke definisi kelas.
hr = pNamespace->GetObject(ClassPath, 0, NULL, &pClass, NULL);
Untuk metode yang memerlukan parameter input, panggil metode IWbemClassObject::GetMethod untuk mendapatkan objek kelas parameter input.
GetMethod mengembalikan pointerIWbemClassObject yang menunjuk ke kelas parameter input.
hr = pClass->GetMethod(MethodName, 0, &pInClass, NULL);
hr = pInClass->SpawnInstance(0, &pInInst);
- Atur properti kelas parameter input dengan panggilan ke metode IWbemClassObject::Put.
VARIANT var;
var.vt = VT_BSTR;
var.bstrVal= SysAllocString(L"hello");
hr = pInInst->Put(ArgName, 0, &var, 0);
VariantClear(&var);
Panggil metode dengan panggilan ke IWbemServices::ExecMethod atau IWbemServices::ExecMethodAsync.
Untuk ExecMethod, WMI mengembalikan setiap parameter keluaran dalam panggilan tersebut. Untuk ExecMethodAsync, WMI mengembalikan parameter output apa pun melalui panggilan ke IWbemObjectSink. Untuk informasi selengkapnya, silakan lihat Memanggil Metode.
hr = pNamespace->ExecMethod(ClassPath, MethodName, 0, NULL, pInInst, &pOutInst, NULL);
Kode berikut adalah contoh lengkap untuk memanggil metode penyedia.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
int main(int iArgCnt, char ** argv)
{
IWbemLocator *pLocator = NULL;
IWbemServices *pNamespace = 0;
IWbemClassObject * pClass = NULL;
IWbemClassObject * pOutInst = NULL;
IWbemClassObject * pInClass = NULL;
IWbemClassObject * pInInst = NULL;
BSTR path = SysAllocString(L"root\\default");
BSTR ClassPath = SysAllocString(L"TestMeth");
BSTR MethodName = SysAllocString(L"Echo");
BSTR ArgName = SysAllocString(L"sInArg");
BSTR Text;
// Initialize COM and connect to WMI.
HRESULT hr = CoInitialize(0);
hr = CoInitializeSecurity(NULL, -1, NULL, NULL,RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLocator);
hr = pLocator->ConnectServer(path, NULL, NULL, NULL, 0, NULL, NULL, &pNamespace);
// Get the class object for the method definition.
hr = pNamespace->GetObject(ClassPath, 0, NULL, &pClass, NULL);
// Get the input-argument class object and
// create an instance.
hr = pClass->GetMethod(MethodName, 0, &pInClass, NULL);
hr = pInClass->SpawnInstance(0, &pInInst);
// Set the property.
VARIANT var;
var.vt = VT_BSTR;
var.bstrVal= SysAllocString(L"hello");
hr = pInInst->Put(ArgName, 0, &var, 0);
VariantClear(&var);
// Call the method.
hr = pNamespace->ExecMethod(ClassPath, MethodName, 0, NULL, pInInst, &pOutInst, NULL);
// Display the results. Note that the return
// value is in the property "ReturnValue"
// and the returned string is in the
// property "sOutArg".
hr = pOutInst->GetObjectText(0, &Text);
printf("\nThe object text is:\n%S", Text);
// Free up resources.
SysFreeString(path);
SysFreeString(ClassPath);
SysFreeString(MethodName);
SysFreeString(ArgName);
SysFreeString(Text);
pClass->Release();
pInInst->Release();
pInClass->Release();
pOutInst->Release();
pLocator->Release();
pNamespace->Release();
CoUninitialize();
printf("Terminating normally\n");
return 0;
}
Topik terkait