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;
- }
- // change the computerName strings below to the full computer name
- // of the remote computer
- if (!useNTLM)
- {
- StringCchPrintf(pszAuthority, CREDUI_MAX_USERNAME_LENGTH + 1,
- //L"kERBEROS:%s", L"WIN-HQPJIBBHJTC");
- L"kERBEROS:%s", L"WIN-HQPJIBBHJTC");
- }
- // Подключение к пространству имен root\cimv2
- //---------------------------------------------------------
- hres = pLoc->ConnectServer(
- //_bstr_t(L"\\\\WIN-HQPJIBBHJTC\\root\\cimv2"),
- _bstr_t(L"\\\\WIN-HQPJIBBHJTC\\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;
- // Выбираем поле Name
- 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;
- // Выбираем поле Name
- hr3 = pclsObj3->Get(L"displayName", 0, &vtProp, 0, 0);
- wcout << " Firewall Name : " << vtProp.bstrVal << endl;
- //hr3 = pclsObj3->Get(L"pathToSignedProductExe", 0, &vtProp, 0, 0);
- //wcout << " Firewall pathToSignedProductExe : " << 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;
- // Получение реквизитов доступа к удаленному компьютеру
- // change the computerName strings below to the full computer name
- // of the remote computer
- if (!useNTLM)
- {
- StringCchPrintf(pszAuthority, CREDUI_MAX_USERNAME_LENGTH + 1,
- //L"kERBEROS:%s", L"WIN-HQPJIBBHJTC");
- L"kERBEROS:%s", L"WIN-HQPJIBBHJTC");
- }
- // Подключение к пространству имен root\cimv2
- //---------------------------------------------------------
- hres1 = pLoc1->ConnectServer(
- //_bstr_t(L"\\\\WIN-HQPJIBBHJTC\\root\\cimv2"),
- _bstr_t(L"\\\\WIN-HQPJIBBHJTC\\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
- //IWbemServices *pSvc1 = NULL;
- 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;
- 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);
- 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
- );
- 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;
- //OS Name
- hr1 = pclsObj1->Get(L"Caption", 0, &vtProp1, 0, 0);
- wcout << " OS Name : " << vtProp1.bstrVal << endl;
- //RegisteredUser
- hr1 = pclsObj1->Get(L"RegisteredUser", 0, &vtProp1, 0, 0);
- wcout << " Registered User : " << vtProp1.bstrVal << endl;
- //BootDevice
- hr1 = pclsObj1->Get(L"BootDevice", 0, &vtProp1, 0, 0);
- wcout << " Boot Device : " << vtProp1.bstrVal << endl;
- //SystemDevice
- hr1 = pclsObj1->Get(L"SystemDevice", 0, &vtProp1, 0, 0);
- wcout << " System Device : " << vtProp1.bstrVal << endl;
- //SerialNumber
- hr1 = pclsObj1->Get(L"SerialNumber", 0, &vtProp1, 0, 0);
- wcout << " Serial Number : " << vtProp1.bstrVal << endl;
- //BuildNumber
- hr1 = pclsObj1->Get(L"BuildNumber", 0, &vtProp1, 0, 0);
- wcout << " Build Number : " << vtProp1.bstrVal << endl;
- //OSArchitecture
- 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 << "Programs Name : " << endl;
- while (pEnumerator1_1)
- {
- HRESULT hr1 = pEnumerator1_1->Next(WBEM_INFINITE, 1,
- &pclsObj1_1, &uReturn1);
- if (0 == uReturn1)
- {
- break;
- }
- VARIANT vtProp1;
- // Выбираем поле Name
- hr1 = pclsObj1_1->Get(L"Name", 0, &vtProp1, 0, 0);
- wcout << " "<< vtProp1.bstrVal << endl;
- VariantClear(&vtProp1);
- pclsObj1_1->Release();
- pclsObj1_1 = 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