Volání metody zprostředkovatele
Metoda zprostředkovatele je metoda, která je implementována poskytovatelem rozhraní WMI (Windows Management Instrumentation). Metoda se nachází ve třídě, kterou definoval poskytovatel, aby reprezentovala data ze softwaru nebo hardwaru. Například třída Win32_Service obsahuje metody pro spuštění, zastavení, obnovení, pozastavení a změnu služeb.
Metody poskytovatele by neměly být zaměňovány s následujícími typy metod:
- Metody systémových tříd rozhraní WMI, jako je metoda GetSD__SystemSecurity.
- Metody objektů v rozhraní API pro skriptování prorozhraní WMI , například SWbemServices.InstancesOf.
- Metody v rozhraní COM API prorozhraní WMI , například IWbemLocator::ConnectServer.
Volání metody zprostředkovatele pomocí skriptů
Jakýkoli automatizační jazyk, jako je VBScript, PowerShell nebo Perl, může volat metodu WMI. Některé jazyky mohou používat přímý přístup, zatímco jiné musí používat , aby SWbemServices.ExecMethod spustily metodu zprostředkovatele nepřímo.
Následující postup popisuje, jak volat metodu zprostředkovatele pomocí skriptovacího rozhraní API a použití přímého přístupu.
Volání metody poskytovatele pomocí API pro skriptování a přímý přístup
Tento přístup použijte pro VBScript nebo PowerShell.
Určete, jestli je implementovaná metoda, kterou chcete provést.
Některé třídy mají definované metody, které poskytovatel nepodporuje. Pokud není implementovaná metoda, nemůžete ji spustit. Můžete určit, zda je metoda implementována kontrolou, zda má metoda Implementovaný kvalifikátor. Další informace naleznete v tématu Kvalifikátory WMI a Přístup k kvalifikátoru WMI. Můžete také určit, zda metoda třídy poskytovatele má nastaven kvalifikátor Implementované spuštěním nástroje Wbemtest.exe, který je nepodporovaný, dostupný v jakémkoli operačním systému s nainstalovaným rozhraním WMI.
Určete, jestli je metoda, kterou chcete provést, statickou metodou nebo nestatickou metodou.
Statické metody se vztahují pouze na třídy služby WMI, nikoli na konkrétní instance třídy. Například metoda Create třídy Win32_Process je statická metoda, protože ji použijte k vytvoření nového procesu bez instance této třídy. Nestatické metody se vztahují pouze na instance třídy. Například Terminate metoda třídy Win32_Process je nestatická metoda, protože dává smysl ukončit proces pouze v případě, že existuje instance tohoto procesu. Pokud je metoda statická, můžete určit tak, že zkontrolujete, jestli je k metodě přidružen kvalifikátor Static.
Načtěte třídu nebo instanci obsahující metodu, kterou chcete spustit.
Další informace naleznete v tématu Načítání dat třídy WMI nebo instančních dat.
Nastavte všechna nastavení zabezpečení, která tato metoda může vyžadovat.
Oprávnění, která metoda vyžaduje, můžete často určit prozkoumáním hodnot kvalifikátoru Oprávnění dané metody. Například Win32_OperatingSystem třída Shutdown metoda vyžaduje, abyste nastavili oprávnění "SeShutdownPrivilege". Další informace naleznete v tématu Provádění privilegovaných operací.
Zavolejte metodu a prozkoumejte vrácenou hodnotu, abyste zjistili, jestli byla metoda úspěšná.
Následující příklad kódu vytvoří proces Poznámkového bloku a získá ID procesu pomocí přímého přístupu.
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
Následující postup popisuje, jak volat metodu zprostředkovatele pomocí Scripting API a SWbemServices.ExecMethod.
Vyvolání metody zprostředkovatele pomocí skriptovacího rozhraní API a SWbemServices.ExecMethod
- Získejte definici třídy WMI pro provedení statické metody. Načtěte instanci třídy WMI, aby se spustila nestatická metoda.
- Načtěte metodu, která se má provést z kolekce SWbemObject.Methods_ vaší třídy nebo instance pomocí metody SWbemObjectSet.Item.
- Získejte InParameters objekt pro metodu a nastavte parametry, jak je popsáno v Konstrukting InParameters Objects.
- Voláním metody SWbemServices.ExecMethod spusťte a přiřaďte návratovou hodnotu objektu SWbemObject pro uložení výstupních parametrů.
- Zkontrolujte hodnoty v objektu výstupních parametrů a ověřte, že se metoda správně spustila.
Následující příklad kódu VBScript provádí stejnou operaci jako předchozí skript nepřímým přístupem voláním 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
Následující postup popisuje, jak volat metodu zprostředkovatele pomocí jazyka C++.
Volat metodu poskytovatele pomocí jazyka C++
Připojte se k rozhraní WMI.
Abyste mohli volat metodu ve službě WMI, musíte mít nejprve funkční připojení k jmennému prostoru rozhraní WMI. Další informace naleznete v tématu Vytvoření aplikace WMI pomocí jazyka C++ a Inicializace COM pro aplikaci WMI.
Následující příklad ukazuje, jak se připojit k rozhraní WMI. Další informace o problémech se zabezpečením volání zprostředkovatele rozhraní WMI najdete v tématu Údržbazabezpečení rozhraní 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);
Zavolejte IWbemServices::GetObject pro načtení definice třídy metody, kterou chcete volat.
Metoda GetObject vrátí ukazatel IWbemClassObject, který odkazuje na definici třídy.
hr = pNamespace->GetObject(ClassPath, 0, NULL, &pClass, NULL);
Pro metody, které vyžadují vstupní parametry, zavolejte metodu IWbemClassObject::GetMethod pro získání vstupního objektu třídy parametru.
GetMethod vrátí ukazatel IWbemClassObject, který odkazuje na vstupní třídu parametru.
hr = pClass->GetMethod(MethodName, 0, &pInClass, NULL);
- Prostřednictvím volání metody IWbemClassObject::SpawnInstance vygenerujte instanci třídy vstupního parametru.
hr = pInClass->SpawnInstance(0, &pInInst);
- Nastavte vlastnosti třídy vstupního parametru voláním metody IWbemClassObject::Put.
VARIANT var;
var.vt = VT_BSTR;
var.bstrVal= SysAllocString(L"hello");
hr = pInInst->Put(ArgName, 0, &var, 0);
VariantClear(&var);
Vyvolejte metodu voláním IWbemServices::ExecMethod nebo IWbemServices::ExecMethodAsync.
Pro ExecMethodvrátí WMI všechny výstupní parametry v rámci volání. Pro ExecMethodAsyncvrací WMI všechny výstupní parametry prostřednictvím volání IWbemObjectSink. Další informace naleznete v tématu Volání metody.
hr = pNamespace->ExecMethod(ClassPath, MethodName, 0, NULL, pInInst, &pOutInst, NULL);
Následující kód je úplný příklad volání metody zprostředkovatele.
#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;
}
Související témata