Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Priorität und Pfad von Diensten ermitteln (https://www.delphipraxis.net/75064-prioritaet-und-pfad-von-diensten-ermitteln.html)

Codewalker 13. Aug 2006 18:48


Priorität und Pfad von Diensten ermitteln
 
Hallo zusammen.

Wie kann ich die Priorität und den Pfad eines Dienstes ermitteln. Über GetPriorityClass kann ich das schon von Anwendungen, jedoch liefert OpenProcess als Handle immer 0 wenn es ein Dienst ist.
Delphi-Quellcode:
function GetProcPriority(PID: DWord): TProcPriority;
var
  hProcess: THandle;
  Priority: Cardinal;
begin
  hProcess := OpenProcess(PROCESS_SET_INFORMATION, False, PID);
  If hProcess = 0
   then begin
     Result:=ppService;
     Exit;
   end;
  Priority := GetPriorityClass(hProcess);
  case Priority of
    $00000040: Result := ppIdle;
    $00004000: Result := ppLow;
    $00000020: Result := ppNormal;
    $00008000: Result := ppHigher;
    $00000080: Result := ppHighest;
    $00000100: Result := ppRealtime;
    else
      Assert(False, 'Unknown Value for priority');
  end;
  CloseHandle(hProcess);
end;
Im Moment fange ich das einfach als Wert ppService ab. Da jedoch der Taskmanager und auch der TuneUp Process Manager (der ja auch in Delphi programmiert wurde) einen Wert ermitteln können, muss das ja gehen. :gruebel:

Das zweite ist, dass ich dann auch noch gerne den Pfad zur EXE/DLL - Datei des Services ermitteln möchte (am besten mit aufgerufenen Parametern). Bei Anwendungen funktioniert dieser Code ganz gut:
Delphi-Quellcode:
function GetExecutableFromPID(dwProcessID: DWord): String;
var
  FSnapshotHandle: THandle;
  FModuleEntry32: TModuleEntry32;
begin
  Result := '';
  begin
    FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
    FModuleEntry32.dwSize := Sizeof(FModuleEntry32);
    Module32First(FSnapshotHandle, FModuleEntry32);
    if FileExists(FModuleEntry32.szExePath) = True then
      Result := FModuleEntry32.szExePath
    else
      Result := '';
    CloseHandle(FSnapshotHandle);
  end;
end;
Bei Diensten erhalte ich aber nur Speichermüll, so dass ich das ganze mit FileExists abfangen muss. Wie kann ich das von Diensten ermitteln (Der TuneUp ProcessManager ermittelt sogar noch eine Beschreibung. Wie auch immer... :wink: ). Bin für jeden Tipp dankbar ...

Luckie 13. Aug 2006 21:54

Re: Priorität und Pfad von Diensten ermitteln
 
Zitat:

Zitat von Codewalker
jedoch liefert OpenProcess als Handle immer 0 wenn es ein Dienst ist.

Wird wohl daran liegen, dass ein Deienst unter einem anderem Konto läuft und du einen Prozess, der dir nicht gehört, auch nicht öffnen kannst/darfst.

Codewalker 14. Aug 2006 12:58

Re: Priorität und Pfad von Diensten ermitteln
 
hmm. Die Dienste haben alle als Benutzer das Systemkonto. Gibt es denn eine Möglichkeit, den Wert trotzdem zu ermitteln?

Olli 14. Aug 2006 13:59

Re: Priorität und Pfad von Diensten ermitteln
 
Zitat:

Zitat von Codewalker
Die Dienste haben alle als Benutzer das Systemkonto.

Tun sie eben nicht! Siehe dein anderer Thread.

Zitat:

Zitat von Codewalker
Gibt es denn eine Möglichkeit, den Wert trotzdem zu ermitteln?

Hmm, keine Ahnung warum du dort PROCESS_SET_INFORMATION angibst, wenn du mit PROCESS_QUERY_INFORMATION viel bessere Chancen hättest die Informationen auszulesen!

Zur Toolhelp-API äußere ich mich lieber nicht, weil die auf EPROCESS und damit auf einem 16-Byte langen ANSI-Namen basiert. Komplett hirnrissig, aber so ist's nunmal. Daher kann man den Pfad den man damit ermitteln kann auch genausogut in die Tonne kloppen ... angenommen ich nehme folgenden Namen auf einem deutschen System: "Тест.exe" - so wirst du "leider" keinen Erfolg haben diesen sinnvoll anzuzeigen, weil du natürlich nicht wissen kannst, welche Codepage du nehmen sollst um die ANSI-Zeichen in eine sinnvolle Darstellung zu bringen. Es könnte ja auch was Griechisches, Hebräisches oder Chinesisches sein ... oder so ...

Nachtrag: Kommando zurück. Die Modul-APIs sollten unter bestimmten Umständen funzen. Die Prozeß-APIs haben die besagten Probleme.

Codewalker 14. Aug 2006 14:15

Re: Priorität und Pfad von Diensten ermitteln
 
Zitat:

Zitat von Olli
Zitat:

Zitat von Codewalker
Die Dienste haben alle als Benutzer das Systemkonto.

Tun sie eben nicht! Siehe dein anderer Thread.

knapp zu spät, aber gelesen. Hab schon kapiert... :wall:

Zitat:

Zitat von Olli
Hmm, keine Ahnung warum du dort PROCESS_SET_INFORMATION angibst, wenn du mit PROCESS_QUERY_INFORMATION viel bessere Chancen hättest die Informationen auszulesen!

Das ist ein Copy&Paste Problem. Ich habe auch eine Funktion SetProcPriority, um die Priorität zu ändern. Die hab ich zuerst geschrieben (nicht fragen warum :gruebel: ) und da brauchte ich halt PROCESS_SET_INFORMATION.

Olli 14. Aug 2006 17:16

Re: Priorität und Pfad von Diensten ermitteln
 
Zitat:

Zitat von Codewalker
[...] und da brauchte ich halt PROCESS_SET_INFORMATION.

Funzt es denn nun mit derm QUERY-Flag?

Metal_Snake2 15. Aug 2006 00:43

Re: Priorität und Pfad von Diensten ermitteln
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von Codewalker
jedoch liefert OpenProcess als Handle immer 0 wenn es ein Dienst ist.

Wird wohl daran liegen, dass ein Deienst unter einem anderem Konto läuft und du einen Prozess, der dir nicht gehört, auch nicht öffnen kannst/darfst.

Aktiviere einfach folgende Privilegien:

'SeDebugPrivilege'
'SeSecurityPrivilege'

Codewalker 15. Aug 2006 06:43

Re: Priorität und Pfad von Diensten ermitteln
 
Zitat:

Zitat von Olli
Funzt es denn nun mit derm QUERY-Flag?

Funktioniert!


Zitat:

Zitat von Metal_Snake2
Aktiviere einfach folgende Privilegien:

'SeDebugPrivilege'
'SeSecurityPrivilege'

Ich werds heute abend versuchen (vorher schaff ich leider nicht)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr.

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