Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2012, 10:58   #1
][acker
Пользователь
 
Аватар для ][acker
 
Регистрация: 19.10.2011
Сообщений: 12
Восклицание Узнать имя пользователя запустившего процесс

Хай! Необходимо узнать имя пользователя запустившего процесс. Знаю тема заезженная, но у меня проблема: запускаю процесс от другого пользователя и функция OpenProcessToken(pid,TOKEN_QUERY,hT oken) выдает ошибку, мол "Отказано в доступе". Выставлял привилегии "SeDebugPrivilege". Пол инета перерыл, и понял что проблема скорее всего в DACL, нарыл код который сбрасывает настройки DACL, но проблема не решена, всё равно OpenProcessToken(pid,TOKEN_QUERY,hT oken) выдаёт ошибку отказа в доступе. Возможно ли её обойти?
][acker вне форума Ответить с цитированием
Старый 21.03.2012, 11:11   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Какой ещё PID? У OpenProcessToken первый параметр - описатель.

Если ты открываешь свой процесс, то OpenProcessToken не может вернуть access denied, потому что описатель GetCurrentProcess даёт PROCESS_ALL_ACCESS.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 21.03.2012, 11:18   #3
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,762
По умолчанию

а функция GetUserName не помогает?
vovk вне форума Ответить с цитированием
Старый 21.03.2012, 11:33   #4
][acker
Пользователь
 
Аватар для ][acker
 
Регистрация: 19.10.2011
Сообщений: 12
По умолчанию

Прилагаю код в студию:
h:=OpenProcess(PROCESS_QUERY_INFORM ATION, false, strtoint(rlist.Strings[i]));
chDomain:=50;
chUser :=50;
if not GetCurrentUserAndDomain(h,User,chus er,Domain,chDomain) then
begin
user:='Не определено';
end;
function GetCurrentUserAndDomain (var pid:Thandle;
szUser : PChar; var chUser: DWORD; szDomain :PChar; var chDomain : DWORD
):Boolean;
var
hToken : THandle;
cbBuf : Cardinal;
ptiUser : PTOKEN_USER;
snu : SID_NAME_USE;
begin
Result:=false;
if not OpenProcessToken(pid,TOKEN_QUERY,hT oken)
then exit;
// Вывываем GetTokenInformation для получения размера буфера
if not GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf)
then if GetLastError()<> ERROR_INSUFFICIENT_BUFFER
then begin
CloseHandle(hToken);
exit;
end;

if cbBuf = 0 then exit;

// Выделяем память под буфер
GetMem(ptiUser,cbBuf);

// В случае удачного вызова получим указатель на TOKEN_USER
if
//GetUserName(szUser,chUser)
GetTokenInformation(hToken,TokenUse r,ptiUser,cbBuf,cbBuf)
then begin
// Ищем имя пользователя и его домен по его SID
if LookupAccountSid(nil,ptiUser.User.S id,szUser,chUser,szDomain,chDomain, snu)
then
Result:=true;
end;

// Освобождаем ресурсы
CloseHandle(hToken);
FreeMem(ptiUser);
end;
][acker вне форума Ответить с цитированием
Старый 21.03.2012, 11:37   #5
][acker
Пользователь
 
Аватар для ][acker
 
Регистрация: 19.10.2011
Сообщений: 12
По умолчанию

Если я не ошибаюсь, то GetUserName возвращает имя пользователя запустившего текущий процесс.
][acker вне форума Ответить с цитированием
Старый 21.03.2012, 11:40   #6
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,762
По умолчанию

Цитата:
Сообщение от ][acker Посмотреть сообщение
Если я не ошибаюсь, то GetUserName возвращает имя пользователя запустившего текущий процесс.
Да, так и есть.
АА нужно узнать кто запустил сторонний процесс?
vovk вне форума Ответить с цитированием
Старый 21.03.2012, 11:49   #7
][acker
Пользователь
 
Аватар для ][acker
 
Регистрация: 19.10.2011
Сообщений: 12
По умолчанию

Да, сторонний процесс. Я создал пользователя, для теста, и запускаю от его имени процесс, а под своей учёткой не могу определить его имя. Отказано в доступе....
][acker вне форума Ответить с цитированием
Старый 21.03.2012, 11:56   #8
][acker
Пользователь
 
Аватар для ][acker
 
Регистрация: 19.10.2011
Сообщений: 12
По умолчанию

Есть ещё один вариант получить имя пользователя этой функцией, но для этого необходимо попасть на ring0, но для Win7 я не могу найти подходящий драйвер...
][acker вне форума Ответить с цитированием
Старый 21.03.2012, 12:58   #9
][acker
Пользователь
 
Аватар для ][acker
 
Регистрация: 19.10.2011
Сообщений: 12
По умолчанию

Есть какие-нибудь предложения?
][acker вне форума Ответить с цитированием
Старый 23.03.2012, 16:04   #10
][acker
Пользователь
 
Аватар для ][acker
 
Регистрация: 19.10.2011
Сообщений: 12
Радость

Количество всегда переходит в качество!
http://forum.ixbt.com/topic.cgi?id=26:33840
][acker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имя пользователя под которым запущен процесс nikcpp Win Api 2 13.04.2011 13:42
Узнать имя листа, если известно кодовое имя tae1980 Microsoft Office Excel 3 20.03.2011 21:57
узнать имя пользователя и пароль windows D1AVOL Общие вопросы Delphi 7 09.01.2010 12:16
Узнать имя текущего пользователя и букву диска с запущенной Windows Vistar Общие вопросы .NET 1 02.12.2009 18:16
Как узнать имя залогинившегося пользователя? Stilet JavaScript, Ajax 5 13.08.2009 23:02