Я использую следующий фрагмент в C ++ для запроса Win32_TCPIPPrinterPort с WQL:
[ cut WMI init part, initialize security and stuff ]
IWbemClassObject* clsObj = NULL;
int numElems;
while((hRes = pEnumerator->Next(WBEM_INFINITE, 1, &clsObj, (ULONG*)&numElems)) != WBEM_S_FALSE)
{
VARIANT vRet;
VariantInit(&vRet);
if(SUCCEEDED(clsObj->Get(LPCWSTR("HostAddress"), 0, &vRet, NULL, NULL)))
{
printf("HostAddress VT: %d", vRet.vt);
}
VariantClear(&vRet);
}
clsObj->Release();
[...]
(Проверки ошибок и инициализации были удалены для проводки)
Выше код работает в Windows 7 без каких-либо проблем и возвращает правильный VT_BSTR
,
Но Windows XP дает VT_NULL
вместо VT_BSTR
за clsObj->Get(...
Если вы делаете
wmic -U user%pass //WINXPHOST "SELECT HostAddress FROM Win32_TCPIPPrinterPort"
вызов с другой (очевидно, Linux) машины в сети возвращает все значения просто отлично.
Я тоже пробовал cscript prnport.vbs -l -s WINXPHOST
который сказал мне правильные значения.
Интересно, я взял пример MSDN CMI WMI по умолчанию отсюда: Пример: получение данных WMI
Я изменил WQL на bstr_t("SELECT * FROM Win32_TCPIPPrinterPort"),
И в Step 7
в
// Get the value of the HostAddress property
hr = pclsObj->Get(L"HostAddress", 0, &vtProp, 0, 0);
wcout << " HostAddress : " << vtProp.bstrVal << endl;
VariantClear(&vtProp);
После компиляции он запускается и возвращает VT_BSTR
на машинах с Windows 7, VT_NULL
на машинах Windows XP.
Может быть ошибка?
Мысли?
Задача ещё не решена.
Других решений пока нет …