получение информации о windows с помощью c++
мне нужно получить информацию о системе windows с помощью стандартной библиотеки c++. я нашел информацию только об устаревших функциях, которые на данный момент уже не работают. есть ли возможность точно определить версию windows, ее разрядность и версию сборки?
Ответы (2 шт):
Автор решения: maint
→ Ссылка
можно, через реестр. Ветка HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
Автор решения: Aptem_f
→ Ссылка
я через wmid классы запрашивал информацию о системе, о версии, драйверах итдитп. все есть в документации у мелкомягких, легко гуглится, какие есть параметры, которые нужно запрашивать
тут используются qt классы, но можно и без. Этот код оттестирован и рабочий
static int getOsInfo(IWbemServices* services, QStringList* result_info)
{
qDebug() << __FUNCTION__;
const int OK = 0, FAIL = -1;
IEnumWbemClassObject* enumerator = getEnumerator(services, _bstr_t("SELECT * FROM Win32_OperatingSystem"));
if (nullptr == enumerator)
return FAIL;
IWbemClassObject* obj = nullptr;
ULONG ret_objs_num = 0; // Количество полученных объектов на запрос.
HRESULT hr = enumerator->Next(WBEM_INFINITE, 1, &obj, &ret_objs_num);
if (WBEM_S_NO_ERROR != hr || 0 == ret_objs_num || nullptr == obj)
{
enumerator->Release();
return FAIL;
}
QStringList info;
getEnumeratorItem(obj, &info, L"Version");
getEnumeratorItem(obj, &info, L"Caption");
getEnumeratorItem(obj, &info, L"CountryCode");
getEnumeratorItem(obj, &info, L"CurrentTimeZone");
getEnumeratorItem(obj, &info, L"InstallDate");
getEnumeratorItem(obj, &info, L"LastBootUpTime");
getEnumeratorItem(obj, &info, L"Locale");
getEnumeratorItem(obj, &info, L"OSLanguage");
getEnumeratorItem(obj, &info, L"SerialNumber");
if (info.isEmpty())
{
obj->Release();
enumerator->Release();
return FAIL;
}
auto it = info.begin();
auto end = info.end();
for ( ; it != end; ++it)
(*it).prepend("OS: ");
result_info->append(info);
obj->Release();
enumerator->Release();
return OK;
}
я вот так пользуюсь
//------------------------------------------------------------------------------
static int getSystemShortInfoWin2(QStringList& sys_info)
{
qDebug() << __FUNCTION__;
const int OK = 0, FAIL = -1;
int ret = OK;
HRESULT hres = CoInitializeEx(0, COINIT_APARTMENTTHREADED);
if (FAILED(hres))
{
qDebug() << "I can't to initialize COM library. Error: " << hres;
exit(-2);
return FAIL;
}
IWbemLocator* locator = nullptr;
hres = CoCreateInstance(
CLSID_WbemLocator
, 0
, CLSCTX_INPROC_SERVER
, IID_IWbemLocator
, (LPVOID*)&locator
);
if (FAILED(hres))
{
qDebug() << "I can't to create locator. Error: " << hres;
CoUninitialize();
return FAIL;
}
IWbemServices* services = nullptr;
hres = locator->ConnectServer(
_bstr_t("ROOT\\CIMV2")
, NULL
, NULL
, NULL
, 0L
, NULL
, nullptr
, &services
);
if (FAILED(hres))
{
qDebug() << "I can't to connect to WMI server. Error: " << hres;
locator->Release();
CoUninitialize();
exit(-2);
return FAIL;
}
hres = CoSetProxyBlanket(
services
, RPC_C_AUTHN_WINNT
, RPC_C_AUTHZ_NONE
, NULL
, RPC_C_AUTHN_LEVEL_CALL
, RPC_C_IMP_LEVEL_IMPERSONATE
, NULL
, EOAC_NONE
);
if (FAILED(hres))
{
qDebug() << "I can't to set proxy blanket. Error: " << hres;
services->Release();
locator->Release();
CoUninitialize();
return FAIL;
}
// ...
QStringList os_info;
result = getOsInfo(services, &os_info);
services->Release();
locator->Release();
CoUninitialize();
// ...
}
//------------------------------------------------------------------------------
static IEnumWbemClassObject* getEnumerator(IWbemServices* services, BSTR query)
{
IEnumWbemClassObject* p = nullptr;
HRESULT hres = services->ExecQuery(
_bstr_t("WQL")
, query
, WBEM_FLAG_FORWARD_ONLY// | WBEM_FLAG_RETURN_IMMEDIATELY
, NULL
, &p
);
if (FAILED(hres))
{
qDebug() << "I can't to query. Error: " << hres;
return nullptr;
}
return p;
}
//------------------------------------------------------------------------------
static void getEnumeratorItem(
IWbemClassObject* obj
, QStringList* result_info
, LPCWSTR item_name
)
{
if (nullptr == obj)
return;
_variant_t v;
HRESULT hr = obj->Get(item_name, 0, &v, nullptr, nullptr);
if (FAILED(hr))
return;
QString info = QString::fromUtf16((ushort*)item_name) + " = ";
switch(v.vt)
{
case VT_BSTR:
info.append(QString::fromUtf16((ushort*)(_bstr_t(v).GetBSTR())));
break;
case VT_I2:
info.append(QString::number(static_cast<qint16>(v)));
break;
case VT_UI2:
info.append(QString::number(static_cast<quint16>(v)));
break;
case VT_INT:
info.append(QString::number(static_cast<int>(v)));
break;
case VT_UINT:
info.append(QString::number(static_cast<unsigned int>(v)));
break;
case VT_I4:
info.append(QString::number(static_cast<qint32>(v)));
break;
case VT_UI4:
info.append(QString::number(static_cast<quint32>(v)));
break;
case VT_I8:
info.append(QString::number(static_cast<qint64>(v)));
break;
case VT_UI8:
info.append(QString::number(static_cast<quint64>(v)));
break;
case VT_R4:
info.append(QString::number(static_cast<float>(v)));
break;
case VT_R8:
info.append(QString::number(static_cast<double>(v)));
break;
case VT_DATE:
{
QString date_time;
getDateTimeFromWMI(static_cast<double>(v), date_time);
info.append(date_time);
break;
}
case VT_BOOL:
info.append(QString::number(static_cast<bool>(v)));
break;
case VT_EMPTY:
case VT_NULL:
info.append("(empty)");
break;
default:
info.append("(Unsupported by DiViLab)");
}
result_info->append(info);
}