![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите как определить имя пользователя которому пренадлежит п [D7, WinXP]
chili © (2005-05-31 11:26:00)Добрый день.
Подскажите как определить имя пользователя которому пренадлежит процесс. По имени процесса.
Игорь Шевченко (2005-05-31 13:17:00) [1]chili (31.05.05 12:56) [10]
Виноват. Старый вариант выложил.
В моей функции перед if not LookupAccountSid нужно вставить
DomainNameLength := SizeOf(DomainName);
NameLength := SizeOf(Name);
chili (2005-05-31 12:56:00) [2]Все разобрался надо делать так тогда все 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 12:49:00) [3]chili (31.05.05 12:43) [8]
> На одном работает , но мне нужно именно в цикле
Тогда отладчик в руки и ищи ошибку.
chili (2005-05-31 12:43:00) [4]На одном работает , но мне нужно именно в цикле :(
Digitman (2005-05-31 12:42:00) [5]
> Игорь Шевченко © (31.05.05 12:40) [6]
"Я бы взял по частям, но мне нужно все сразу" (с) О.Бендер
)
Игорь Шевченко (2005-05-31 12:40:00) [6]
> Но у меня почемуто не работает постоянно *** возвращает
попробуй на одном процессе, например, на своем, чей ID получи вызовом GetCurrentProcessId
chili (2005-05-31 12:36:00) [7]> Игорь Шевченко ©
Но у меня почемуто не работает постоянно *** возвращает
делаю так :
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;
chili (2005-05-31 12:29:00) [8]упс извините за тупой вопрос, уже разобрался
chili (2005-05-31 12:24:00) [9]// Заполняем массив идентификаторов запущенных процессов
EnumProcesses(@Processes, SizeOf(Processes), cbNeeded)
но массив Processes имеет тип DWORD, как его преобразовать в integer?
chili (2005-05-31 12:20:00) [10]а как получить AProcessId?
Игорь Шевченко (2005-05-31 11:43:00) [11]
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;