Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Prozesspfad herausfinden (https://www.delphipraxis.net/96626-prozesspfad-herausfinden.html)

Palad 27. Jul 2007 19:29


Prozesspfad herausfinden
 
Hallo liebe DPler,

ich habe eine Frage wegen einer meiner Programme, die ihr mir hoffentlich beantworten könnt. Vorneweg, ich bin mit der Windows-API ziemlich ungeschickt, oder treffender: Ich habe keine Ahnung davon. Nun zum Problem.

Ich würde gerne eine Art Protokollprogramm erstellen, das alle, beipspielsweise, 5 Minuten die laufenden Prozesse ermittelt, die entsprechende Liste filtert (bekannt/unbekannt) und am Ende alles schön säuberlich in eine .log-Datei wirft. Soweit kein Problem, aber ich möchte für die nicht bekannten Prozesse noch Programmpfad herausfinden, damit der Anwender bessere Chancen hat herauszufinden, um welches Programm es gerade geht. Das geht ja oft aus dem Prozessnamen nicht hervor.

Um die laufenden Prozesse zu ermitteln habe ich mich folgender Prozedur bedient, wobei ich zugeben muss, dass ich diese von Delphi-Source habe, da ich damit nicht so wirklich zurande kommen würde:

Delphi-Quellcode:
procedure TFrmAnsicht.GetProcessList(const aProcessList: TStrings);
var Snap: THandle;
    ProcessE: TProcessEntry32;
begin
  aProcessList.Clear;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  try
    ProcessE.dwSize := SizeOf(ProcessE);
    if Process32First(Snap, ProcessE) then
      Repeat aProcessList.Add(ProcessE.szExeFile);
      Until not Process32Next(Snap, ProcessE)
    else RaiseLastOSError;
  finally
    CloseHandle(Snap);
  end;
end;
Ich bedanke mich schonmal für eure Hilfe, Palad



PS: Ich bei Delphi-Source auch schon die Frage gepostet forum.dsdt.info/viewtopic.php?t=33998

brechi 27. Jul 2007 19:57

Re: Prozesspfad herausfinden
 
Delphi-Quellcode:

modh := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessE.ProcessID);
if (modh <> 0) then
begin
  if Modul32First(modh, ModuleE) then
    //ModuleE.szExeName ist die Exe mit Pfad)
  CloseHandle(modh);
end;
wobei modh ein THandle ist und ModuleE en TModuleEntry32

die funktion einfach nach an den beginn der repeat schleife packen (hoffe da ist kein fehler drin, habs ausm kopf geschrieben)

Palad 27. Jul 2007 20:25

Re: Prozesspfad herausfinden
 
Es klappt (fast) mit deinem Code! Bis auf 2 Dinge die ich verändern musste, zum einen scheint es bei modh:=Create...(..., ProcessE.th32ProcessID) heißen zu müssen [habe einfach die entsprechende Unit durchgesehen] und ModuleE.szExePath, aber du hast mir riesig geholfen! Dankesehr, ich weiß das wirklich zu schätzen!

Delphi-Quellcode:
procedure TFrmAnsicht.GetProcessList(const aProcessList: TStrings);
var Snap: THandle;
    ProcessE: TProcessEntry32;
    modh: THandle;
    ModuleE: TModuleEntry32;
begin
  aProcessList.Clear;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  try
    ProcessE.dwSize := SizeOf(ProcessE);
    if Process32First(Snap, ProcessE) then
      Repeat
      begin
// hier beginnen die Änderungen
        modh:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessE.th32ProcessID);
        if (modh <> 0) then
        begin
           if Module32First(modh, ModuleE) then Memo1.Lines.Add(ModuleE.szExePath);
           CloseHandle(modh);
          end;
// Änderungen Ende.
        aProcessList.Add(ProcessE.szExeFile);
      end;
      Until not Process32Next(Snap, ProcessE)
    else RaiseLastOSError;
  finally
    CloseHandle(Snap);
  end;
end;

Viele Grüße, Palad :bounce1:

Schwedenbitter 8. Aug 2009 10:55

Re: Prozesspfad herausfinden
 
Der Code ist echt super!
Zwei Kleinigkeiten musste ich aber noch ändern. Zum einen war mind. ein begin end; zuviel. Zum anderen wird einmal ein Add nicht zu aProcessList, sondern zu Memo.Lines gemacht.

Den alten Thread greife ich wieder auf, weil ich trotzdem noch zwei Fragen habe:
  • Warum sehe ich nicht soviel Prozesse, wie mir im Taskmanager angezeigt werden?
  • Warum ist mein Programm selbst immer doppelt drin?

Gruß und Dank, Alex

Luckie 8. Aug 2009 10:57

Re: Prozesspfad herausfinden
 
Welche Prozesse fehlen denn? Eventuell fehlen dir für bestimmte Prozesse die nötigen Rechte.

Schwedenbitter 8. Aug 2009 21:01

Re: Prozesspfad herausfinden
 
Danke für die Antwort!

Zitat:

Zitat von Luckie
Welche Prozesse fehlen denn?

Es fehlen z.B.:
  • alg.exe <- Antivir
  • avgnt.exe <- Antivir
  • avguard.exe <- Antivir
  • BRSS01A.EXE <- Druckertreiber
  • BRSVC01A.EXE <- Druckertreiber
  • csrss.exe <- keine Ahnung
  • ctfmon.exe <- ZoneAlarm
  • zlclient.exe <- ZoneAlarm
u.s.w.

Der Taskmanager zeigt mir 38 Prozesse mit exe-Dateien an. Mit der Procedur bekomme ich nur 8 angezeigt. Davon ist mein Programm selbst - warum auch immer - doppelt.

Zitat:

Zitat von Luckie
Eventuell fehlen dir für bestimmte Prozesse die nötigen Rechte.

Wohl kaum. Ich mache das, was man eigentlich nicht machen sollte. Ich bin immer als Admin angemeldet!

Andere Ideen?

Luckie 8. Aug 2009 21:58

Re: Prozesspfad herausfinden
 
Das sind alles Systemprozesse.

Und auch als Administrator ist man nicht allmächtig. ;)

PS: ctfmon.exe gehört zu Office und dient der Spracherkennung von texten oder so.

Guido Eisenbeis 15. Aug 2009 07:16

Re: Prozesspfad herausfinden
 
Hab den Code von Palad mal ein wenig "bereinigt" und übersichtlicher gestaltet:

Delphi-Quellcode:
uses
  Tlhelp32;

procedure GetProcessList(const aProcessList: TStrings);
var
  Snap: THandle;
  ProcessE: TProcessEntry32;
  modh: THandle;
  ModuleE: TModuleEntry32;
begin
  aProcessList.Clear;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (Snap <> INVALID_HANDLE_VALUE) then
  begin
    try
      ProcessE.dwSize := SizeOf(ProcessE);
      if Process32First(Snap, ProcessE) then
        Repeat
          aProcessList.Add(ProcessE.szExeFile);

          modh := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessE.th32ProcessID);
          if (modh <> INVALID_HANDLE_VALUE) then
          begin
            try
              ModuleE.dwSize := SizeOf(ModuleE);
              if Module32First(modh, ModuleE) then
//                repeat // <- wer's gerne noch ausfuerlicher will
                  aProcessList.Add(ModuleE.szExePath)
//                until not Module32Next(modh, ModuleE)
              else
                RaiseLastOSError;
            finally
              CloseHandle(modh);
            end;
          end;
        Until not Process32Next(Snap, ProcessE)
      else
        RaiseLastOSError;
    finally
      CloseHandle(Snap);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetProcessList(Memo1.Lines);
end;
Guido.

mkinzler 15. Aug 2009 08:25

Re: Prozesspfad herausfinden
 
Zitat:

Wohl kaum. Ich mache das, was man eigentlich nicht machen sollte. Ich bin immer als Admin angemeldet!
Trotzdem laufen die Systemdienste in einem anderen Benutzerkontext. Wenn du den Haken bei "Prozesse anderer Benutzer" im Taskmanager nicht setzt, siehst du standardmässig auch nur die Prozesse in deinem Benutzerkontext.

aegidos 19. Aug 2009 13:27

Re: Prozesspfad herausfinden
 
Hy,
Was muss man in der uses Direktive denn ergänzen dass der Code läuft?
Bei mir wird:
TProcessEntry32 und CreateToolHelp32SnapShot unterringelt.

Da hab ich doch bestimmt was vergessen einzubinden?

Danke !!!!
Grüße
Andi


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz