Pobieranie części instancji WMI
Pobieranie częściowej instancji następuje, gdy usługa WMI pobiera tylko podzbiór właściwości tej instancji. Na przykład usługa WMI może pobrać tylko właściwości Nazwa i Klucz. Najczęstszym zastosowaniem pobierania części instancji jest w przypadku dużych wyliczeń, które mają wiele właściwości.
Pobieranie części wystąpienia usługi WMI przy użyciu programu PowerShell
Można pobrać indywidualną właściwość wystąpienia przy użyciu Get-WmiObject; Samą właściwość można pobrać i wyświetlić na wiele sposobów. Podobnie jak w przypadku pobierania wystąpienia, program PowerShell domyślnie zwróci wszystkie wystąpienia danej klasy; Należy określić określoną wartość, jeśli chcesz pobrać tylko jedno wystąpienie.
Poniższy przykład kodu przedstawia numer seryjny woluminu dla wystąpienia klasy Win32_LogicalDisk.
(Get-WmiObject -class Win32_logicalDisk).DeviceID
#or
Get-WmiObject -class Win32_LogicalDisk | format-list DeviceID
#or
$myDisk = Get-WmiObject -class Win32_LogicalDisk
$myDisk.DeviceID
Pobieranie części instancji WMI za pomocą C# (System.Management)
Możesz pobrać pojedynczą właściwość wystąpienia, tworząc nową ManagementObject przy użyciu szczegółów określonego wystąpienia. Następnie można niejawnie pobrać co najmniej jedną właściwość wystąpienia za pomocą metody GetPropertyValue.
Notatka
pl-PL: System.Management była oryginalną przestrzenią nazw platformy .NET używaną do uzyskiwania dostępu do usługi WMI; jednak interfejsy API w tej przestrzeni nazw ogólnie są wolniejsze i nie skalują się tak dobrze jak ich bardziej nowoczesne odpowiedniki w Microsoft.Management.Infrastructure.
Poniższy przykład kodu przedstawia numer seryjny woluminu dla wystąpienia klasy Win32_LogicalDisk.
using System.Management;
...
ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
string myProperty = myDisk.GetPropertyValue("VolumeSerialNumber").ToString();
Console.WriteLine(myProperty);
Pobieranie części wystąpienia usługi WMI przy użyciu języka VBScript
Możesz pobrać indywidualną właściwość wystąpienia przy użyciu GetObject.
Poniższy przykład kodu przedstawia numer seryjny woluminu dla wystąpienia klasy Win32_LogicalDisk.
MsgBox (GetObject("WinMgmts:Win32_LogicalDisk='C:'").VolumeSerialNumber)
Pobieranie części wystąpienia usługi WMI przy użyciu języka C++
Poniższa procedura służy do żądania pobrania częściowego instancji przy użyciu języka C++.
Aby zażądać częściowego pobrania instancji za pomocą języka C++
Utwórz obiekt IWbemContext z wywołaniem CoCreateInstance.
Obiekt kontekstu jest obiektem używanym przez usługę WMI do przekazywania dodatkowych informacji do dostawcy usługi WMI. W tym przypadku używasz obiektu IWbemContext, aby polecić dostawcy przetworzenie częściowego pobierania instancji.
Dodaj __GET_EXTENSIONS, __GET_EXT_CLIENT_REQUEST i inne nazwane wartości, które opisują właściwości, które mają zostać pobrane do obiektu IWbemContext.
W poniższej tabeli wymieniono różne nazwane wartości używane podczas pobierania.
Nazwana wartość Opis __POBIERZ_ROZSZERZENIA VT_BOOL ustawiono na VARIANT_TRUE. Służy do sygnalizowania, że są używane operacje pobierania częściowego wystąpienia. Umożliwia to szybkie, pojedyncze sprawdzanie bez konieczności wyliczania całego obiektu kontekstu. Jeśli którakolwiek z pozostałych wartości jest używana, musi to być. __GET_EXT_PROPERTIES SAFEARRAY ciągów znaków zawierających listę właściwości do pobrania. Nie można jednocześnie określić razem z __GET_EXT_KEYS_ONLY.
Gwiazdka "*" jest nieprawidłową nazwą właściwości dla __GET_EXT_PROPERTIES.__GET_EXT_KEYS_ONLY VT_BOOL ustawiony na wartość VARIANT_TRUE. Wskazuje, że w zwróconym obiekcie powinny znajdować się tylko klucze. Nie może być określony jednocześnie z __GET_EXT_PROPERTIES. Zamiast tego pierwszeństwo ma __GET_EXT_PROPERTIES. __GET_EXT_CLIENT_REQUEST VT_BOOL ustawić na VARIANT_TRUE. Wskazuje, że wywołujący był tym, który zapisał wartość w kontekście i że nie została przeniesiona z innej operacji zależnej. Przekaż obiekt kontekstu IWbemContext do wszelkich wywołań IWbemServices::GetObject, IWbemServices::GetObjectAsync, IWbemServices::CreateInstanceEnumlub IWbemServices::CreateInstanceEnumAsync za pośrednictwem parametru pCtx.
Przekazanie obiektu IWbemContext instruuje dostawcę, aby zezwolił na pobieranie częściowych wystąpień. W przypadku pobierania pełnego wystąpienia należy ustawić pCtx na wartość o wartości null. Jeśli dostawca nie obsługuje częściowego pobierania instancji, zostanie wyświetlony komunikat o błędzie.
Jeśli dostawca nie może zgodnie z operacją częściowej instancji, kontynuuje tak, jakby nie wprowadzono obiektu kontekstu, albo zwraca wartość WBEM_E_UNSUPPORTED_PARAMETER.
W poniższym przykładzie opisano sposób wykonywania pełnego odczytania wystąpienia Win32_LogicalDisk, a następnie wykonywania częściowego odczytania wystąpienia właściwości Win32_LogicalDisk.Caption.
#include <stdio.h>
#define _WIN32_DCOM
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
#include <iostream>
using namespace std;
#include <comdef.h>
void main(void)
{
HRESULT hr;
_bstr_t bstrNamespace;
IWbemLocator *pWbemLocator = NULL;
IWbemServices *pServices = NULL;
IWbemClassObject *pDrive = NULL;
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_CONNECT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE, 0);
if (FAILED(hr))
{
CoUninitialize();
cout << "Failed to initialize security. Error code = 0x"
<< hex << hr << endl;
return;
}
hr = CoCreateInstance(CLSID_WbemLocator, NULL,
CLSCTX_INPROC_SERVER, IID_IWbemLocator,
(void**) &pWbemLocator);
if( FAILED(hr) )
{
CoUninitialize();
printf("failed CoCreateInstance\n");
return;
}
bstrNamespace = L"root\\cimv2";
hr = pWbemLocator->ConnectServer(bstrNamespace,
NULL, NULL, NULL, 0, NULL, NULL, &pServices);
if( FAILED(hr) )
{
pWbemLocator->Release();
CoUninitialize();
printf("failed ConnectServer\n");
return;
}
pWbemLocator->Release();
printf("Successfully connected to namespace.\n");
BSTR bstrPath =
SysAllocString(L"Win32_LogicalDisk.DeviceID=\"C:\"");
// *******************************************************//
// Perform a full-instance retrieval.
// *******************************************************//
hr = pServices->GetObject(bstrPath,
0,0, &pDrive, 0);
if( FAILED(hr) )
{
pServices->Release();
CoUninitialize();
printf("failed GetObject\n");
return;
}
// Display the object
BSTR bstrDriveObj;
hr = pDrive->GetObjectText(0, &bstrDriveObj);
printf("%S\n\n", bstrDriveObj);
pDrive->Release();
pDrive = NULL;
// *****************************************************//
// Perform a partial-instance retrieval.
// *****************************************************//
IWbemContext *pctxDrive; // Create context object
hr = CoCreateInstance(CLSID_WbemContext, NULL,
CLSCTX_INPROC_SERVER, IID_IWbemContext,
(void**) &pctxDrive);
if (FAILED(hr))
{
pServices->Release();
pDrive->Release();
CoUninitialize();
printf("create instance failed for context object.\n");
return;
}
VARIANT vExtensions;
VARIANT vClient;
VARIANT vPropertyList;
VARIANT vProperty;
SAFEARRAY *psaProperties;
SAFEARRAYBOUND saBounds;
LONG lArrayIndex = 0;
// Add named values to the context object.
VariantInit(&vExtensions);
V_VT(&vExtensions) = VT_BOOL;
V_BOOL(&vExtensions) = VARIANT_TRUE;
hr = pctxDrive->SetValue(_bstr_t(L"__GET_EXTENSIONS"),
0, &vExtensions);
VariantClear(&vExtensions);
VariantInit(&vClient);
V_VT(&vClient) = VT_BOOL;
V_BOOL(&vClient) = VARIANT_TRUE;
hr = pctxDrive->SetValue(_bstr_t(L"__GET_EXT_CLIENT_REQUEST"),
0, &vClient);
VariantClear(&vClient);
// Create an array of properties to return.
saBounds.cElements = 1;
saBounds.lLbound = 0;
psaProperties = SafeArrayCreate(VT_BSTR, 1, &saBounds);
// Add the Caption property to the array.
VariantInit(&vProperty);
V_VT(&vProperty) = VT_BSTR;
V_BSTR(&vProperty) = _bstr_t(L"Caption");
SafeArrayPutElement(psaProperties, &lArrayIndex,
V_BSTR(&vProperty));
VariantClear(&vProperty);
VariantInit(&vPropertyList);
V_VT(&vPropertyList) = VT_ARRAY | VT_BSTR;
V_ARRAY(&vPropertyList) = psaProperties;
// Put the array in the named value __GET_EXT_PROPERTIES.
hr = pctxDrive->SetValue(_bstr_t(L"__GET_EXT_PROPERTIES"),
0, &vPropertyList);
VariantClear(&vPropertyList);
SafeArrayDestroy(psaProperties);
// Pass the context object as the pCtx parameter of GetObject.
hr = pServices->GetObject(bstrPath, 0, pctxDrive, &pDrive, 0);
if( FAILED(hr) )
{
pServices->Release();
CoUninitialize();
printf("failed property GetObject\n");
return;
}
// Display the object
hr = pDrive->GetObjectText(0, &bstrDriveObj);
printf("%S\n\n", bstrDriveObj);
SysFreeString(bstrPath);
VARIANT vFileSystem;
// Attempt to get a property that was not requested.
// The following should return a NULL property if
// the partial-instance retrieval succeeded.
hr = pDrive->Get(_bstr_t(L"FileSystem"), 0,
&vFileSystem, NULL, NULL);
if( FAILED(hr) )
{
pServices->Release();
pDrive->Release();
CoUninitialize();
printf("failed get for file system\n");
return;
}
if (V_VT(&vFileSystem) == VT_NULL)
printf("file system variable is null - expected\n");
else
printf("FileSystem = %S\n", V_BSTR(&vFileSystem));
VariantClear(&vFileSystem);
pDrive->Release();
pctxDrive->Release();
pServices->Release();
pServices = NULL; // MUST be set to NULL
CoUninitialize();
return; // -- program successfully completed
};
Po wykonaniu poprzedni przykład kodu zapisuje następujące informacje. Pierwszy opis obiektu pochodzi z pobrania pełnego przypadku. Drugi opis obiektu pochodzi z wyszukiwania częściowego wystąpienia. W ostatniej sekcji pokazano, że otrzymasz wartość null, jeśli zażądasz właściwości, której nie zażądano w oryginalnym wywołaniu GetObject.
Successfully connected to namespace
instance of Win32_LogicalDisk
{
Caption = "C:";
Compressed = FALSE;
CreationClassName = "Win32_LogicalDisk";
Description = "Local Fixed Disk";
DeviceID = "C:";
DriveType = 3;
FileSystem = "NTFS";
FreeSpace = "3085668352";
MaximumComponentLength = 255;
MediaType = 12;
Name = "C:";
Size = "4581445632";
SupportsFileBasedCompression = TRUE;
SystemCreationClassName = "Win32_ComputerSystem";
SystemName = "TITUS";
VolumeName = "titus-c";
VolumeSerialNumber = "7CB4B90E";
};
instance of Win32_LogicalDisk
{
Caption = "C:";
CreationClassName = "Win32_LogicalDisk";
Description = "Local Fixed Disk";
DeviceID = "C:";
DriveType = 3;
MediaType = 12;
Name = "C:";
SystemCreationClassName = "Win32_ComputerSystem";
SystemName = "MySystem";
};
Następujące dane wyjściowe są generowane przez poprzedni przykład.
file system variable is null - expected
Press any key to continue