Bagikan melalui


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:

Memanggil Metode Penyedia Menggunakan Scripting

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 penyedia secara tidak langsung.

Prosedur berikut menjelaskan cara memanggil metode penyedia menggunakan Scripting API dan menggunakan akses langsung.

Untuk memanggil metode penyedia menggunakan Scripting API dan akses langsung

  1. Gunakan pendekatan ini untuk VBScript atau PowerShell.

  2. 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. Anda dapat menentukan apakah metode diimplementasikan dengan memeriksa apakah metode memiliki kualifikasi yang Diimplementasikan . Untuk informasi selengkapnya, lihat Pengkualifikasi WMI dan Mengakses Kualifikasi WMI. Anda juga dapat menentukan apakah metode kelas penyedia memiliki kualifikasi yang Diimplementasikan yang ditetapkan dengan menjalankan utilitas Wbemtest.exe yang tidak didukung, tersedia pada sistem operasi apa pun dengan WMI yang diinstal.

  3. 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 Buat 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 dari kelas Win32_Process adalah metode nonstatis karena hanya masuk akal untuk mengakhiri proses jika instans proses itu ada. Anda dapat menentukan apakah metode statis dengan memeriksa apakah kualifikasi Statis dikaitkan dengan metode .

  4. Ambil kelas atau instans yang berisi metode yang ingin Anda jalankan.

    Untuk informasi selengkapnya, lihat Mengambil Kelas WMI atau Data Instans.

  5. Siapkan pengaturan keamanan apa pun yang mungkin diperlukan metode.

    Anda sering dapat menentukan hak istimewa yang diperlukan metode dengan memeriksa nilai dalam kualifikasi Hak Istimewa metode . Misalnya, metode Shutdown kelas Win32_OperatingSystem mengharuskan Anda mengatur hak istimewa "SeShutdownPrivilege". Untuk informasi selengkapnya, lihat Menjalankan Operasi Istimewa.

  6. 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

  1. Ambil definisi kelas WMI untuk menjalankan metode statis. Ambil instans kelas WMI untuk menjalankan metode nonstatis.
  2. Ambil metode untuk mengeksekusi dari koleksi SWbemObject.Methods_ kelas atau instans Anda dengan menggunakan metode SWbemObjectSet.Item .
  3. Dapatkan objek InParameters untuk metode dan siapkan parameter seperti yang dijelaskan dalam Membuat Objek InParameters.
  4. Panggil metode SWbemServices.ExecMethod untuk mengeksekusi dan menetapkan nilai yang dikembalikan ke objek SWbemObject untuk menyimpan parameter output.
  5. 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++

  1. Sambungkan ke WMI.

    Untuk memanggil metode di WMI, pertama-tama Anda harus memiliki koneksi kerja ke namespace 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 Memelihara 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);
  1. Panggil IWbemServices::GetObject untuk mengambil definisi kelas metode yang ingin Anda panggil.

    Metode GetObject mengembalikan pointer IWbemClassObject yang menunjuk ke definisi kelas.

    hr = pNamespace->GetObject(ClassPath, 0, NULL, &pClass, NULL);
  1. Untuk metode yang memerlukan parameter input, panggil metode IWbemClassObject::GetMethod untuk mendapatkan objek kelas parameter input.

    GetMethod mengembalikan pointer IWbemClassObject yang menunjuk ke kelas parameter input.

    hr = pClass->GetMethod(MethodName, 0, &pInClass, NULL);
  1. Buat instans kelas parameter input dengan panggilan ke metode IWbemClassObject::SpawnInstance .
    hr = pInClass->SpawnInstance(0, &pInInst);
  1. Atur properti kelas parameter input dengan panggilan ke metode IWbemClassObject::P ut .
    VARIANT var;
    var.vt = VT_BSTR;
    var.bstrVal= SysAllocString(L"hello");
    hr = pInInst->Put(ArgName, 0, &var, 0);
    VariantClear(&var);
  1. Panggil metode dengan panggilan ke IWbemServices::ExecMethod atau IWbemServices::ExecMethodAsync.

    Untuk ExecMethod, WMI mengembalikan parameter output apa pun dalam panggilan. Untuk ExecMethodAsync, WMI mengembalikan parameter output apa pun melalui panggilan ke IWbemObjectSink. Untuk informasi selengkapnya, 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;
}

Memanggil Metode