Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.25;
Скачать: CL | DM;

Вниз

Подскажите как определить имя пользователя которому пренадлежит п   Найти похожие ветки 

 
chili   (2005-05-31 11:26) [0]

Добрый день.
Подскажите как определить имя пользователя которому пренадлежит процесс. По имени процесса.


 
Игорь Шевченко ©   (2005-05-31 11:43) [1]



type
 ZString = array[0..1024] of char;

function SIDToName (const SID: PSID): string;
var
 Use: SID_NAME_USE;
 DomainName: ZString;
 DomainNameLength: DWORD;
 Name: ZString;
 NameLength: DWORD;
begin
 if not LookupAccountSid(nil, SID, Name, NameLength, DomainName,
    DomainNameLength, Use) then
   Result := "***"
 else
   Result := Name;
end;

function LookupProcessOwner(AProcessId: Integer): string;
var
 AccessToken: THandle;
 Info: PSIDANDATTRIBUTES;
 ReturnLength: DWORD;
 ProcessHandle: THandle;
begin
 Result := "";
 ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, false,
    AProcessId);
 if ProcessHandle = 0 then
   Exit;
 try
   if not OpenProcessToken(ProcessHandle, TOKEN_QUERY, AccessToken) then
     Exit;
   GetMem (Info, 4096);
   try
     Win32Check(GetTokenInformation(AccessToken, TokenUser, Info, 4096,
       ReturnLength));
     Result := SidToName(Info^.Sid);
   finally
     FreeMem(Info);
     CloseHandle(AccessToken);
   end;
 finally
   CloseHandle(ProcessHandle);
 end;
end;



 
chili   (2005-05-31 12:20) [2]

а как получить AProcessId?


 
chili   (2005-05-31 12:24) [3]

// Заполняем массив идентификаторов запущенных процессов
EnumProcesses(@Processes, SizeOf(Processes), cbNeeded)

но массив Processes имеет тип DWORD, как его преобразовать в integer?


 
chili   (2005-05-31 12:29) [4]

упс извините за тупой вопрос, уже разобрался


 
chili   (2005-05-31 12:36) [5]

> Игорь Шевченко ©

Но у меня почемуто не работает постоянно *** возвращает

делаю так :

const
 MaxProcesses = 1024;
var
 Processes: array[0 .. MaxProcesses - 1] of DWORD;
 ModuleHandle: HMODULE;
 cbNeeded: DWORD;
 ProcessName: array[0 .. MAX_PATH - 1] of Char;
 I: Integer;
begin
 if EnumProcesses(@Processes, SizeOf(Processes), cbNeeded) then
   for I := 0 to cbNeeded div SizeOf(DWORD) - 1 do
   begin
     Result := OpenProcess(PROCESS_QUERY_INFORMATION or               PROCESS_VM_READ or SYNCHRONIZE, False, Processes[I]);
     if Result <> 0 then
     begin
       if EnumProcessModules(Result, @ModuleHandle, SizeOf(ModuleHandle), cbNeeded) then
       begin
         GetModuleFileNameEx(Result, ModuleHandle, ProcessName, SizeOf(ProcessName));
         ListBox1.Items.Add(string(ProcessName)+ " : " + IntToStr(Processes[I]) + "-- user: --->" + LookupProcessOwner(Processes[I]));

       end;
       CloseHandle(Result);
     end;
   end;
 Result := 0;
end;


 
Игорь Шевченко ©   (2005-05-31 12:40) [6]


> Но у меня почемуто не работает постоянно *** возвращает


попробуй на одном процессе, например, на своем, чей ID получи вызовом GetCurrentProcessId


 
Digitman ©   (2005-05-31 12:42) [7]


> Игорь Шевченко ©   (31.05.05 12:40) [6]


"Я бы взял по частям, но мне нужно все сразу" (с) О.Бендер

)


 
chili   (2005-05-31 12:43) [8]

На одном работает , но мне нужно именно в цикле :(


 
Игорь Шевченко ©   (2005-05-31 12:49) [9]

chili   (31.05.05 12:43) [8]


> На одном работает , но мне нужно именно в цикле


Тогда отладчик в руки и ищи ошибку.


 
chili   (2005-05-31 12:56) [10]

Все разобрался надо делать так тогда все ok :)

function GetSidUser(Sid : PSID): string;
var
//Sid : PSID;
lpName,lpDomain : PWideChar;
cbName,cbDomain : Cardinal;
peUse : Cardinal;
name : string;

begin
cbName:=64;
cbDomain:=64;

GetMem(lpName,cbName*SizeOf(WideChar));
GetMem(lpDomain,cbDomain*SizeOf(WideChar));

if not LookupAccountSidW(nil,Sid,lpName,cbName,lpDomain,cbDomain,peUse)
   and (GetLastError=122) then begin

  ReAllocMem(lpName,cbName*SizeOf(WideChar));
  ReAllocMem(lpDomain,cbDomain*SizeOf(WideChar));

  if not LookupAccountSidW(nil,Sid,lpName,cbName,lpDomain,cbDomain,peUse)
   then MessageBoxW(0,PWideChar(SysErrorMessage(GetLastError)),"Error",MB_OK);
 end;

name := lpName;

FreeMem(lpName);
Freemem(lpDomain);
Result := name;

end;


 
Игорь Шевченко ©   (2005-05-31 13:17) [11]

chili   (31.05.05 12:56) [10]

Виноват. Старый вариант выложил.
В моей функции перед if not LookupAccountSid нужно вставить
 DomainNameLength := SizeOf(DomainName);
 NameLength := SizeOf(Name);



Страницы: 1 вся ветка

Текущий архив: 2005.07.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.046 c
4-1117195035
Фёдор
2005-05-27 15:57
2005.07.25
Какие различия при конфигурировании COM порта в XP и 98 ?


6-1111342234
Matrex
2005-03-20 21:10
2005.07.25
как вызвать стандартное окно "Соединение с..."


1-1120817326
1+random(9999)
2005-07-08 14:08
2005.07.25
TCP / IP


1-1120828756
onics
2005-07-08 17:19
2005.07.25
Параметры ф-ции Excel.ActiveWorkbook.SaveAs


14-1120307477
lookin
2005-07-02 16:31
2005.07.25
Попробовать NHL2005 по интернет...