Форум программистов, компьютерный форум CyberForum.ru

Попытка получения запущенных процессов на удалённом компьютере - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
another
0 / 0 / 0
Регистрация: 22.12.2010
Сообщений: 37
02.08.2011, 16:59     Попытка получения запущенных процессов на удалённом компьютере #1
При попытке получить список запущенных процессов, прога завершается авариино.
Под дебагом говорит что какие-то проблемы в переменной spServices.
Может кто-нибудь подскажет где собака порылась?
Вот код:

try
{
TCHAR szServer[256];
_bstr_t bstrServer;
IWbemLocatorPtr spLocator;
IWbemServicesPtr spServices(NULL);
IEnumWbemClassObjectPtr spEnum(NULL);
IWbemClassObjectPtr spObject(NULL);
ULONG ulCount;
CString m_strText;

memset(szServer,0,sizeof(szServer));

// create a WBEM locator object
hRes=CoCreateInstance(__uuidof(WbemLocator), NULL,
CLSCTX_INPROC_SERVER, __uuidof(IWbemLocator),
(PVOID *)&spLocator);

if(FAILED(hRes))
_com_issue_error(hRes);

//m_strMachineName - the name of the remote computer

if(m_strMachineName.IsEmpty())
lstrcpy(szServer, _T('root\cimv2'));
else
wsprintf(szServer, _T('%s\root\cimv2'),m_strMachineName);

hRes=spLocator->ConnectServer(_bstr_t(szServer),NULL,
NULL, NULL, 0, NULL, NULL, &spServices);

if(FAILED(hRes))
_com_issue_error(hRes);

// create an enumerator of processes
hRes=spServices->CreateInstanceEnum(_bstr_t(L'Win32_Process'),
WBEM_FLAG_SHALLOW|WBEM_FLAG_FORWARD_ONLY,NULL, &spEnum);

if(FAILED(hRes))
_com_issue_error(hRes);

// walk through all processes
while(spEnum->Next(WBEM_INFINITE, 1, &spObject, &ulCount) == S_OK)
{
_variant_t valId;
_variant_t valName;

// retrieve process name
hRes = spObject->Get(L'Name', 0, &valName, NULL, NULL);
if (FAILED(hRes))
{
spObject = NULL;
continue;
}

// retrieve process identifier
hRes=spObject->Get(L'ProcessId', 0, &valId, NULL, NULL);

if(FAILED(hRes))
{
spObject = NULL;
continue;
}

_ASSERTE(valId.vt == VT_I4);
_ASSERTE(valName.vt == VT_BSTR);

// Output data
m_ListCtrl.InsertItem((LPCTSTR)_bstr_t(valName));
m_strText.Format(TEXT('%u'),valId.lVal);
m_ListCtrl.SetItemText(1,m_strText);

spObject = NULL;
}
}
catch(_com_error& err)
{
SetLastError(err.Error());
MessageBox(err.ErrorMessage());
}

Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2011, 16:59     Попытка получения запущенных процессов на удалённом компьютере
Посмотрите здесь:

Запись запущенных программ в лог файл. C++
неудачная попытка программы C++
C++ и количество запущенных процессов C++
Как определить время на удалённом сервере? C++
Проверить список запущенных процессов на наличие нужного C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ghost
Сообщений: n/a
02.08.2011, 20:10     Попытка получения запущенных процессов на удалённом компьютере #2
зашибись обращение за поддержкой товарищей.
1. код сам писал? или на рсдн взял? так там ошибка. где - скажу только после того, как нормально опишешь ситуацию.
2. где именно у тебя вылетает программа? при выполнении какого оператора?
3. выдирая куски из контекста не забудь, что другим, чтобы разобраться в программе, её надо будет или долго читать или скомпилировать. тэг кодэ использовать мог?
another
0 / 0 / 0
Регистрация: 22.12.2010
Сообщений: 37
03.08.2011, 11:47  [ТС]     Попытка получения запущенных процессов на удалённом компьютере #3
Так вот:

Код=Сам+MSDN+(текстуха по WMI)+Дейл Роджерсон(в эл-ом виде).
Ситуация следующая:
Для того, чтобы получить список процессов запущенных на удалённом компе необходимо знать его имя (имя компа). Имя получаю с использованием следующего кода:

/////////////////////////////////////////////////////////
IMalloc *pMalloc=NULL;
HRESULT hRes(SHGetMalloc(&pMalloc));

if(FAILED(hRes))
AfxThrowOleException((SCODE)hRes);

BROWSEINFO bi;
LPITEMIDLIST pidl,pidlRoot;
TCHAR szComputer[256];

memset(szComputer,0,sizeof(szComputer));

hRes=SHGetSpecialFolderLocation(m_hWnd,CSIDL_NETWORK, &pidlRoot);

if(FAILED(hRes))
{
pMalloc->Release();
AfxThrowOleException((SCODE)hRes);
}

memset(&bi,0,sizeof(bi));

bi.hwndOwner=m_hWnd;
bi.ulFlags=BIF_BROWSEFORCOMPUTER|BIF_EDITBOX;
bi.pidlRoot=pidlRoot;
bi.pszDisplayName=szComputer;

pidl=SHBrowseForFolder(&bi);

pMalloc->Free(pidlRoot);
if(pidl != NULL)
pMalloc->Free(pidl);
pMalloc->Release();

if(pidl==NULL)
return;

if(szComputer[0]!=_T('\ '))
{
m_strMachineName=_T('\\ ');
m_strMachineName+=szComputer;
}
else
m_strMachineName=szComputer;
////////////////////////////////////////////////////////
ОК, получил (strMachineName).

Дальше хочу получить список запущенных процессов на этой тачке (код представлен выше, поэтому, с твоего позволения, не буду его дублировать), при этом, если try{}catch(){} не закоментарен, вылетает исключение - IDispatch error #3587 (если оно тебе о чём-нибудь говорит). Коментарю try{}catch(){}, запускаюсь под дебагом и благополучно вылетаю на
while(spEnum->Next(WBEM_INFINITE, 1, &spObject, &ulCount) == S_OK){}.

Смотрю, в воче переменная spServices красным цветом.

Далее, не знаю что делать (не знаю в чём проблема). Проблема в том, что COM я начал изучать буквально два дня назад, а на WMI посмотрел вчера.
Спасибо, что откликнулся!
Ghost
Сообщений: n/a
03.08.2011, 12:07     Попытка получения запущенных процессов на удалённом компьютере #4
1. Вот ссылка на RSDN-новскую статью, рекомендую.
2. там одна ошибка - вместо '\ ' и ' ' надо использовать '//' и '/' - тогда все работает (у меня по крайней мере)

вот изменение кода:
Код
		CString m_strMachineName('//.');
		if(m_strMachineName.IsEmpty())
			lstrcpy(szServer, _T('root/cimv2'));
		else
			wsprintf(szServer, _T('%s/root/cimv2'),m_strMachineName);
3. Не забывай провести инициализацию COM & OLE - в статье это хорошо прописано.

4. на всякий пожарный привожу пример работающего у меня кода (VS 2003, C++)

[code]
// CAXTest0.cpp : Defines the entry point for the console application.
//

#include 'stdafx.h'

#include <comdef.h>
#include <atlbase.h>
#include <comutil.h>
#include <Wbemidl.h>
#include <SshWbemHelpers.h>

#include 'CAXTest0.h'
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// The one and only application object

CWinApp theApp;

using namespace std;

void testApp(void);

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T('Fatal Error: MFC initialization failed
'));
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
AfxOleInit();
CoInitialize(0);
CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
testApp();
}

return nRetCode;
}

void testApp(void)
{
try
{

TCHAR szServer[256];
_bstr_t bstrServer;
IWbemLocatorPtr spLocator;
IWbemServicesPtr spServices(NULL);
IEnumWbemClassObjectPtr spEnum(NULL);
IWbemClassObjectPtr spObject(NULL);
ULONG ulCount;
CString m_strText;

memset(szServer,0,sizeof(szServer));

// create a WBEM locator object
HRESULT hRes=CoCreateInstance(__uuidof(WbemLocator), NULL,
CLSCTX_INPROC_SERVER, __uuidof(IWbemLocator),
(PVOID *)&spLocator);

if(FAILED(hRes))
_com_issue_error(hRes);

//m_strMachineName - the name of the remote computer

CString m_strMachineName('//.');
if(m_strMachineName.IsEmpty())
lstrcpy(szServer, _T('root/cimv2'));
else
wsprintf(szServer, _T('%s/root/cimv2'),m_strMachineName);

hRes=spLocator->ConnectServer(_bstr_t(szServer),NULL,
NULL, NULL, 0, NULL, NULL, &spServices);

if(FAILED(hRes))
_com_issue_error(hRes);

// create an enumerator of processes
hRes=spServices->CreateInstanceEnum(_bstr_t(L'Win32_Process'),
WBEM_FLAG_SHALLOW|WBEM_FLAG_FORWARD_ONLY,NULL, &spEnum);

if(FAILED(hRes))
_com_issue_error(hRes);

// walk through all processes
while(spEnum->Next(WBEM_INFINITE, 1, &spObject, &ulCount) == S_OK)
{
_variant_t valId;
_variant_t valName;

// retrieve process name
hRes = spObject->Get(L'Name', 0, &valName, NULL, NULL);
if (FAILED(hRes))
{
spObject = NULL;
continue;
}

// retrieve process identifier
hRes=spObject->Get(L'ProcessId', 0, &valId, NULL, NULL);

if(FAILED(hRes))
{
spObject = NULL;
continue;
}

_ASSERTE(valId.vt == VT_I4);
_ASSERTE(valName.vt == VT_BSTR);

// Output data
Ghost
Сообщений: n/a
03.08.2011, 23:01     Попытка получения запущенных процессов на удалённом компьютере #5
хха. ссылка где-то затерялась. ну и фиг с ней - сам найдешь )
Yandex
Объявления
03.08.2011, 23:01     Попытка получения запущенных процессов на удалённом компьютере
Ответ Создать тему
Опции темы

Текущее время: 05:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru