Форум: "WinAPI";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
ВнизКто запустил процесс? Найти похожие ветки
← →
Чапаев © (2006-03-13 15:09) [0]Как узнать имя пользователя, запустившего тот или иной процесс? На входе PID, на выходе имя пользователя...
← →
Eraser © (2006-03-13 15:29) [1]
> Чапаев © (13.03.06 15:09)
возможно как-то так
OpenProcessToken, GetTokenInformation(...TokenUser..), GetTrusteeName.
← →
BiN © (2006-03-13 15:31) [2]
(* GetSidInfo получает имя, домен и тип доверенного объекта с опред. Sid-ом
Для получения информации с локального компьютера установить lpSystemName в nil*)
function GetSidInfo(lpSystemName: PChar; Sid: PSID;
var Name, Domain: string; var Use: SID_NAME_USE):Boolean;
var
cbNameLen: DWORD;
cbDomainLen: DWORD;
begin
Result:=IsValidSid(Sid);
if not Result then
begin
SetLastError(ERROR_INVALID_SID);
Exit;
end;
cbNameLen := UNLEN + 1;
cbDomainLen := DNLEN + 1;
SetLength (Name, cbNameLen);
SetLength (Domain, cbDomainLen);
Result:=LookupAccountSid (lpSystemName, Sid, PChar (Name), cbNameLen, PChar (Domain), cbDomainLen, Use);
if not Result
then Exit;
Name := PChar (Name);
Domain := PChar (Domain);
end;
function GetProcessTokenSid(ProcessId:DWORD; Var Sid: PSID): Boolean; // освобождается через Realloc(Sid, 0);
var
hProcess:DWORD;
hToken:DWORD;
pTokenUserSID:PSIDAndAttributes;
dwRetLen:DWORD;
begin
Result:=False;
Sid:=nil;
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);
if hProcess=0 then Exit;
if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
begin
if not GetTokenInformation(hToken, TokenUser, nil, 0, dwRetLen) and
(GetLastError=ERROR_INSUFFICIENT_BUFFER) then
try
GetMem(pTokenUserSID, dwRetLen);
Result:=GetTokenInformation(hToken, TokenUser, pTokenUserSID, dwRetLen, dwRetLen);
if Result then
begin
dwRetLen:=GetLengthSid(pTokenUserSID^.Sid);
ReallocMem(Sid, dwRetLen);
Result:=CopySid(dwRetLen, Sid, pTokenUserSID^.Sid);
end;
finally
FreeMem(pTokenUserSID);
if not Result then ReallocMem(Sid, 0);
end;
CloseHandle(hToken);
end;
CloseHandle(hProcess);
end;
function GetProcessUserInformation(ProcessId:DWORD;
var UserName,
Domain: String;
var SidNameUse:SID_NAME_USE):Boolean;
var
TokenSid: PSID;
begin
Result:=false;
if not GetProcessTokenSid(ProcessId, TokenSid) then Exit;
try
Result:=GetSidInfo(nil, TokenSid, UserName, Domain, SidNameUse);
finally
ReallocMem(TokenSid, 0);
end;
end;
← →
Чапаев © (2006-03-13 15:40) [3]Благодарю, большей частью работает, хотя и выдаёт пустые строки для процессов, владельцем которых taskmgr считает LOCAL SYSTEM или NETWORK SYSTEM. Но для меня и такой вариант хорош. :-)
← →
BiN © (2006-03-13 16:25) [4]
> Чапаев © (13.03.06 15:40) [3]
>
> Благодарю, большей частью работает, хотя и выдаёт пустые
> строки для процессов, владельцем которых taskmgr считает
> LOCAL SYSTEM или NETWORK SYSTEM. Но для меня и такой вариант
> хорош. :-)
По-видимому, "пустые строки" выдает для тех процессов, которые не может открыть с флагом PROCESS_QUERY_INFORMATION.
Проблему можно решить при наличии (или включении) соответствующих привилегий.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.039 c