Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WMI - создание процесса на удалённой машине, спотыкается на IWbemServices::GetObject 
:(
    Опции темы
cyberstream
Дата 13.2.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 7.9.2006

Репутация: нет
Всего: 4



Разрабатываем сабжевый DLL. (VС++ VS 2005)  На локальной машине (без ввода login/pass) процесс создаётся. На удалённой не хочет. IWbemServices::GetObject() выбивает ошибку 80070005 - Access is denied (если не ошибаюсь), хотя указываю реквизиты администратора, и ConnectToWbem выполняется успешно. В чём причина? Я поначалу искал в значениях флагов CoInitializeSecurity(.., RPC_C_AUTHN_LEVEL_xxx ,..) и CoSetProxyBlanket(...), но безуспешно. Могет сталкивались? Что посоветуете? 

Листинг DLL

Код

#include "stdafx.h"
#include "CProcess.h"
#include <stdlib.h>


#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif
//=======================================================================

extern "C" __declspec(dllexport) void CharCreateNewProcess(char* szMachineName, char* szCommandLine, char* szUserID, char* szPassword)
{ CProcess Process;
 HRESULT hr=0;
/*  hr=Process.CreateNewProcess("", "", "", szCommandLine); 
     if(FAILED(hr))
     {  wchar_t strg[12];
         _ltow(hr,strg,16);
        
             //MessageBox(NULL,L"Failed to create new process!",L"CreateNewProcess Failed",MB_OK);            
         MessageBox(NULL,strg,L"Process.CreateNewProcess Failed",MB_OK);            
     
     }
     else  */
     hr = Process.CreateNewProcess(szMachineName, szUserID, szPassword, szCommandLine);
     {    if(FAILED(hr))
        {  wchar_t strg[12];
           _ltow(hr,strg,16);
         MessageBox(NULL,strg,L" 2 Failed to create new process!",MB_OK);                    
        }
    }
}



Листинг CProcess.h

Код

#include "wbemcli.h"
#include "comdef.h"
#pragma comment (lib, "wbemuuid.lib")

class CProcess
{

private:
    IWbemLocator            *pLocator;
    IWbemServices            *pService;
    IWbemClassObject        *pInParameters;
    IWbemClassObject        *pMethodObject;
    STDMETHODIMP            ConnectToWbem(_bstr_t bstrMachine, _bstr_t bstrUserID, _bstr_t bstrPassword);
    HRESULT  hrDisplayError(HRESULT hRes);
public:

    CProcess();
    ~CProcess();
    STDMETHODIMP CreateNewProcess(_bstr_t bstrMachine, _bstr_t bstrUserID, _bstr_t bstrPassword, _variant_t    vCommandLine);

};

CProcess::CProcess()
{
    //CoInitialize(NULL);
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
}

CProcess::~CProcess()
{
    pInParameters->Release();
    pMethodObject->Release();
    pLocator->Release();
    pService->Release();
    CoUninitialize();
}

STDMETHODIMP CProcess::CreateNewProcess(_bstr_t bstrMachine, _bstr_t bstrUserID, _bstr_t bstrPassword, _variant_t vCommandLine)
{
HRESULT                hRes = 0;
IWbemClassObject    *pProcess = NULL;
IWbemClassObject    *pOutInst = NULL;
    

    hRes = ConnectToWbem(bstrMachine, bstrUserID, bstrPassword); 
    if(FAILED(hRes)) {  MessageBox(NULL,L"ConnectToWbem failed",L"CreateNewProcess",MB_OK);
     return hRes; } 

    hRes = pService->GetObject(_bstr_t(L"Win32_Process"), 0, NULL, &pProcess, NULL);
    if(FAILED(hRes)) 
    {//    hrDisplayError(hRes); 
        MessageBox(NULL,L"GetObject failed",L"CreateNewProcess",MB_OK);        
        return hRes; } //80070005
    

    hRes = pProcess->GetMethod(_bstr_t("Create"), 0, &pInParameters, NULL);
    if(FAILED(hRes)) {    MessageBox(NULL,L"GetMethod failed",L"CreateNewProcess",MB_OK);
        return hRes; }

    hRes = pInParameters->SpawnInstance(0, &pMethodObject);
    if(FAILED(hRes)) {    MessageBox(NULL,L"SpawnInstance failed",L"CreateNewProcess",MB_OK);
        return hRes; }

    hRes = pMethodObject->Put(_bstr_t(L"CommandLine"), 0, &vCommandLine, NULL);
    if(FAILED(hRes)) {    MessageBox(NULL,L"Put failed",L"CreateNewProcess",MB_OK);
        return hRes; }

    hRes = pService->ExecMethod(_bstr_t(L"Win32_Process"), _bstr_t(L"Create"), 0, NULL, pMethodObject, &pOutInst, NULL);
    if(FAILED(hRes)) {    MessageBox(NULL,L"ExecMethod failed",L"CreateNewProcess",MB_OK);
        return hRes; }

pProcess->Release();
pOutInst->Release();
return S_OK;
}//============================================================================

STDMETHODIMP CProcess::ConnectToWbem(_bstr_t bstrMachine, _bstr_t bstrUserID, _bstr_t bstrPassword)
{
HRESULT        hRes = 0;
_bstr_t        szConnectionPath;

    hRes = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,
                       RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0); 
   /* hRes = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_CONNECT,
                       RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0); 
    */if (FAILED(hRes))
    { MessageBox(NULL,L"CoInitializeSecurity failed",bstrPassword,MB_OK);
      //    hrDisplayError(hRes); 
      return hRes; // Program has failed.        
    }


    hRes = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLocator);
 
    if (FAILED(hRes))
    { MessageBox(NULL,L"CoCreateInstance failed",L"ConnectToWbem",MB_OK);
      return hRes; // Program has failed.        
    }

    if(SysStringLen(bstrMachine) == 0)
    {   szConnectionPath += "root\\cimv2"; //connect to local machine
    }
    else
    {   szConnectionPath += "\\\\";//set up connection string for remote machine
        szConnectionPath += bstrMachine;
        szConnectionPath += "\\root\\cimv2";
    }

    //if no UserName and PassWord supplied use NTLM to grab users access token
/*    if((SysStringLen(bstrUserID) == 0) && (SysStringLen(bstrPassword) == 0))
    {   hRes = pLocator->ConnectServer(    szConnectionPath, NULL, NULL, 0, NULL,    0, 0, &pService);
      if (FAILED(hRes))
        {  MessageBox(NULL,L"ConnectServer failed",L"ConnectToWbem",MB_OK);
           return hRes; // Program has failed.        
     }
    }
    else
*/    {    // Connect to the Root\Default namespace with the current user.
        hRes = pLocator->ConnectServer(    szConnectionPath, bstrUserID, bstrPassword, 0, NULL, 0, 0, &pService);
      if (FAILED(hRes))
        {  MessageBox(NULL,L"ConnectServer else failed",L"ConnectToWbem",MB_OK);
           return hRes; // Program has failed.        
     }
    }

    // Set the proxy so that impersonation of the client occurs.
    
    //hRes = CoSetProxyBlanket(pService, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
    hRes = CoSetProxyBlanket(pService, 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))
        {  MessageBox(NULL,L"CoSetProxyBlanket failed",L"ConnectToWbem",MB_OK);
           return hRes; // Program has failed.        
     }
    return S_OK;
}//============================================================================
 

ЗЫ: Sorry, если вопрос не к этому разделу.
--------------------
Не знаешь кого спросить? - Спроси google!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0401 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.