AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Benutzernamen von Prozessen ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Benutzernamen von Prozessen ermitteln

Ein Thema von peanut · begonnen am 9. Jun 2006 · letzter Beitrag vom 15. Sep 2006
Antwort Antwort
Seite 1 von 2  1 2      
peanut
(Gast)

n/a Beiträge
 
#1

Benutzernamen von Prozessen ermitteln

  Alt 9. Jun 2006, 12:14
Hallo!

Ich möchte gerne alle Prozesse auf einem System auflisten und außerdem
anzeigen lassen, unter welchem Benutzer ein jeweiliger Prozess ausgeführt
wird. Mittels CreateToolhelp32Snapshot kommt man zwar sehr leicht an
alle laufenden Prozesse, jedoch nicht an die Benutzernamen.

Ich habe schon mal versucht folgendermaßen vorzugehen:

i) OpenProcess(...mit jeweiliger ProzessId)
ii) GetSecurityInfo(...SE_KERNEL_OBJECT...OWNER_SECURI TY_INFORMATION...)
iii) die in ii) erhaltene SID einem Benutzer zuordnen


Sieht umständlich aus - ist es auch. Außerdem klappt das insbesondere
bei Systemprozessen nicht immer reibungslos?!

Weiß jemand, wie man elegant an den Namen des Benutzers kommt, der einen
Prozess ausführt?

Besten Dank im Voraus!
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#2

Re: Benutzernamen von Prozessen ermitteln

  Alt 9. Jun 2006, 12:38
Zitat von peanut:
Außerdem klappt das insbesondere bei Systemprozessen nicht immer reibungslos?!
Ist das ein Problem bei (ii) oder (iii)?
  Mit Zitat antworten Zitat
peanut
(Gast)

n/a Beiträge
 
#3

Re: Benutzernamen von Prozessen ermitteln

  Alt 9. Jun 2006, 15:12
Zitat von NicoDE:
Zitat von peanut:
Außerdem klappt das insbesondere bei Systemprozessen nicht immer reibungslos?!
Ist das ein Problem bei (ii) oder (iii)?
Bei (ii) gibt es hier schon Probleme - erhalte keine SID.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#4

Re: Benutzernamen von Prozessen ermitteln

  Alt 9. Jun 2006, 16:38
Schon mit OpenProcess(PROCESS_QUERY_INFORMATION)/OpenProcessToken(TOKEN_QUERY)/QueryTokenInformation(TokenUser) probiert?
(eventuell vorher noch das Debug-Privileg für den eigenen Prozess aktivieren)
  Mit Zitat antworten Zitat
peanut
(Gast)

n/a Beiträge
 
#5

Re: Benutzernamen von Prozessen ermitteln

  Alt 10. Jun 2006, 15:17
Habe SeDebugPrivilege und Prozess-Token wurde mit
PROCESS_QUERY_INFORMATION geöffnet. Klappt einwandfrei bei
Prozessen von normalen Benutzern, nicht aber bei Netzwerk-
und Systemdiensten.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#6

Re: Benutzernamen von Prozessen ermitteln

  Alt 12. Jun 2006, 08:31
Zitat von peanut:
Habe SeDebugPrivilege und Prozess-Token wurde mit
PROCESS_QUERY_INFORMATION geöffnet. Klappt einwandfrei bei
Prozessen von normalen Benutzern, nicht aber bei Netzwerk-
und Systemdiensten.
Eine alternative kann ich dir leider nicht anbieten. Der TaskManager von Microsoft verwendet(e) offensichtlich eine undokumentierte API dazu...
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#7

Re: Benutzernamen von Prozessen ermitteln

  Alt 12. Jun 2006, 11:48
Aus diesem Grund zeigt der TaskMgr nur den Benutzernamen an, wenn er auf einem Terminalserver-System läuft. Ansonsten bleibt diese Option deaktiviert!!!

Also, keine Chance, es sei denn du ermittelst dir irgendwie die Prototypen der beiden Verdächtigen, einer Funktion WinStationGetProcessSid() aus WINSTA.DLL und einer CachedGetUserFromSid() aus UTILDLL.DLL?! Ich schau's mir nachher nochmal an, die aus WINSTA.DLL brauchst du jedenfalls definitiv, die andere offensichtlich nur wenn du einfach an den Benutzernamen kommen willst.

Die letzten beiden Parameter bei Bei Google suchenWinStationGetProcessSid sind IMO der SID (als PSID) und die Größe des SID in Bytes (als DWORD oder so). Die anderen Parameter konnte ich nicht entziffern. Ist wie schon von Nico erwähnt alles undokumentiert. Selbst bei ReactOS (sinst eine gute Quelle bei undokumentierten Funktionen) scheint man noch drüber zu grübeln ...
Sicher ist, daß TaskMgr diese Funktion auf einem TS aufruft. Unter W2K ist die Funktion per GetProcAddress eingebunden, bei WXP über Delay Loading ...

In meinem Disassemblat sehe ich sogar, daß offensichtlich vom Task-Manager auf TS eine Funktion WinStationTerminateProcess() benutzt wird um Prozesse zu beenden. Wo der Sinn ist, bleibt mir noch rätselhaft. Vielleicht ist das nur Terminal-Session-übergreifend nötig oder so?!? Jedenfalls konnte ich in einem russischen Forum den Hinweis auf WinStationGetProcessSid() finden Kak uznat' imja jusera, wo aber der Fragesteller auch nur nach Hilfe fragt ...
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#8

Re: Benutzernamen von Prozessen ermitteln

  Alt 12. Jun 2006, 12:00
Zitat von Olli:
WinStationGetProcessSid() aus WINSTA.DLL
Zur eindeutigen Identifizierung des Zielprozesses benötigt man für diese Funktion außer der ProcessId auch noch die CreationTime (GetProcessTimes oder native API). Zudem muss man sich erstmal ein RPC-Handle besorgen (WinStationConnect).

Zitat von Olli:
CachedGetUserFromSid() aus UTILDLL.DLL?
Das ist nur eine optimierte Variante, die letztendlich LookupAccountSid verwendet und die Daten der letzten Aufrufe zwiswchenspeichert.
  Mit Zitat antworten Zitat
peanut
(Gast)

n/a Beiträge
 
#9

Re: Benutzernamen von Prozessen ermitteln

  Alt 12. Jun 2006, 12:05
Hallo!

Danke für die vielen Hinweise, ich werde mal versuchen damit so weit wie möglich zu
kommen. Wenn etwas einigermaßen brauchbares rausspringt, kommt der Quellcode hier
rein

Viele Grüße

peanut.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#10

Re: Benutzernamen von Prozessen ermitteln

  Alt 12. Jun 2006, 12:30
Zitat von NicoDE:
Zitat von Olli:
WinStationGetProcessSid() aus WINSTA.DLL
Zur eindeutigen Identifizierung des Zielprozesses benötigt man für diese Funktion außer der ProcessId auch noch die CreationTime (GetProcessTimes oder native API). Zudem muss man sich erstmal ein RPC-Handle besorgen (WinStationConnect).
Wer zuviel weiß, kommt in die Suppe. Demnächst gibt's Nico-Eintopf ...
Aber schon interessant. Würdest du dich dazu herablassen zu dieser Funktion und WinStationConnect die C- oder Delphi-Prototypen hier hinzuklimpern?

Zitat von NicoDE:
Zitat von Olli:
CachedGetUserFromSid() aus UTILDLL.DLL?
Das ist nur eine optimierte Variante, die letztendlich LookupAccountSid verwendet und die Daten der letzten Aufrufe zwiswchenspeichert.
Das dachte ich mir schon. Wenn die über Ordinals importiert worden wären, hätte es schon düsterer ausgesehen. Da kann man dann nicht mal einfach so vom Namen auf die Funktionalität schließen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:45 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