
Шустрый

Профиль
Группа: Участник
Сообщений: 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!
|