Win32_OperatingSystemの内容を表示します。
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <string>
#include <rpc.h>
#include <comutil.h>
#include <atlbase.h>
#include <Wbemcli.h>
#include <wbemidl.h>
#pragma comment(lib,"comsuppw.lib")
#pragma comment(lib, "wbemuuid.lib")
/*
valiant値の取得
*/
std::wstring GetValiantValue
(
VARIANT& var
)
{
HRESULT hResult;
TCHAR waBuf[ 1024 ];
switch( var.vt ) {
case VT_NULL:
{
::_swprintf_p( waBuf, _countof( waBuf ), L"(VT_NULL)" );
}
break;
case VT_I2:
{
::_swprintf_p( waBuf, _countof( waBuf ), L"%d", var.lVal );
}
break;
case VT_I4:
{
::_swprintf_p( waBuf, _countof( waBuf ), L"%d", var.lVal );
}
break;
case VT_BSTR:
{
::_swprintf_p( waBuf, _countof( waBuf ), L"%s", var.bstrVal );
}
break;
case VT_BOOL:
{
::_swprintf_p( waBuf, _countof( waBuf ), L"%s", ( FALSE == var.boolVal )? L"false" : L"true" );
}
break;
case VT_UI1:
{
::_swprintf_p( waBuf, _countof( waBuf ), L"%d", var.uiVal );
}
break;
case VT_BSTR | VT_ARRAY:
{
SAFEARRAY* pNames = var.parray;
LPWSTR* p;
LONG lIndexMin;
LONG lIndexMax;
hResult = SafeArrayGetLBound( pNames, 1, &lIndexMin );
if ( hResult != hResult ) {
std::wcout << L"hResult = " << std::hex << hResult << std::dec << std::endl;
}
hResult = SafeArrayGetUBound( pNames, 1, &lIndexMax );
if ( hResult != hResult ) {
std::wcout << L"hResult = " << std::hex << hResult << std::dec << std::endl;
}
hResult = SafeArrayAccessData( pNames, (void **)&p );
if ( hResult != hResult ) {
std::wcout << L"hResult = " << std::hex << hResult << std::dec << std::endl;
}
std::wstring strRet;
if ( lIndexMin <= lIndexMax ) {
strRet = L"[ ";
for ( int nI = lIndexMin; nI <= lIndexMax; nI++ ) {
std::wcout << L"ARRAY(VT_BSTR)[" << nI << "]"<< p[ nI ] << std::endl;
strRet += p[ nI ];
if ( nI > lIndexMax ) {
strRet += L", ";
}
}
strRet += L" ]";
}
SafeArrayUnaccessData( pNames );
waBuf[0]=L'¥0';
return( strRet );
}
break;
case VT_I4 | VT_ARRAY:
{
SAFEARRAY* pNames = var.parray;
int* p;
LONG lIndexMin;
LONG lIndexMax;
hResult = SafeArrayGetLBound( pNames, 1, &lIndexMin );
if ( hResult != hResult ) {
std::wcout << L"hResult = " << std::hex << hResult << std::dec << std::endl;
}
hResult = SafeArrayGetUBound( pNames, 1, &lIndexMax );
if ( hResult != hResult ) {
std::wcout << L"hResult = " << std::hex << hResult << std::dec << std::endl;
}
hResult = SafeArrayAccessData( pNames, (void **)&p );
if ( hResult != hResult ) {
std::wcout << L"hResult = " << std::hex << hResult << std::dec << std::endl;
}
std::wstring strRet;
if ( lIndexMin <= lIndexMax ) {
strRet = L"[ ";
for ( int nI = lIndexMin; nI <= lIndexMax; nI++ ) {
std::wcout << L"ARRAY(VT_BSTR)[" << nI << "]"<< p[ nI ] << std::endl;
::_swprintf_p( waBuf, _countof( waBuf ), L"%d", p[ nI ] );
strRet += waBuf;
if ( nI > lIndexMax ) {
strRet += L", ";
}
}
strRet += L" ]";
}
SafeArrayUnaccessData( pNames );
waBuf[0]=L'¥0';
return( strRet );
}
break;
default:
{
::_swprintf_p( waBuf, _countof( waBuf ), L"<はてな?>0x%08x", var.vt );
}
break;
}
return( waBuf );
}
/*
Win32_OperatingSystemの表示
*/
int _tmain
(
int argc
, _TCHAR* argv[]
)
{
/*
std::wcoutのロケールを設定
これを設定するだけで、std::wcoutで日本語が表示される
ようになります。
*/
std::wcout.imbue( std::locale( "", std::locale::ctype ) );
// COM初期化
CoInitializeEx( NULL, COINIT_MULTITHREADED );
{
HRESULT hResult;
// COM-Security初期化
hResult = CoInitializeSecurity(
NULL
, -1
, NULL
, NULL
, RPC_C_AUTHN_LEVEL_PKT
, RPC_C_IMP_LEVEL_IMPERSONATE
, NULL
, EOAC_NONE
, 0
);
CComPtr<IWbemLocator> pIWbemLocator;
CComPtr<IWbemServices> pIWbemServices;
CComPtr<IEnumWbemClassObject> pIEnumObject;
// CLSID_WbemAdministrativeLocator
hResult = pIWbemLocator.CoCreateInstance(
CLSID_WbemAdministrativeLocator
, NULL
, CLSCTX_INPROC_SERVER
| CLSCTX_LOCAL_SERVER
);
if ( S_OK == hResult ) {
CComBSTR bstrNamespace( _T("root¥¥cimv2") );
// ConnectServer
hResult = pIWbemLocator->ConnectServer(
bstrNamespace
, NULL
, NULL
, NULL
, 0
, NULL
, NULL
, &pIWbemServices
);
if ( S_OK == hResult ) {
CComBSTR bstrQuery(_T("Select * from Win32_OperatingSystem"));
CComBSTR bstrQL(_T("WQL"));
// ExecQuery
hResult = pIWbemServices->ExecQuery(
bstrQL
, bstrQuery
, WBEM_FLAG_RETURN_IMMEDIATELY
, NULL
, &pIEnumObject
);
if ( S_OK == hResult ) {
ULONG uCount = 1;
ULONG uReturned;
hResult = pIEnumObject->Reset();
do {
CComPtr<IWbemClassObject> pClassObject = NULL;
hResult = pIEnumObject->Next( WBEM_INFINITE, uCount, &pClassObject, &uReturned );
if ( S_OK != hResult ) {
break;
}
SAFEARRAY* pNames;
LPWSTR* p;
LONG lIndexMin;
LONG lIndexMax;
hResult = pClassObject->GetNames( NULL, WBEM_FLAG_ALWAYS, NULL, &pNames );
if ( S_OK != hResult ) {
std::wcout << L"hResult = " << std::hex << hResult << std::dec << std::endl;
}
hResult = SafeArrayGetLBound( pNames, 1, &lIndexMin );
if ( S_OK != hResult ) {
std::wcout << L"hResult = " << std::hex << hResult << std::dec << std::endl;
}
hResult = SafeArrayGetUBound( pNames, 1, &lIndexMax );
if ( S_OK != hResult ) {
std::wcout << L"hResult = " << std::hex << hResult << std::dec << std::endl;
}
hResult = SafeArrayAccessData( pNames, (void **)&p );
if ( S_OK != hResult ) {
std::wcout << L"hResult = " << std::hex << hResult << std::dec << std::endl;
}
for ( int nI = lIndexMin; nI <= lIndexMax; nI++ ) {
CComVariant var;
pClassObject->Get( p[ nI ], 0, &var, NULL, NULL );
std::wstring str = GetValiantValue( var );
std::wcout << L"[" << nI << "]"<< p[ nI ] << L" = " << str.c_str() << std::endl;
}
SafeArrayUnaccessData( pNames );
SafeArrayDestroy( pNames );
} while( S_OK == hResult );
}
}
}
}
// COM終了処理
::CoUninitialize();
// 正常終了
return( 0 );
}
[0]__GENUS = 2 [1]__CLASS = Win32_OperatingSystem [2]__SUPERCLASS = CIM_OperatingSystem [3]__DYNASTY = CIM_ManagedSystemElement [4]__RELPATH = Win32_OperatingSystem=@ [5]__PROPERTY_COUNT = 64 ARRAY(VT_BSTR)[0]CIM_OperatingSystem ARRAY(VT_BSTR)[1]CIM_LogicalElement ARRAY(VT_BSTR)[2]CIM_ManagedSystemElement [6]__DERIVATION = [ CIM_OperatingSystemCIM_LogicalElementCIM_ManagedSystemElement ] [7]__SERVER = DESKTOP-AAAAAAA [8]__NAMESPACE = root\cimv2 [9]__PATH = \\DESKTOP-AAAAAAA\root\cimv2:Win32_OperatingSystem=@ [10]BootDevice = \Device\HarddiskVolume1 [11]BuildNumber = 10586 [12]BuildType = Multiprocessor Free [13]Caption = Microsoft Windows 10 Pro [14]CodeSet = 932 [15]CountryCode = 81 [16]CreationClassName = Win32_OperatingSystem [17]CSCreationClassName = Win32_ComputerSystem [18]CSDVersion = (VT_NULL) [19]CSName = DESKTOP-AAAAAAA [20]CurrentTimeZone = 540 [21]DataExecutionPrevention_32BitApplications = true [22]DataExecutionPrevention_Available = true [23]DataExecutionPrevention_Drivers = true [24]DataExecutionPrevention_SupportPolicy = 2 [25]Debug = false [26]Description = [27]Distributed = false [28]EncryptionLevel = 256 [29]ForegroundApplicationBoost = 2 [30]FreePhysicalMemory = 3135120 [31]FreeSpaceInPagingFiles = 1256268 [32]FreeVirtualMemory = 3429628 [33]InstallDate = 20151130162025.000000+540 [34]LargeSystemCache = (VT_NULL) [35]LastBootUpTime = 20160404225300.493451+540 [36]LocalDateTime = 20160415135216.466000+540 [37]Locale = 0411 [38]Manufacturer = Microsoft Corporation [39]MaxNumberOfProcesses = -1 [40]MaxProcessMemorySize = 137438953344 ARRAY(VT_BSTR)[0]ja-JP [41]MUILanguages = [ ja-JP ] [42]Name = Microsoft Windows 10 Pro|C:\WINDOWS|\Device\Harddisk0\Partition3 [43]NumberOfLicensedUsers = 0 [44]NumberOfProcesses = 116 [45]NumberOfUsers = 2 [46]OperatingSystemSKU = 48 [47]Organization = [48]OSArchitecture = 64 ビット [49]OSLanguage = 1041 [50]OSProductSuite = 256 [51]OSType = 18 [52]OtherTypeDescription = (VT_NULL) [53]PAEEnabled = (VT_NULL) [54]PlusProductID = (VT_NULL) [55]PlusVersionNumber = (VT_NULL) [56]PortableOperatingSystem = false [57]Primary = true [58]ProductType = 1 [59]RegisteredUser = AAAAAAA [60]SerialNumber = AAAAA-BBBBB-CCCCC-DDDDD [61]ServicePackMajorVersion = 0 [62]ServicePackMinorVersion = 0 [63]SizeStoredInPagingFiles = 1310720 [64]Status = OK [65]SuiteMask = 272 [66]SystemDevice = \Device\HarddiskVolume3 [67]SystemDirectory = C:\WINDOWS\system32 [68]SystemDrive = C: [69]TotalSwapSpaceSize = (VT_NULL) [70]TotalVirtualMemorySize = 9576568 [71]TotalVisibleMemorySize = 8265848 [72]Version = 10.0.10586 [73]WindowsDirectory = C:\WINDOWS