WMI örneğinin bir bölümünü alma
Kısmi örnek alma, WMI'nin bir örneğin özelliklerinin yalnızca bir alt kümesini almasıdır. Örneğin, WMI yalnızca Adı ve Anahtarı özelliklerini alabilir. Kısmi örnek alma işleminin en yaygın kullanımı, birden çok özelliğe sahip büyük numaralandırmalarda kullanılır.
PowerShell kullanarak WMI örneğinin bir bölümünü alma
Get-WmiObjectkullanarak örneğin tek bir özelliğini alabilirsiniz; özelliğinin kendisi alınabilir ve çeşitli yollarla görüntülenebilir. Örneğin alınmasında olduğu gibi, PowerShell varsayılan olarak belirli bir sınıfın tüm örneklerini döndürür; yalnızca tek bir örneği almak istiyorsanız belirli bir değer belirtmeniz gerekir.
Aşağıdaki kod örneği, Win32_LogicalDisk sınıfının bir örneğinin birim seri numarasını görüntüler.
(Get-WmiObject -class Win32_logicalDisk).DeviceID
#or
Get-WmiObject -class Win32_LogicalDisk | format-list DeviceID
#or
$myDisk = Get-WmiObject -class Win32_LogicalDisk
$myDisk.DeviceID
C# kullanarak WMI örneğinin bir bölümünü alma (System.Management)
Belirli bir örneğin ayrıntılarını kullanarak yeni bir ManagementObject oluşturarak örneğin tek bir özelliğini alabilirsiniz. Ardından, GetPropertyValue yöntemiyle örneğin bir veya daha fazla özelliğini örtük olarak alabilirsiniz.
Not
System.Management WMI'ye erişmek için kullanılan özgün .NET ad alanıydı; ancak, bu ad alanındaki API'ler genellikle daha yavaştır ve daha modern Microsoft.Management.Infrastructure karşılıklarına göre ölçeklendirilmemektedir.
Aşağıdaki kod örneği, Win32_LogicalDisk sınıfının bir örneğinin birim seri numarasını görüntüler.
using System.Management;
...
ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
string myProperty = myDisk.GetPropertyValue("VolumeSerialNumber").ToString();
Console.WriteLine(myProperty);
VBScript kullanarak WMI örneğinin bir bölümünü alma
GetObjectkullanarak bir örneğin tek bir özelliğini alabilirsiniz.
Aşağıdaki kod örneği, Win32_LogicalDisk sınıfının bir örneğinin birim seri numarasını görüntüler.
MsgBox (GetObject("WinMgmts:Win32_LogicalDisk='C:'").VolumeSerialNumber)
C++ kullanarak WMI örneğinin bir bölümünü alma
C++ kullanarak kısmi örnek alma isteğinde bulunmak için aşağıdaki yordam kullanılır.
C++ kullanarak kısmi örnek geri alma isteğinde bulunmak için
CoCreateInstanceçağrısıyla bir IWbemContext nesnesi oluşturun.
Bağlam nesnesi, WMI'nin bir WMI sağlayıcısına daha fazla bilgi geçirmek için kullandığı bir nesnedir. Bu durumda, sağlayıcıya kısmi örnek alma işlemini işlemesini bildirmek için IWbemContext nesnesini kullanıyorsunuz.
IWbemContext nesnesine almak istediğiniz özellikleri açıklayan __GET_EXTENSIONS, __GET_EXT_CLIENT_REQUEST ve diğer adlandırılmış değerleri ekleyin.
Aşağıdaki tabloda, alma çağrınızda kullanılan farklı adlandırılmış değerler listelenir.
IWbemContext bağlam nesnesini IWbemServices::GetObject, IWbemServices::GetObjectAsync, IWbemServices::CreateInstanceEnumveya IWbemServices::CreateInstanceEnumAsync çağrılarına, pCtx parametresi aracılığıyla geçirin.
IWbemContext nesnesinin geçirilmesi, sağlayıcıya kısmi örnek alma işlemlerine izin verir. Tam örnek alma işlemi sırasında, pCtx’i null değerine ayarlarsınız. Sağlayıcı kısmi örnek almayı desteklemiyorsa bir hata iletisi alırsınız.
Sağlayıcı, kısmi örnek işlemiyle uyum sağlayamazsa, bağlam nesnesine girmemişsiniz gibi işlem yapar veya WBEM_E_UNSUPPORTED_PARAMETERhatasını döndürür.
Aşağıdaki örnekte, Win32_LogicalDisktam örnek alma işleminin nasıl gerçekleştirildiği açıklanır ve ardından Win32_LogicalDisk.Caption özelliğinin kısmi örnek alma işlemi gerçekleştirilir.
#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
};
Yürütülürken, önceki kod örneği aşağıdaki bilgileri yazar. İlk nesne açıklaması, tam örnek alma işlemi sonucundan elde edilmiştir. İkinci nesne açıklaması, kısmi örnek alımındandır. Son bölüm, özgün GetObject çağrısında talep edilmemiş bir özelliği istediğinizde null değeri aldığınızı gösterir.
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";
};
Aşağıdaki çıkış, önceki örnek tarafından oluşturulur.
file system variable is null - expected
Press any key to continue