Beispiel einer Delphi-Implementierung zum Abrufen einer Prozessliste und zugehöriger Informationen
Vorwort:
Es macht mir Spaß, mir die Informationen anzusehen und sie kurz umzusetzen. Es gibt keinen Code, der mir online gefällt Art zu schreiben, deshalb werde ich es hier nicht schreiben. Wir werden es in Zukunft weiter verbessern, aber die Informationen zu Systemprozess und System können noch nicht abgerufen werden. Wenn es jemand weiß, kann ich Sie daran erinnern.
Der Code lautet wie folgt
Unit Main; Schnittstelle verwendet Windows, Nachrichten, Grafiken, Steuerelemente, Formulare, TlHelp32, StdCtrls, ComCtrls, psAPI; _TOKEN_USER = record User: TSIDAndAttributes; end; TForm1= class(TForm) btn_Get: TButton; Lv_Process: procedure btn_GetClick(Sender: TObject); private { Private deklarationen } function GetMemUsedText(memsize:Cardinal):string; function GetProcessPriority(priority:Cardinal) :string; Funktion GetCupUsedPercent(hprocess:THandle):string; function GetProcessUser(hprocess:THandle):string; public { Öffentliche Deklarationen } end; var Form1: TForm1; programming Verwenden Sie Vista. Um Systeminformationen unter Win7 zu lesen, müssen Sie die Funktion als Administrator ausführen PromoteProcessPrivilege(Processhandle;Token_Name:pchar):boolean; var Token:cardinal; i:DWORD; begin Result:=false; beginnen //Sehen Sie sich den Privilegienwert der Systemberechtigungen an, wenn LookupPrivilegeValue(nil,Token_Name,Luid) dann TokenPri.PrivilegeCount:=1; TokenPri.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED; TokenPrivileges[0].Luid:= beginnt Luid; i:=0; //Rechte erhöhen, wenn AdjustTokenPrivileges(Token,false,sizeof(TokenPri),nil,i) then Result:=true; end; function AddFileTimes(KernelTime: TFileTime): var SysTimeK, SysTimeU : TSystemTime; begin FileTimeToSystemTime(KernelTime, SysTimeK); FileTimeToSystemTime(UserTime, SysTimeU); Ergebnis :=SystemTimeToDateTime(SysTimeU); //Get CPU time function GetProcCPUTime(procID:THandle): TDateTime; var CreationTime, KernelTime; begin GetProcessTimes (procID, CreationTime, ExitTime, KernelTime,UserTime); Result:= AddFileTimes(KernelTime, UserTime); Speicherinformationen pPMC:PPROCESS_MEMORY_COUNTERS; pPMCSize,ProcessPriority:Cardinal; fName:array [0..MAX_PATH-1] begin //Einen Prozess-Snapshot erstellen hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); pEntry.dwSize := SizeOf(pEntry) ; //Der erste Prozess find := Process32First(hSnapShot,pEntry); while find do begin item := Lv_Process.Items.Add; //Prozessname item.Caption := pEntry.szExeFile; //Prozess-ID item.SubItems.Add(IntToStr(pEntry.th32ProcessID)); pPMCSize := SizeOf(PROCESS_MEMORY_COUNTERS ); GetMem(pPMC,pPMCSize); pPMC.cb := pPMCSize; //Öffnen Sie den Prozess und erhöhen Sie die PROCESS_VM_READ-Berechtigung, damit hProcess später zum Abrufen des vollständigen Pfads verwendet werden kann:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,pEntry.th32ProcessID); //Speicherinformationen abrufen, wenn GetProcessMemoryInfo(hProcess,pPMC ,pPMCSize) dann beginnen //Den Benutzer des Prozesses abrufen item.SubItems.Add(GetProcessUser(hProcess)); //Speichernutzung item.SubItems.Add(GetMemUsedText(pPMC.WorkingSetSize)); //Speicherspitze item.SubItems.Add(GetMemUsedText( pPMC. PeakWorkingSetSize)); //CPU-Zeit item.SubItems.Add(FormatDateTime('hh:mm:ss',GetProcCPUTime(hProcess))); //Priorität abrufen ProcessPriority := GetPriorityClass(hProcess); item.SubItems.Add(GetProcessPriority(ProcessPriority) ) ; //Finden Sie das Modulhandle entsprechend dem Prozesshandle ENumProcessModules(hProcess,@hModel,SizeOf(hModel),n); //Erhalten Sie den vollständigen Pfad GetModuleFileNameEx(hProcess,hModel,fName,Length(fName)); Add(fName) ; end; FreeMem(pPMC); CloseHandle(hProcess); Process32Next(hSnapShot,pEntry); end; function TForm1.GetCupUsedPercent(hprocess: THandle): string; begin end; function TForm1.GetMemUsedText(memsize: Cardinal): string; begin K'; Ende; Funktion TForm1.GetProcessPriority(priority: Cardinal): string; begin case priorität von IDLE_PRIORITY_CLASS: Ergebnis := 'normal'; HIGH_PRIORITY_CLASS: Ergebnis := 'high'; REALTIME_PRIORITY_CLASS: Ergebnis := 'real- Zeit'; Ende; Ende; //Den Benutzer der Prozessfunktion abrufen TForm1.GetProcessUser(hprocess: THandle); //Berechtigungen öffnen, falls nicht OpenProcessToken(hprocess,TOKEN_QUERY,hToken) then Exit; //Token-Informationen abrufen, der dritte Parameter hier verwendet Null, was zuerst die tatsächliche Größe dwSize zurückgibt und dann Speicher entsprechend dieser Größe zuweist GetTokenInformation(hToken,TokenUser,nil,0 , dwSize); pUser := nil; //Speicherplatz zuweisen ReallocMem(pUser,dwSize); := 0; dwDomainSize := 0; //Informationen abrufen, wenn nicht GetTokenInformation(hToken,TokenUser,pUser,dwSize,dwSize) then Exit; //Um Benutzerinformationen zu finden, geben Sie zunächst den Benutzernamen und die Domänennamengröße zurück. Natürlich können Sie auch alles auf einmal abrufen, also ohne Verwendung des dynamischen Arrays LookupAccountSid(nil,pUser.User.Sid,nil,dwUserSize ,nil,dwDomainSize,peUse); if (dwUserSize <> 0) and (dwDomainSize <> 0) then begin //Länge zuweisen SetLength(szUserName,dwUserSize); SetLength(szDomainName,dwDomainSize); //Erneut den Benutzernamen und den Domänennamen abrufenLookupAccountSid(nil,pUser.User.Sid,PChar(szUserName),dwUserSize,PChar(szDomainName), dwDomainSize, peUse); Ergebnis := PChar(szUserName)+'/'+PChar(szDomainName); CloseHandle(pUser end; begin PromoteProcess,'SeDebugPrivilege');
Bild ausführen
Wenn Sie Fragen haben, hinterlassen Sie bitte eine Nachricht oder gehen Sie zur Community dieser Website, um zu kommunizieren und zu diskutieren. Ich hoffe, dass es allen helfen kann.