Delen via


Een providermethode aanroepen

Een providermethode is een methode die wordt geïmplementeerd door een WMI-provider (Windows Management Instrumentation). De methode wordt gevonden in een klasse die is gedefinieerd door een provider om gegevens van software of hardware weer te geven. De klasse Win32_Service heeft bijvoorbeeld methoden om services te starten, stoppen, hervatten, onderbreken en wijzigen.

Providermethoden moeten niet worden verward met de volgende typen methoden:

Een providermethode aanroepen met behulp van scripts

Elke automatiseringstaal, zoals VBScript, PowerShell of Perl, kan een WMI-methode aanroepen. Sommige talen kunnen directe toeganggebruiken, maar andere talen moeten SWbemServices.ExecMethod gebruiken om de providermethode indirect uit te voeren.

In de volgende procedure wordt beschreven hoe u een providermethode aanroept met behulp van de Scripting-API en directe toegang.

Een providermethode aanroepen met behulp van de Scripting-API en directe toegang

  1. Gebruik deze methode voor VBScript of PowerShell.

  2. Bepaal of de methode die u wilt uitvoeren, is geïmplementeerd.

    Sommige klassen hebben methoden gedefinieerd die niet worden ondersteund door een provider. Als een methode niet is geïmplementeerd, kunt u deze niet uitvoeren. U kunt bepalen of een methode is geïmplementeerd door te controleren of de methode de Geïmplementeerd kwalificatie heeft. Voor meer informatie, zie WMI-kwalificaties en Toegang tot een WMI-kwalificatie. U kunt ook bepalen of voor een providerklassemethode de Geïmplementeerd kwalificatie is ingesteld door het niet-ondersteunde Wbemtest.exe-hulpprogramma uit te voeren dat beschikbaar is op elk besturingssysteem waarop WMI is geïnstalleerd.

  3. Bepaal of de methode die u wilt uitvoeren een statische methode is of een niet-statische methode.

    Statische methoden zijn alleen van toepassing op WMI-klassen en niet op specifieke exemplaren van een klasse. De methode Maken van de klasse Win32_Process is bijvoorbeeld een statische methode, omdat u deze methode gebruikt om een nieuw proces te maken zonder een exemplaar van deze klasse. Niet-statische methoden zijn alleen van toepassing op exemplaren van een klasse. De methode Terminate van de Win32_Process-klasse is bijvoorbeeld een niet-statische methode, omdat het alleen zinvol is om een proces te beëindigen als er een exemplaar van dat proces bestaat. U kunt bepalen of een methode statisch is door te controleren of de Statische kwalificatie aan de methode is gekoppeld.

  4. Haal de klasse of het exemplaar op die de methode bevat die u wilt uitvoeren.

    Zie WMI-klasse of instantiegegevens ophalenvoor meer informatie.

  5. Stel eventuele beveiligingsinstellingen in die voor de methode nodig zijn.

    U kunt vaak bepalen welke bevoegdheden een methode nodig heeft door de waarden in de Bevoegdheden te onderzoeken kwalificatie van de methode. Voor de Win32_OperatingSystem class Shutdown methode moet u bijvoorbeeld de bevoegdheid SeShutdownPrivilege instellen. Zie Bevoegde bewerkingen uitvoerenvoor meer informatie.

  6. Roep de methode aan en controleer de retourwaarde om te bepalen of de methode is geslaagd.

In het volgende codevoorbeeld wordt een Kladblok-proces gemaakt en wordt de proces-id met directe toegang opgehaald.

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

In de volgende procedure wordt beschreven hoe u een providermethode aanroept met behulp van de Scripting-API en de SWbemServices.ExecMethod.

Een providermethode aanroepen met behulp van de Scripting-API en SWbemServices.ExecMethod-

  1. Haal de WMI-klassedefinitie op om een statische methode uit te voeren. Haal het WMI-klasse-exemplaar op om een niet-statische methode uit te voeren.
  2. Haal de methode op die moet worden uitgevoerd uit de SWbemObject.Methods_ verzameling van uw klasse of exemplaar met behulp van de methode SWbemObjectSet.Item.
  3. Verkrijg een InParameters-object voor de methode en stel de parameters in zoals beschreven in Het maken van InParameters-objecten.
  4. Roep de methode SWbemServices.ExecMethod aan om de retourwaarde uit te voeren en toe te wijzen aan een SWbemObject object om de uitvoerparameters op te slaan.
  5. Controleer de waarden in het object uitvoerparameters om te controleren of de methode correct is uitgevoerd.

In het volgende VBScript-codevoorbeeld wordt dezelfde bewerking uitgevoerd als het vorige script door middel van de indirecte benadering door het aanroepen van 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

In de volgende procedure wordt beschreven hoe u een providermethode aanroept met behulp van C++.

Een providermethode aanroepen met behulp van C++

  1. Verbinding maken met WMI.

    Als u een methode in WMI wilt aanroepen, moet u eerst een werkende verbinding hebben met een WMI-naamruimte. Zie Een WMI-toepassing maken met behulp van C++ en COM initialiseren voor een WMI-toepassingvoor meer informatie.

    In het volgende voorbeeld ziet u hoe u verbinding maakt met WMI. Voor meer informatie over beveiligingsproblemen in WMI-provideroproepen, zie WMI Securityhandhaven.

    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. Roep IWbemServices::GetObject aan om de definitie van de klasse op te halen van de methode die u wilt aanroepen.

    De methode GetObject retourneert een IWbemClassObject aanwijzer die verwijst naar de klassedefinitie.

    hr = pNamespace->GetObject(ClassPath, 0, NULL, &pClass, NULL);
  1. Voor methoden waarvoor invoerparameters zijn vereist, roept u de IWbemClassObject::GetMethod methode aan om het object van de invoerparameterklasse op te halen.

    GetMethod- retourneert een IWbemClassObject aanwijzer die verwijst naar de invoerparameterklasse.

    hr = pClass->GetMethod(MethodName, 0, &pInClass, NULL);
  1. Genereer een exemplaar van de invoerparameterklasse met een aanroep naar de methode IWbemClassObject::SpawnInstance methode.
    hr = pInClass->SpawnInstance(0, &pInInst);
  1. Stel de eigenschappen van de invoerparameterklasse in met een aanroep van de methode IWbemClassObject::Put.
    VARIANT var;
    var.vt = VT_BSTR;
    var.bstrVal= SysAllocString(L"hello");
    hr = pInInst->Put(ArgName, 0, &var, 0);
    VariantClear(&var);
  1. Roep de methode aan met een aanroep naar IWbemServices::ExecMethod of IWbemServices::ExecMethodAsync.

    Bij ExecMethod-retourneert WMI alle uitvoerparameters in de aanroep. Voor ExecMethodAsync-retourneert WMI uitvoerparameters via een aanroep naar IWbemObjectSink. Zie Een methode aanroepenvoor meer informatie.

    hr = pNamespace->ExecMethod(ClassPath, MethodName, 0, NULL, pInInst, &pOutInst, NULL);

De volgende code is een volledig voorbeeld voor het aanroepen van een providermethode.

#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;
}

een methode aanroepen