Hämtar en del av en WMI-instans
En partiell instanshämtning är när WMI endast hämtar en delmängd av egenskaperna för en instans. WMI kunde till exempel bara hämta egenskaperna Name och Key. Den vanligaste användningen av partiell instanshämtning är på stora uppräkningar som har flera egenskaper.
Hämtar en del av en WMI-instans med PowerShell
Du kan hämta en enskild egenskap för en instans med hjälp av Get-WmiObject; själva egenskapen kan hämtas och visas på flera olika sätt. Precis som vid hämtning av en instans returnerar PowerShell som standard alla instanser av en viss klass. du måste ange ett specifikt värde om du bara vill hämta en enda instans.
I följande kodexempel visas volymserienumret för en instans av Win32_LogicalDisk-klassen.
(Get-WmiObject -class Win32_logicalDisk).DeviceID
#or
Get-WmiObject -class Win32_LogicalDisk | format-list DeviceID
#or
$myDisk = Get-WmiObject -class Win32_LogicalDisk
$myDisk.DeviceID
Hämtar en del av en WMI-instans med C# (System.Management)
Du kan hämta en enskild egenskap för en instans genom att skapa en ny ManagementObject- med hjälp av information om en specifik instans. Du kan sedan implicit hämta en eller flera egenskaper för instansen med metoden GetPropertyValue.
Not
System.Management var det ursprungliga .NET-namnområdet som användes för att komma åt WMI. API:erna i det här namnområdet är dock vanligtvis långsammare och skalas inte lika bra i förhållande till deras modernare Microsoft.Management.Infrastructure motsvarigheter.
I följande kodexempel visas volymserienumret för en instans av Win32_LogicalDisk-klassen.
using System.Management;
...
ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
string myProperty = myDisk.GetPropertyValue("VolumeSerialNumber").ToString();
Console.WriteLine(myProperty);
Hämtar en del av en WMI-instans med VBScript
Du kan hämta en enskild egenskap för en instans med hjälp av GetObject.
I följande kodexempel visas volymserienumret för en instans av Win32_LogicalDisk-klassen.
MsgBox (GetObject("WinMgmts:Win32_LogicalDisk='C:'").VolumeSerialNumber)
Hämtar en del av en WMI-instans med C++
Följande procedur används för att begära en partiell instanshämtning med hjälp av C++.
Om du vill begära en partiell instanshämtning med C++
Skapa ett IWbemContext--objekt med ett anrop till CoCreateInstance-.
Ett kontextobjekt är ett objekt som WMI använder för att skicka in mer information till en WMI-provider. I det här fallet använder du objektet IWbemContext för att instruera providern att bearbeta en partiell instanshämtning.
Lägg till __GET_EXTENSIONS, __GET_EXT_CLIENT_REQUEST och andra namngivna värden som beskriver de egenskaper som du vill hämta till objektet IWbemContext.
I följande tabell visas de olika namngivna värden som används i hämtningsanropet.
Namngivet värde Beskrivning __GET_EXTENSIONS VT_BOOL inställd till VARIANT_TRUE. Används för att signalera att partiella instanshämtningsåtgärder används. Detta möjliggör en snabb, enkel kontroll utan att hela kontextobjektet behöver räknas upp. Om något av de andra värdena används måste det här vara. __GET_EXT_PROPERTIES SAFEARRAY med strängar som listar de egenskaper som ska hämtas. Det går inte att ange samtidigt med __GET_EXT_KEYS_ONLY.
En asterisk "*" är ett ogiltigt egenskapsnamn för __GET_EXT_PROPERTIES.__GET_EXT_KEYS_ONLY VT_BOOL inställd på VARIANT_TRUE. Anger att endast nycklar ska anges i det returnerade objektet. Det går inte att ange samtidigt med __GET_EXT_PROPERTIES. Istället tar företräde framför __GET_EXT_PROPERTIES. __GET_EXT_CLIENT_REQUEST VT_BOOL inställd på VARIANT_TRUE. Anger att anroparen var den som skrev värdet till kontextobjektet och att det inte spreds från en annan beroende åtgärd. Skicka IWbemContext--kontextobjektet till alla anrop till IWbemServices::GetObject, IWbemServices::GetObjectAsync, IWbemServices::CreateInstanceEnumeller IWbemServices::CreateInstanceEnumAsync genom parametern pCtx.
Om du skickar IWbemContext--objektet instrueras providern att tillåta partiell hämtning av instanser. I en fullständig instanshämtning anger du pCtx- som ett null- värde. Om providern inte stöder partiell instanshämtning får du ett felmeddelande.
Om providern inte kan följa operationen för partiell instans, fortsätter den antingen som om du inte angav kontextobjektet, eller så returnerar den WBEM_E_UNSUPPORTED_PARAMETER.
I följande exempel beskrivs hur du utför en fullständig instanshämtning av Win32_LogicalDiskoch sedan utför en partiell instanshämtning av egenskapen 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
};
När det körs skriver det tidigare kodexemplet följande information. Den första objektbeskrivningen är från hämtningen av hela instansen. Den andra objektbeskrivningen är från hämtning av delinstans. Det sista avsnittet visar att du får ett null- värde om du begär en egenskap som inte begärdes i det ursprungliga GetObject--anrop.
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";
};
Följande utdata genereras av föregående exempel.
file system variable is null - expected
Press any key to continue