Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <comdef.h>
- #include <Wbemidl.h>
- #include <wincred.h>
- #include <strsafe.h>
- #include <conio.h>
- #pragma comment(lib, "wbemuuid.lib")
- #pragma comment(lib, "credui.lib")
- #pragma comment(lib, "comsuppw.lib")
- #define _WIN32_DCOM
- #define UNICODE
- using namespace std;
- int __cdecl main(int argc, char **argv)
- {
- setlocale(LC_ALL, "");
- HRESULT hres;
- // Шаг 1: --------------------------------------------------
- // Инициализация COM. ------------------------------------------
- hres = CoInitializeEx(0, COINIT_MULTITHREADED);
- if (FAILED(hres))
- {
- cout << "Failed to initialize COM library. Error code = 0x"
- << hex << hres << endl;
- return 1;
- }
- // Шаг 2: --------------------------------------------------
- // Установка уровней безопасности COM --------------------------
- hres = CoInitializeSecurity(
- NULL, -1,
- NULL,
- NULL,
- RPC_C_AUTHN_LEVEL_DEFAULT,
- RPC_C_IMP_LEVEL_IDENTIFY,
- NULL,
- EOAC_NONE,
- NULL);
- if (FAILED(hres))
- {
- cout << "Failed to initialize security. Error code = 0x"
- << hex << hres << endl;
- CoUninitialize();
- return 1;
- }
- // Шаг 3: ---------------------------------------------------
- // Создание локатора WMI -------------------------
- IWbemLocator *pLoc = NULL; hres = CoCreateInstance(
- CLSID_WbemLocator,
- 0,
- CLSCTX_INPROC_SERVER,
- IID_IWbemLocator, (LPVOID *)&pLoc);
- if (FAILED(hres))
- {
- cout << "Failed to create IWbemLocator object."
- << " Err code = 0x"
- << hex << hres << endl;
- CoUninitialize();
- return 1;
- }
- // Шаг 4: -----------------------------------------------------
- // Подключение к WMI через IWbemLocator::ConnectServer
- IWbemServices *pSvc = NULL;
- // Получение реквизитов доступа к удаленному компьютеру
- CREDUI_INFO cui;
- bool useToken = false;
- bool useNTLM = true;
- wchar_t pszName[CREDUI_MAX_USERNAME_LENGTH + 1] = { 0 };
- wchar_t pszPwd[CREDUI_MAX_PASSWORD_LENGTH + 1] = { 0 };
- wchar_t pszDomain[CREDUI_MAX_USERNAME_LENGTH + 1];
- wchar_t pszUserName[CREDUI_MAX_USERNAME_LENGTH + 1];
- wchar_t pszAuthority[CREDUI_MAX_USERNAME_LENGTH + 1];
- BOOL fSave;
- DWORD dwErr;
- memset(&cui, 0, sizeof(CREDUI_INFO));
- cui.cbSize = sizeof(CREDUI_INFO);
- cui.hwndParent = NULL;
- cui.pszMessageText = TEXT("Press cancel to use process token");
- cui.pszCaptionText = TEXT("Enter Account Information");
- cui.hbmBanner = NULL;
- fSave = FALSE;
- dwErr = CredUIPromptForCredentials(
- &cui,
- TEXT(""),
- NULL, 0, pszName,
- CREDUI_MAX_USERNAME_LENGTH + 1, pszPwd,
- CREDUI_MAX_PASSWORD_LENGTH + 1,
- &fSave,
- CREDUI_FLAGS_GENERIC_CREDENTIALS |
- CREDUI_FLAGS_ALWAYS_SHOW_UI | CREDUI_FLAGS_DO_NOT_PERSIST); if (dwErr == ERROR_CANCELLED)
- {
- useToken = true;
- }
- else if (dwErr)
- {
- cout << "Did not get credentials " << dwErr << endl;
- pLoc->Release();
- CoUninitialize();
- return 1;
- }
- if (!useNTLM)
- {
- StringCchPrintf(pszAuthority, CREDUI_MAX_USERNAME_LENGTH + 1, L"kERBEROS:%s", L"WIN-3ENUE7MV9J4");
- }
- // Подключение к пространству имен root\cimv2
- //---------------------------------------------------------
- hres = pLoc->ConnectServer(
- _bstr_t(L"\\\\WIN-3ENUE7MV9J4\\root\\SecurityCenter2"),
- _bstr_t(useToken ? NULL : pszName),
- _bstr_t(useToken ? NULL : pszPwd),
- NULL,
- NULL,
- _bstr_t(useNTLM ? NULL : pszAuthority),
- NULL,
- &pSvc );
- if (FAILED(hres))
- {
- cout << "Could not connect. Error code = 0x"
- << hex << hres << endl;
- pLoc->Release();
- CoUninitialize();
- return 1;
- } cout << "Connected to ROOT\\SecurityCenter2 WMI namespace" << endl;
- // Шаг 5: --------------------------------------------------
- // Создание структуры COAUTHIDENTITY
- COAUTHIDENTITY *userAcct = NULL;
- COAUTHIDENTITY authIdent;
- if (!useToken)
- {
- memset(&authIdent, 0, sizeof(COAUTHIDENTITY));
- authIdent.PasswordLength = wcslen(pszPwd);
- authIdent.Password = (USHORT*)pszPwd;
- LPWSTR slash = wcschr(pszName, L'\\');
- if (slash == NULL)
- {
- cout << "Could not create Auth identity. No domain specified\n";
- pSvc->Release();
- pLoc->Release();
- CoUninitialize();
- return 1;
- }
- StringCchCopy(pszUserName, CREDUI_MAX_USERNAME_LENGTH + 1, slash + 1);
- authIdent.User = (USHORT*)pszUserName;
- authIdent.UserLength = wcslen(pszUserName);
- StringCchCopyN(pszDomain, CREDUI_MAX_USERNAME_LENGTH + 1, pszName, slash - pszName);
- authIdent.Domain = (USHORT*)pszDomain;
- authIdent.DomainLength = slash - pszName;
- authIdent.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
- userAcct = &authIdent;
- }
- // Шаг 6: --------------------------------------------------
- // Установка защиты прокси сервера ------------------
- hres = CoSetProxyBlanket( pSvc,
- RPC_C_AUTHN_DEFAULT,
- RPC_C_AUTHZ_DEFAULT,
- COLE_DEFAULT_PRINCIPAL,
- RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE,
- userAcct, EOAC_NONE
- );
- if (FAILED(hres))
- {
- cout << "Could not set proxy blanket. Error code = 0x"
- << hex << hres << endl;
- pSvc->Release();
- pLoc->Release();
- CoUninitialize();
- return 1;
- }
- // Шаг 7: --------------------------------------------------
- // Получение данных через WMI ----
- // Например, получим имя ОС
- IEnumWbemClassObject * pEnumerator = NULL, *pEnumerator2 = NULL, *pEnumerator3 = NULL;
- hres = pSvc->ExecQuery(bstr_t("WQL"),
- bstr_t("Select * from AntivirusProduct"),
- WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
- NULL, &pEnumerator);
- hres = pSvc->ExecQuery(bstr_t("WQL"),
- bstr_t("Select * from AntiSpywareProduct"),
- WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
- NULL,
- &pEnumerator2);
- hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("Select * from FirewallProduct"),
- WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
- NULL, &pEnumerator3); if (FAILED(hres))
- {
- cout << "Query for operating system name failed."
- << " Error code = 0x" << hex << hres << endl;
- pSvc->Release();
- pLoc->Release();
- CoUninitialize();
- return 1;
- }
- hres = CoSetProxyBlanket(pEnumerator, RPC_C_AUTHN_DEFAULT,
- RPC_C_AUTHZ_DEFAULT,
- COLE_DEFAULT_PRINCIPAL,
- RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE,
- userAcct, EOAC_NONE);
- hres = CoSetProxyBlanket(pEnumerator2, RPC_C_AUTHN_DEFAULT,
- RPC_C_AUTHZ_DEFAULT,
- COLE_DEFAULT_PRINCIPAL,
- RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE,
- userAcct, EOAC_NONE);
- hres = CoSetProxyBlanket(pEnumerator3, RPC_C_AUTHN_DEFAULT,
- RPC_C_AUTHZ_DEFAULT,
- COLE_DEFAULT_PRINCIPAL,
- RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE,
- userAcct, EOAC_NONE);
- if (FAILED(hres))
- {
- cout << "Could not set proxy blanket on enumerator. Error code = 0x"
- << hex << hres << endl;
- pEnumerator->Release();
- pSvc->Release();
- pLoc->Release();
- CoUninitialize();
- return 1;
- }
- // Шаг 9: -------------------------------------------------
- // Получение данных из запроса в шаге 7 -------------------
- IWbemClassObject *pclsObj = NULL, *pclsObj2 = NULL, *pclsObj3 = NULL;
- ULONG uReturn = 0;
- while (pEnumerator)
- {
- HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
- &pclsObj, &uReturn);
- if (0 == uReturn)
- {
- break;
- }
- VARIANT vtProp;
- // Выбираем поле Name
- hr = pclsObj->Get(L"displayName", 0, &vtProp, 0, 0);
- wcout << "Antivirus: " << endl << " Name : " << vtProp.bstrVal << endl;
- hr = pclsObj->Get(L"instanceGuid", 0, &vtProp, 0, 0);
- wcout << " Instance Guid : " << vtProp.bstrVal << endl;
- VariantClear(&vtProp);
- pclsObj->Release();
- pclsObj = NULL;
- }
- while (pEnumerator2)
- {
- HRESULT hr2 = pEnumerator2->Next(WBEM_INFINITE, 1,
- &pclsObj2, &uReturn);
- if (0 == uReturn)
- {
- break;
- }
- VARIANT vtProp;
- hr2 = pclsObj2->Get(L"displayName", 0, &vtProp, 0, 0);
- wcout << "Antispyware:" << endl << " Name : " << vtProp.bstrVal << endl;
- hr2 = pclsObj2->Get(L"pathToSignedProductExe", 0, &vtProp, 0, 0);
- wcout << " Path To Signed Product Exe : " << vtProp.bstrVal << endl;
- VariantClear(&vtProp);
- pclsObj2->Release();
- pclsObj2 = NULL;
- }
- while (pEnumerator3)
- {
- HRESULT hr3 = pEnumerator3->Next(WBEM_INFINITE, 1,
- &pclsObj3, &uReturn);
- if (0 == uReturn)
- {
- break;
- }
- VARIANT vtProp;
- hr3 = pclsObj3->Get(L"displayName", 0, &vtProp, 0, 0);
- wcout << " Firewall Name : " << vtProp.bstrVal << endl;
- VariantClear(&vtProp);
- pclsObj3->Release();
- pclsObj3 = NULL;
- }
- HRESULT hres1;
- // Шаг 3: ---------------------------------------------------
- // Создание локатора WMI -------------------------
- IWbemLocator *pLoc1 = NULL;
- hres1 = CoCreateInstance(
- CLSID_WbemLocator,
- 0,
- CLSCTX_INPROC_SERVER,
- IID_IWbemLocator, (LPVOID *)&pLoc1); if (FAILED(hres1))
- {
- cout << "Failed to create IWbemLocator object."
- << " Err code = 0x"
- << hex << hres1 << endl;
- CoUninitialize();
- return 1;
- }
- // Шаг 4: -----------------------------------------------------
- // Подключение к WMI через IWbemLocator::ConnectServer
- IWbemServices *pSvc1 = NULL;
- // Получение реквизитов доступа к удаленному компьютеру
- if (!useNTLM)
- {
- StringCchPrintf(pszAuthority, CREDUI_MAX_USERNAME_LENGTH + 1,
- L"kERBEROS:%s", L"WIN-3ENUE7MV9J4");
- }
- // Подключение к пространству имен root\cimv2
- //---------------------------------------------------------
- hres1 = pLoc1->ConnectServer(
- _bstr_t(L"\\\\WIN-3ENUE7MV9J4\\root\\cimv2"),
- _bstr_t(useToken ? NULL : pszName),
- _bstr_t(useToken ? NULL : pszPwd),
- NULL,
- NULL,
- _bstr_t(useNTLM ? NULL : pszAuthority),
- NULL,
- &pSvc1 );
- if (FAILED(hres1))
- {
- cout << "Could not connect. Error code = 0x"
- << hex << hres1 << endl;
- pLoc1->Release();
- CoUninitialize();
- return 1;
- } cout << endl << "Connected to ROOT\\CIMV2 WMI namespace" << endl;
- // Шаг 5: --------------------------------------------------
- // Создание структуры COAUTHIDENTITY
- COAUTHIDENTITY *userAcct1 = NULL;
- COAUTHIDENTITY authIdent1;
- if (!useToken)
- {
- memset(&authIdent1, 0, sizeof(COAUTHIDENTITY));
- authIdent1.PasswordLength = wcslen(pszPwd);
- authIdent1.Password = (USHORT*)pszPwd;
- LPWSTR slash = wcschr(pszName, L'\\');
- if (slash == NULL)
- {
- cout << "Could not create Auth identity. No domain specified\n";
- pSvc1->Release();
- pLoc1->Release();
- CoUninitialize();
- return 1;
- }
- StringCchCopy(pszUserName, CREDUI_MAX_USERNAME_LENGTH + 1, slash + 1);
- authIdent1.User = (USHORT*)pszUserName;
- authIdent1.UserLength = wcslen(pszUserName);
- StringCchCopyN(pszDomain, CREDUI_MAX_USERNAME_LENGTH + 1, pszName, slash - pszName);
- authIdent1.Domain = (USHORT*)pszDomain;
- authIdent1.DomainLength = slash - pszName;
- authIdent1.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
- userAcct1 = &authIdent;
- }
- // Шаг 6: --------------------------------------------------
- // Установка защиты прокси сервера ------------------
- hres1 = CoSetProxyBlanket( pSvc1,
- RPC_C_AUTHN_DEFAULT,
- RPC_C_AUTHZ_DEFAULT,
- COLE_DEFAULT_PRINCIPAL,
- RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE,
- userAcct1,
- EOAC_NONE
- ); if (FAILED(hres1))
- {
- cout << "Could not set proxy blanket. Error code = 0x"
- << hex << hres1 << endl;
- pSvc1->Release();
- pLoc1->Release();
- CoUninitialize();
- return 1;
- }
- // Шаг 7: --------------------------------------------------
- // Получение данных через WMI ----
- // Например, получим имя ОС
- IEnumWbemClassObject* pEnumerator1 = NULL, *pEnumerator1_1 = NULL, *pEnumerator1_2 = NULL, *pEnumerator1_3 = NULL;
- hres1 = pSvc1->ExecQuery(bstr_t("WQL"),
- bstr_t("Select * from Win32_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
- NULL, &pEnumerator1);
- hres1 = pSvc1->ExecQuery(bstr_t("WQL"),
- bstr_t("Select * from Win32_Product"),
- WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
- NULL,
- &pEnumerator1_1);
- hres1 = pSvc1->ExecQuery(bstr_t("WQL"),
- bstr_t("Select * from Win32_Process"),
- WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
- NULL,
- &pEnumerator1_2);
- hres1 = pSvc1->ExecQuery(bstr_t("WQL"),
- bstr_t("Select * from Win32_BIOS"),
- WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
- NULL,
- &pEnumerator1_3);
- if (FAILED(hres1))
- {
- cout << "Query for operating system name failed."
- << " Error code = 0x" << hex << hres1 << endl;
- pSvc1->Release();
- pLoc1->Release();
- CoUninitialize();
- return 1;
- }
- hres1 = CoSetProxyBlanket(pEnumerator1, RPC_C_AUTHN_DEFAULT,
- RPC_C_AUTHZ_DEFAULT,
- COLE_DEFAULT_PRINCIPAL,
- RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE,
- userAcct1,
- EOAC_NONE);
- hres1 = CoSetProxyBlanket(pEnumerator1_1, RPC_C_AUTHN_DEFAULT,
- RPC_C_AUTHZ_DEFAULT,
- COLE_DEFAULT_PRINCIPAL,
- RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE,
- userAcct1,
- EOAC_NONE);
- hres1 = CoSetProxyBlanket(pEnumerator1_2, RPC_C_AUTHN_DEFAULT,
- RPC_C_AUTHZ_DEFAULT,
- COLE_DEFAULT_PRINCIPAL,
- RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE,
- userAcct1,
- EOAC_NONE);
- hres1 = CoSetProxyBlanket(pEnumerator1_3, RPC_C_AUTHN_DEFAULT,
- RPC_C_AUTHZ_DEFAULT,
- COLE_DEFAULT_PRINCIPAL,
- RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE,
- userAcct1,
- EOAC_NONE);
- if (FAILED(hres1))
- {
- cout << "Could not set proxy blanket on enumerator. Error code = 0x"
- << hex << hres1 << endl;
- pEnumerator1->Release();
- pSvc1->Release();
- pLoc1->Release();
- CoUninitialize();
- return 1;
- }
- SecureZeroMemory(pszName, sizeof(pszName));
- SecureZeroMemory(pszPwd, sizeof(pszPwd));
- SecureZeroMemory(pszUserName, sizeof(pszUserName));
- SecureZeroMemory(pszDomain, sizeof(pszDomain));
- // Шаг 9: -------------------------------------------------
- // Получение данных из запроса в шаге 7 -------------------
- IWbemClassObject *pclsObj1 = NULL;
- ULONG uReturn1 = 0;
- while (pEnumerator1)
- {
- HRESULT hr1 = pEnumerator1->Next(WBEM_INFINITE, 1,
- &pclsObj1, &uReturn1);
- if (0 == uReturn1)
- {
- break;
- }
- VARIANT vtProp1;
- hr1 = pclsObj1->Get(L"CSName", 0, &vtProp1, 0, 0);
- wcout << " Computer Name : " << vtProp1.bstrVal << endl << endl;
- hr1 = pclsObj1->Get(L"Caption", 0, &vtProp1, 0, 0);
- wcout << " OS Name : " << vtProp1.bstrVal << endl;
- hr1 = pclsObj1->Get(L"RegisteredUser", 0, &vtProp1, 0, 0);
- wcout << " Registered User : " << vtProp1.bstrVal << endl;
- hr1 = pclsObj1->Get(L"BootDevice", 0, &vtProp1, 0, 0);
- wcout << " Boot Device : " << vtProp1.bstrVal << endl;
- hr1 = pclsObj1->Get(L"SystemDevice", 0, &vtProp1, 0, 0);
- wcout << " System Device : " << vtProp1.bstrVal << endl;
- hr1 = pclsObj1->Get(L"SerialNumber", 0, &vtProp1, 0, 0);
- wcout << " Serial Number : " << vtProp1.bstrVal << endl;
- hr1 = pclsObj1->Get(L"BuildNumber", 0, &vtProp1, 0, 0);
- wcout << " Build Number : " << vtProp1.bstrVal << endl;
- hr1 = pclsObj1->Get(L"BuildType", 0, &vtProp1, 0, 0);
- wcout << " Build Type : " << vtProp1.bstrVal << endl;
- hr1 = pclsObj1->Get(L"OSArchitecture", 0, &vtProp1, 0, 0);
- wcout << " OS Architecture : " << vtProp1.bstrVal << endl << endl;
- VariantClear(&vtProp1);
- pclsObj1->Release();
- pclsObj1 = NULL;
- }
- IWbemClassObject *pclsObj1_1 = NULL;
- uReturn1 = 0;
- wcout << "Installed Programs : " << endl;
- while (pEnumerator1_1)
- {
- HRESULT hr1 = pEnumerator1_1->Next(WBEM_INFINITE, 1,
- &pclsObj1_1, &uReturn1);
- if (0 == uReturn1)
- {
- break;
- }
- VARIANT vtProp1;
- hr1 = pclsObj1_1->Get(L"Name", 0, &vtProp1, 0, 0);
- wcout << " " << vtProp1.bstrVal << endl;
- VariantClear(&vtProp1);
- pclsObj1_1->Release();
- pclsObj1_1 = NULL;
- }
- IWbemClassObject *pclsObj1_2 = NULL;
- ULONG uReturn2 = 0;
- wcout << endl << "Active Processes : " << endl;
- while (pEnumerator1_2)
- {
- HRESULT hr1_2 = pEnumerator1_2->Next(WBEM_INFINITE, 1,
- &pclsObj1_2, &uReturn2);
- if (0 == uReturn2)
- {
- break;
- }
- VARIANT vtProp2;
- hr1_2 = pclsObj1_2->Get(L"Caption", 0, &vtProp2, 0, 0);
- wcout << " " << vtProp2.bstrVal << endl;
- VariantClear(&vtProp2);
- pclsObj1_2->Release();
- pclsObj1_2 = NULL;
- }
- IWbemClassObject *pclsObj1_3 = NULL;
- uReturn1 = 0;
- wcout << endl << "BIOS : " << endl;
- while (pEnumerator1_3)
- {
- HRESULT hr1 = pEnumerator1_3->Next(WBEM_INFINITE, 1,
- &pclsObj1_3, &uReturn1);
- if (0 == uReturn1)
- {
- break;
- }
- VARIANT vtProp3;
- hr1 = pclsObj1_3->Get(L"Name", 0, &vtProp3, 0, 0);
- wcout << " Name: " << vtProp3.bstrVal << endl;
- hr1 = pclsObj1_3->Get(L"Manufacturer", 0, &vtProp3, 0, 0);
- wcout << " Manufacturer:" << vtProp3.bstrVal << endl;
- hr1 = pclsObj1_3->Get(L"Version", 0, &vtProp3, 0, 0);
- wcout << " Version:" << vtProp3.bstrVal << endl;
- hr1 = pclsObj1_3->Get(L"SerialNumber", 0, &vtProp3, 0, 0);
- wcout << " Serial Number:" << vtProp3.bstrVal << endl;
- VariantClear(&vtProp3);
- pclsObj1_3->Release();
- pclsObj1_3 = NULL;
- }
- // Очистка // ========
- pSvc1->Release();
- pLoc1->Release();
- pEnumerator1->Release();
- if (pclsObj1) {
- pclsObj1->Release();
- }
- CoUninitialize();
- _getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement