![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать владельца процесса? [Win2k, WinXP]
KSergey © (2005-07-22 15:58:00)Необходимо узнать имя пользователя, под которым запущен процесс по PID этого процесса.
Используется схема:
OpenProcess -> OpenProcessToken -> GetTokenInformation
Однако для некоторых процессов на OpenProcessToken заваливаемся с ошибкой Acces Denided (5).
Попытка выполнить для таких процессов OpenProcessToken с установкой Debug привилегий (чо помогает для OpenProcess) к успеху не приводит.
Вопрос: как эту проблему решить? А может я вообще не тем путем пошел? А каким надо?
На всякий случай, изначальная задача: поубивать в системе процессы с определенным именем запущенные из-под определенного пользователя.
Получилось все, кроме фильтрации имени пользователя...
KSergey (2005-07-25 07:56:00) [1]В общем беда, оказывается, в равах пользователя, под которым запускается программа.
Под LocalSystem все работает отлично.
Спасибо за участие.
PS
А я пошел новый вопрос стряпать...
BiN (2005-07-22 23:45:00) [2]KSergey © (22.07.05 19:48) [6]
Хм, да, действительно. Не получается открыть.-(
Если копнуть поглубже, можно увидеть, что маркеры, созданные seclogon-ом, да, в принципе, и другими источниками маркеров, по умолчанию открыты только для пользователя-владельца и для системной учетной записи. Почему-то, подобный маркер не удалось также открыть на запись Sid-a владельца (флаг WRITE_OWNER) даже при наличии привилегии SE_TAKE_OWNERSHIP_NAME. Мистика.
Доступ к маркеру целевого процесса удалось получить, сдуплицировав уже существующий описатель маркера. Но это -искусственная ситуация и врятли может помочь в данном случае.
Понятное дело, что здесь не рассматривались выкрутасы с внедрением и с чтением структур ядра напрямую, ибо не спортивно.
Piter (2005-07-22 19:58:00) [3]KSergey © (22.07.05 15:58)
Как узнать владельца процесса?
по прическе можно, по лицу, по бороде. Можно по очкам, еслиесть онные
KSergey (2005-07-22 19:48:00) [4]Пока набирал предыдущий пост - мысль по дороге потерялась :)
Причем, еще раз подчеркну, что для OpenProcess привилегия помогает, для OpenProcessToken - нифига...
KSergey (2005-07-22 19:46:00) [5]Я не знаю, есть ли на чем у вас сейчас жевьем играться, но на самом деле иммитировать мою ситуацию просто: завести на машине некоего пользователя (например с правами "обычные пользователи", хотя это и не принципиально) и от имени этого пользователя запустить какой-либо процесс. И все. На этом процессе все заламывается.
Причем, еще раз подчеркну...
Если в вашем случае при этом все работает - было бы очень прелюбопытно взглянуть на вашкод - может я упускаю какую-то деталь при включении привилегий? Или еще что-то?
BiN (2005-07-22 17:43:00) [6]При использовании подобного кода у меня не получилось открыть маркеры лишь процессов Idle и System. Все остальные процессы "поддались" при включенной отладочной пивилегии, которая, впрочем, понадобилась только при открытии процесса подсистемы Win32 (csrss).
KSergey (2005-07-22 16:37:00) [7]Мдя.. табуляции все поелись...
KSergey (2005-07-22 16:35:00) [8]Я, конечно, не уточнил. но разумеется, что TOKEN_QUERY
Если это важно - код такой (на вражьем, правда)
bool
getProcUserName(DWORD processId, std::string& strUserName)
{
HANDLE hProcess;
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, processId);
if (!hProcess) {
return false;
}
HANDLE hToken;
HANDLR hProcDup;
hProcDup = DuplicateHandle(
if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)) {
return false;
}
char buf[2000];
TOKEN_USER tu;
DWORD dwLen;
if (GetTokenInformation(hToken, TokenUser, &buf, sizeof(buf), &dwLen)) {
... тут пошел разбор полученой информации ...
} else {
return false;
}
CloseHandle(hToken);
return true;
}
Валится именно на OpenProcessToken
Если необходимо, погу привести полный код. Штука в том, что вместо OpenProcess используется оберточка, которая в случае неудачи OpenProcess назначает Debug привилегии и стова зовет OpenProcess.
Эта часть работает, а вот на OpenProcessToken валится, причем тот же финт с Debug привилегиями не проходит..
BiN (2005-07-22 16:06:00) [9]Какой доступ запрашиваешь при открытии маркера?
Для твоей задачи достаточно TOKEN_QUERY.