AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Priorität und Pfad von Diensten ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Priorität und Pfad von Diensten ermitteln

Ein Thema von Codewalker · begonnen am 13. Aug 2006 · letzter Beitrag vom 15. Aug 2006
Antwort Antwort
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#1

Priorität und Pfad von Diensten ermitteln

  Alt 13. Aug 2006, 18:48
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.

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... ). Bin für jeden Tipp dankbar ...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Priorität und Pfad von Diensten ermitteln

  Alt 13. Aug 2006, 21:54
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Priorität und Pfad von Diensten ermitteln

  Alt 14. Aug 2006, 12:58
hmm. Die Dienste haben alle als Benutzer das Systemkonto. Gibt es denn eine Möglichkeit, den Wert trotzdem zu ermitteln?
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#4

Re: Priorität und Pfad von Diensten ermitteln

  Alt 14. Aug 2006, 13:59
Zitat von Codewalker:
Die Dienste haben alle als Benutzer das Systemkonto.
Tun sie eben nicht! Siehe dein anderer Thread.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Priorität und Pfad von Diensten ermitteln

  Alt 14. Aug 2006, 14:15
Zitat von Olli:
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...

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 ) und da brauchte ich halt PROCESS_SET_INFORMATION.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#6

Re: Priorität und Pfad von Diensten ermitteln

  Alt 14. Aug 2006, 17:16
Zitat von Codewalker:
[...] und da brauchte ich halt PROCESS_SET_INFORMATION.
Funzt es denn nun mit derm QUERY-Flag?
  Mit Zitat antworten Zitat
Metal_Snake2

Registriert seit: 19. Nov 2004
134 Beiträge
 
Delphi 7 Personal
 
#7

Re: Priorität und Pfad von Diensten ermitteln

  Alt 15. Aug 2006, 00:43
Zitat von Luckie:
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'
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Priorität und Pfad von Diensten ermitteln

  Alt 15. Aug 2006, 06:43
Zitat von Olli:
Funzt es denn nun mit derm QUERY-Flag?
Funktioniert!


Zitat von Metal_Snake2:
Aktiviere einfach folgende Privilegien:

'SeDebugPrivilege'
'SeSecurityPrivilege'
Ich werds heute abend versuchen (vorher schaff ich leider nicht)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 Uhr.
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