Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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