Форум: "Система";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];
ВнизИмя пользователя на любого процесса Найти похожие ветки
← →
Ученик (2002-07-18 10:17) [0]Как определить имя пользователя для произвольного процесса в системе, то что показывается в Task Manager (колонка UserName) ?
← →
RV (2002-07-18 12:14) [1]NtQuerySystemInformation (ntdll.dll)
← →
Ученик (2002-07-18 12:19) [2]Это из NT DDK ? Если нет, то можно описание вызова ?
← →
RV (2002-07-18 12:37) [3]это не документированная фция виндов, продокументированная уже всеми кому не лень и где не лень.
некоторые анкновы в коде на самом деле не анкновы
typedef struct {
FILETIME ProcessorTime;
ULONG unk2, unk3;
FILETIME CreateTime;
ULONG unk6;
ULONG StartAddress;
ULONG ProcessID;
ULONG ThreadID;
ULONG CurrentPriority;
ULONG BasePriority;
ULONG ContextSwitchesPerSec;
ULONG ThreadState;
ULONG ThreadWaitReason;
ULONG unk15;
} SYSTEM_THREAD_INFORMATION;
typedef struct {
ULONG NextOffest; // следующий процесс
ULONG ThreadCount;
ULONG unk2, unk3, unk4, unk5, unk6, unk7;
FILETIME CreateTime;
FILETIME UserTime;
FILETIME KernelTime;
ULONG unk14;
WCHAR *pModuleName; /* unicode */
ULONG BasePriority;
ULONG ProcessID;
ULONG InheritedFromUniqueProcessID;
ULONG HandleCount;
ULONG unk20, unk21;
ULONG PeekVirtualSize;
ULONG VirtualSize;
ULONG PageFaultCountPerSec;
ULONG PeakWorkingSetSize;
ULONG WorkingSetSize;
ULONG PeekPagedPoolUsage;
ULONG PagedPoolUsage;
ULONG PeekNonPagedPoolUsage;
ULONG NonPagedPoolUsage;
ULONG unk31; /* PagefileUsage ? */
ULONG PeakPagefileUsage;
ULONG unk33; /* PrivateBytes ? */
SYSTEM_THREAD_INFORMATION ThreadInfos[1]; // потоки данного процесса
} SYSTEM_PROCESS_INFORMATION;
PThreadInfo = ^TThreadInfo;
TThreadInfo = record
ftCreationTime : TDateTime;
dwUnknown1 : DWORD;
dwStartAddress : DWORD;
dwOwningPID : DWORD;
dwThreadID : DWORD;
dwCurrentPriority : DWORD;
dwBasePriority : DWORD;
dwContextSwitches : DWORD;
dwThreadState : DWORD;
dwUnknown2 : DWORD;
dwUnknown3 : DWORD;
dwUnknown4 : DWORD;
dwUnknown5 : DWORD;
dwUnknown6 : DWORD;
dwUnknown7 : DWORD;
end;
PProcessInfo = ^TProcessInfo;
TProcessInfo = record
dwOffset : DWORD;
dwThreadCount : DWORD;
dwUnkown1 : array [1..6] of DWORD;
ftCreationTime : TDateTime;
dwUnkown2 : DWORD;
dwUnkown3 : DWORD;
dwUnkown4 : DWORD;
dwUnkown5 : DWORD;
dwUnkown6 : DWORD;
pszProcessName : PWideChar;
dwBasePriority : DWORD;
dwProcessID : DWORD;
dwParentProcessID : DWORD;
dwHandleCount : DWORD;
dwUnkown7 : DWORD;
dwUnkown8 : DWORD;
dwVirtualBytesPeak : DWORD;
dwVirtualBytes : DWORD;
dwPageFaults : DWORD;
dwWorkingSetPeak : DWORD;
dwWorkingSet : DWORD;
dwUnkown9 : DWORD;
dwPagedPool : DWORD;
dwUnkown10 : DWORD;
dwNonPagedPool : DWORD;
dwPageFileBytesPeak : DWORD;
dwPageFileBytes : DWORD;
dwPrivateBytes : DWORD;
dwUnkown11 : DWORD;
dwUnkown12 : DWORD;
dwUnkown13 : DWORD;
dwUnkown14 : DWORD;
ati : array [1..1] of TThreadInfo;
end;
TNtQSI = function(Nmb: integer; Ptr: Pointer; Size1, Size2: integer): DWORD; stdcall;
.................................
procedure TForm1.Button1Click(Sender: TObject);
var hLib : DWORD;
Ptr : Pointer;
Cur : DWORD;
begin
lb.Items.Clear;
hLib := LoadLibrary("NTDLL.DLL");
if hLib>0 then
begin
@NtQSI := GetProcAddress(hLib,"NtQuerySystemInformation");
NtQSI(5,@Buf,20480,0);
Cur := 1;
Ptr := Addr(Buf[Cur]);
PrcInfo := Ptr;
lb.Items.Add(PrcInfo.pszProcessName+" -----> PID : "+ IntToStr(PrcInfo.dwProcessID));
repeat
Cur := Cur + PrcInfo.dwOffset;
Ptr := Addr(Buf[Cur]);
PrcInfo := Ptr;
lb.Items.Add(PrcInfo.pszProcessName+" -----> PID : "+ IntToStr(PrcInfo.dwProcessID));
until PrcInfo.dwOffset=0;
end;
FreeLibrary(hLib);
end;
← →
Ученик (2002-07-18 12:53) [4]>RV
Это работает ? А имя пользователя где ?
← →
Ученик (2002-07-19 10:38) [5]Это вроде работает, если кому надо
function GetProcessUserName(ProcessID : THandle; DomainName : Boolean = False): string;
var
Token: THandle;
Process : THandle;
User: PSIDAndAttributes;
szName, szDomain: PChar;
dwSize, dwNameSize,
dwDomainSize, dwUse: DWORD;
begin
Result := "";
if ProcessID <= 8 then
Result := "SYSTEM"
else begin
Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID);
if Process <> 0 then try
if OpenProcessToken(Process, TOKEN_QUERY, Token) then try
User := nil; dwSize := 0;
if not GetTokenInformation(Token, TokenUser, User,
dwSize, dwSize) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin
GetMem(User, dwSize);
try
if GetTokenInformation(Token, TokenUser, User,
dwSize, dwSize) then begin
dwNameSize := 0;
dwDomainSize := 0;
if not LookupAccountSid(nil, User.Sid, nil, dwNameSize, nil, dwDomainSize, dwUse) and
(GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin
GetMem(szName, dwNameSize + 1);
GetMem(szDomain, dwDomainSize + 1);
try
if LookupAccountSid(nil, User.Sid, szName, dwNameSize, szDomain, dwDomainSize, dwUse) then
Result := IfThen(DomainName, StrPas(szDomain) + "\") + StrPas(szName)
finally
FreeMem(szName);
FreeMem(szDomain)
end
end
end
finally
FreeMem(User)
end
end
finally
CloseHandle(Token)
end
finally
CloseHandle(Process)
end
end
end;
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c