Привет всем.
Ситуация такая: возникла необходимость получить SID пользователя, являющегося владельцем процесса. Собственно, функция была написана, и отлажена, но возникла одна проблема:
на некоторых процессах функция отрабатывает нормально, на других - отказывается корректно выполнять вот этот кусок:
if((hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, pid)) != 0) {
// если пришли сюда - дальше все выполняется корректно ...
...
}
else {
int err = GetLastError();
ShowMessage("Error (" + IntToStr(err) + "): " + SysErrorMessage(err));
}
Какая ОС?
WinXP ...
С первой частью все понятно, была отключена привилегия SE_DEBUG_NAME, после ее включения (спасибо мисс_граффити за подсказку) OpenProcess перестал выдавать ошибку #87 и ошибку #5 (ERROR_ACCESS_DENIED), которая стала появляться при попытке открыть процесс в режиме PROCESS_QUERY_INFORMATION|PROCESS_VM_READ...
Зато проявилась другая ошибка: при попытке
OpenProcessToken(hProcess, TOKEN_QUERY, &TokenHandle);для дальнейшего получения информации - в частности SIDа и имени Owner-а процесса - через GetTokenInformation + LookupAccountSid происходит вообще нечто непонятное: если только владельцем процесса является "LOCAL SERVICE" или "NETWORK SERVICE", то попытка вызвать OpenProcessToken заканчивается тем же ERROR_ACCESS_DENIED, все остальные владельцы обрабатываются нормально.
OpenProcessToken(hProcess, TOKEN_QUERY, &TokenHandle);для дальнейшего получения информации - в частности SIDа и имени Owner-а процесса - через GetTokenInformation + LookupAccountSid происходит вообще нечто непонятное: если только владельцем процесса является "LOCAL SERVICE" или "NETWORK SERVICE", то попытка вызвать OpenProcessToken заканчивается тем же ERROR_ACCESS_DENIED, все остальные владельцы обрабатываются нормально.
Очень интересно... Почему тогда
tasklist /v
из командной строки выдает Domain/UserName для всех процессов?