Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
ВнизПодскажите как определить имя пользователя которому пренадлежит п Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c