Под каким пользователем запущен процесс?
От: вфкл Россия  
Дата: 25.02.03 15:08
Оценка:
Вопрос: subj.
Пробовал через WMI (GetOwner метод класса Wn32_Process) — не вышло. Хотя в MSDN описано, как это сделать с через Visual Basic, портировать это на Си не вышло:

ISWbemServise *serv;
ISWbemLocator *loc;
HRESULT res;

res=CoCreateInstance(__uuidof(SWbemLocator), NULL,
CLSCTX_INPROC_SERVER, __uuidof(ISWbemLocator),
(PVOID *)&loc);
res=loc->ConnectServer(NULL,L"root\\cimv2",L"",L"",L"",L"",0,NULL,&serv);

res=serv->Get(L"Win32_Processor",wbemFlagUseAmendedQualifiers,NULL,&obj);

res=obj->Instances_(0,NULL,&objset);

последний результат дает unexpected error. Что я делаю неправильно?
Или есть какой-то иной способ найти имя пользователя, под которым процесс запущен?
Re: Под каким пользователем запущен процесс?
От: Yuri Россия http://spbdetails.ru
Дата: 25.02.03 15:10
Оценка: 9 (1)
BOOL GetUserNameForProcess(HANDLE hProcess, PTSTR ptUser, DWORD *pdwUserLen, PTSTR ptDomain, DWORD *pdwDomainLen)
{
PTOKEN_USER ptiUser = NULL;
HANDLE hToken = NULL;

if (NULL == hProcess)
return FALSE;

__try {
if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken))
return FALSE;

DWORD cbti = 0;
if (GetTokenInformation(hToken, TokenUser, NULL, 0, &cbti)) {
return FALSE;
} else {
if (ERROR_INSUFFICIENT_BUFFER != GetLastError())
return FALSE;
}

if (0 == cbti)
return FALSE;

ptiUser = (PTOKEN_USER)::HeapAlloc(GetProcessHeap(), 0, cbti);
if (!ptiUser)
return FALSE;

if (!::GetTokenInformation(hToken, TokenUser, ptiUser, cbti, &cbti))
return FALSE;

SID_NAME_USE snu;
if (!::LookupAccountSid(NULL, ptiUser->User.Sid, ptUser, pdwUserLen, ptDomain, pdwDomainLen, &snu))
return FALSE;

} __finally {
if (hToken)
::CloseHandle(hToken);

if (ptiUser)
::HeapFree(GetProcessHeap(), 0, ptiUser);
}

return TRUE;
}
Take it easy.
Re[2]: Под каким пользователем запущен процесс?
От: вфкл Россия  
Дата: 25.02.03 16:55
Оценка:
Спасибо большое, Yuri! Буду пробовать.

Но все таки хотелось бы узнать, как использовать WMI и Wmi32_Process c методом GetOwner на Си++.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.