Класс WMI SoftwareLicensingProduct не отображает частичный ключ продукта для MS Office на некоторых системах (Windows 10)

Используя класс WMI SoftwareLicensingProduct, я получаю Частичный ключ продукта / Лицензионный ключ для продукта Microsoft.
Это совместимо с Windows Vista и выше.
Но все же я не могу получить ключ для MS Office на нескольких системах Windows10, для остальных систем, он работает должным образом.

Код:

int _tmain (int argc, _TCHAR * argv [])
{

 HRESULT hres;

// Initialize COM.
hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
cout << "Failed to initialize COM library. "<< "Error code = 0x"<< hex << hres << endl;
return 1;              // Program has failed.
}

// Initialize
hres =  CoInitializeSecurity(
NULL,
-1,      // COM negotiates service
NULL,    // Authentication services
NULL,    // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT,    // authentication
RPC_C_IMP_LEVEL_IMPERSONATE,  // Impersonation
NULL,             // Authentication info
EOAC_NONE,        // Additional capabilities
NULL              // Reserved
);if (FAILED(hres))
{
cout << "Failed to initialize security. "<< "Error code = 0x"<< hex << hres << endl;
CoUninitialize();
return 1;          // Program has failed.
}

// Obtain the initial locator to Windows Management
// on a particular host computer.
IWbemLocator *pLoc = 0;

hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);

if (FAILED(hres))
{
cout << "Failed to create IWbemLocator object. "<< "Error code = 0x"<< hex << hres << endl;
CoUninitialize();
return 1;       // Program has failed.
}

IWbemServices *pSvc = 0;

// Connect to the root\cimv2 namespace with the
// current user and obtain pointer pSvc
// to make IWbemServices calls.

hres = pLoc->ConnectServer(

_bstr_t(L"ROOT\\CIMV2"), // WMI namespace
NULL,                    // User name
NULL,                    // User password
0,                       // Locale
NULL,                    // Security flags
0,                       // Authority
0,                       // Context object
&pSvc                    // IWbemServices proxy
);

if (FAILED(hres))
{
cout << "Could not connect. Error code = 0x"<< hex << hres << endl;
pLoc->Release();
CoUninitialize();
return 1;                // Program has failed.
}

cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;

// Set the IWbemServices proxy so that impersonation
// of the user (client) occurs.
hres = CoSetProxyBlanket(

pSvc,                         // the proxy to set
RPC_C_AUTHN_WINNT,            // authentication service
RPC_C_AUTHZ_NONE,             // authorization service
NULL,                         // Server principal name
RPC_C_AUTHN_LEVEL_CALL,       // authentication level
RPC_C_IMP_LEVEL_IMPERSONATE,  // impersonation level
NULL,                         // client identity
EOAC_NONE                     // proxy capabilities
);

if (FAILED(hres))
{
cout << "Could not set proxy blanket. Error code = 0x"<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1;               // Program has failed.
}// Use the IWbemServices pointer to make requests of WMI.
// Make requests here:

// For example, query for all the running processes
IEnumWbemClassObject* pEnumerator = NULL;

hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM SoftwareLicensingProduct"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);if (FAILED(hres))
{
cout << "Query for processes failed. "<< "Error code = 0x"<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1;               // Program has failed.
}
else
{
IWbemClassObject *pclsObj;
ULONG uReturn = 0;

while (pEnumerator)
{
hres = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);

if(0 == uReturn)
{
break;
}

VARIANT vtProp;

// Get the value of the Name property
hres = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
wcout << "Process Name : " << vtProp.bstrVal << " ";
VariantClear(&vtProp);

VARIANT vtProp1;

// Get the value of the PartialProductKey property
hres = pclsObj->Get(L"PartialProductKey", 0, &vtProp1, 0, 0);
if (VT_NULL != vtProp1.vt)
wcout << ": " << vtProp1.bstrVal << endl;
else
wcout<<endl;
VariantClear(&vtProp1);
}

}
getch();
// Cleanup
// ========

pSvc->Release();
pLoc->Release();
CoUninitialize();

return 0;   // Program successfully completed.

}

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]