Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi и WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
pv
0 / 0 / 1
Регистрация: 11.05.2011
Сообщений: 44
#1

Как получить имя пользователя по PID - Delphi WinAPI

28.04.2012, 15:49. Просмотров 1405. Ответов 5
Метки нет (Все метки)

Здравствуйте.
Делаю диспетчер задач.
Возник вопрос, как получить имя пользователя по PID процесса? Возможно ли такое?
Вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var
Ippe:TProcessEntry32;
i:Integer;
Snap:THandle;
begin
// Процессы
Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Snap = -1 then
raise Exception.Create('CreateToolHelp32Snapshot failed');
 
Ippe.dwSize := SizeOf(TProcessEntry32);
Process32First(Snap, Ippe);
i:=1;
 
repeat
with Proc do begin
Cells[0,i]:=ippe.szExeFile;
Cells[4,i]:=IntToStr(ippe.th32ProcessID);
Cells[5,i]:=IntToStr(ippe.cntThreads);
Cells[6,i]:=IntToStr(ippe.pcPriClassBase);
end;
inc(i);
until not process32next(snap,ippe);
Proc.RowCount:=i;
CloseHandle(Snap);
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2012, 15:49
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как получить имя пользователя по PID (Delphi WinAPI):

как сохранить имя пользователя и его результат в текстовом файле
На Делфи 7 делаю тест. Пользователь вводит свое имя в Edit, затем проходит тест...

Получить PID всех окон при изменении ключа реестра
Помогите нужно при изменении ключа реестра получить PID всех открытых окон: ...

Как получить Имя Домена
Чето я туплю под вечер.... Искал в реесте, не нашел ничего путного, лазил по...

Как определить (получить) имя или адрес машины в локалке, на которой установлен MS SQL
А если можно, то список таких машин

Получить имя диска
Как получить имя диска по букве или номеру? Пробую такой код, но не помогает ...

Получить время входа в систему пользователя
Есть такая функция, но выдаёт время на годы вперёд, что не так? function...

5
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25622 / 17175 / 6830
Регистрация: 22.10.2011
Сообщений: 30,369
Записей в блоге: 6
28.04.2012, 17:10 #2
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Возможно. Первый набросок - вот так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function GetUserByPID(pid : DWORD) : string;
var
   hProcess, hToken : THandle;
   AccountName, DomainName : array[0 .. MAXCHAR - 1] of Char;
   lenNeeded : DWORD;
   userData : PTokenUser;
   dwRes, AccSize, DomSize : DWORD;
   sidType : SID_NAME_USE;
   bRes : BOOL;
begin
   result := '';
   hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, pid);
   if(hProcess <> INVALID_HANDLE_VALUE) then
   begin
      OpenProcessToken(hProcess, TOKEN_QUERY, hToken);
      lenNeeded := 0;
      GetTokenInformation(hToken, TokenUser, nil, 0, lenNeeded);
 
      if GetLastError = ERROR_INSUFFICIENT_BUFFER then
      begin
         userData := HeapAlloc(GetProcessHeap, 0, lenNeeded);
         if userData <> nil then
         begin
            bRes := GetTokenInformation(hToken, TokenUser, userData, lenNeeded, lenNeeded);
            if bRes then
            begin
               sidType := SidTypeUnknown;
               AccSize := MAXCHAR;
               DomSize := MAXCHAR;
               bRes := LookupAccountSid(nil, userData^.User.Sid, accountName,
                                        AccSize, domainName, DomSize, sidType);
               Result := StrPas(domainName) + '\' + StrPas(accountName);
            end;
            HeapFree(GetProcessHeap, 0, userData);
         end;
      end;
      CloseHandle(hProcess);
   end;
end;
проверить сейчас негде, но вроде не накосячил...
1
pv
0 / 0 / 1
Регистрация: 11.05.2011
Сообщений: 44
28.04.2012, 19:20  [ТС] #3
PTokenUser не определяет. tlHelp32 прописан
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25622 / 17175 / 6830
Регистрация: 22.10.2011
Сообщений: 30,369
Записей в блоге: 6
28.04.2012, 20:11 #4
PTokenUser - это ^TOKEN_USER. Если у тебя это не определяет - значит, у тебя битый Windows.pas (или просто старый)
1
Миниатюры
Как получить имя пользователя по PID  
pv
0 / 0 / 1
Регистрация: 11.05.2011
Сообщений: 44
28.04.2012, 20:29  [ТС] #5
а какую делфи вы юзаете?
Дайте ссылочку или точное название=) у меня обычная delphi 7
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25622 / 17175 / 6830
Регистрация: 22.10.2011
Сообщений: 30,369
Записей в блоге: 6
28.04.2012, 20:36 #6
У меня Delphi 2009. Попробуй еще добавить в начале программы вот такое описание:
Delphi
1
2
3
4
5
type
  PTokenUser = ^TTokenUser;
  TTokenUser = packed record
    User: SID_AND_ATTRIBUTES;
  end;
, хотя SID_AND_ATTRIBUTES тоже может не быть, они появились одновременно с TOKEN_USER.
0
28.04.2012, 20:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2012, 20:36
Привет! Вот еще темы с решениями:

Получить имя или pid родительского процесса
Имеется имя файла И pid процесса. Нужно узнать имя файла ИЛИ pid его родителя ...

Получить имя или pid родительского процесса
Имеется имя файла И pid процесса. Нужно узнать имя файла ИЛИ pid его родителя ...

Как получить имя пользователя в скрипте?
Доброе время суток. Возник вопрос - каким образом я могу получить данные о...

Как получить имя пользователя NT домена ? (0)
Как получить имя пользователя NT домена ? (0)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru