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 Benutzernamen von Prozessen ermitteln (https://www.delphipraxis.net/71133-benutzernamen-von-prozessen-ermitteln.html)

peanut 9. Jun 2006 12:14


Benutzernamen von Prozessen ermitteln
 
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. :wall: 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!

NicoDE 9. Jun 2006 12:38

Re: Benutzernamen von Prozessen ermitteln
 
Zitat:

Zitat von peanut
Außerdem klappt das insbesondere bei Systemprozessen nicht immer reibungslos?!

Ist das ein Problem bei (ii) oder (iii)?

peanut 9. Jun 2006 15:12

Re: Benutzernamen von Prozessen ermitteln
 
Zitat:

Zitat von NicoDE
Zitat:

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.

NicoDE 9. Jun 2006 16:38

Re: Benutzernamen von Prozessen ermitteln
 
Schon mit OpenProcess(PROCESS_QUERY_INFORMATION)/OpenProcessToken(TOKEN_QUERY)/QueryTokenInformation(TokenUser) probiert?
(eventuell vorher noch das Debug-Privileg für den eigenen Prozess aktivieren)

peanut 10. Jun 2006 15:17

Re: Benutzernamen von Prozessen ermitteln
 
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.

NicoDE 12. Jun 2006 08:31

Re: Benutzernamen von Prozessen ermitteln
 
Zitat:

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...

Olli 12. Jun 2006 11:48

Re: Benutzernamen von Prozessen ermitteln
 
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 ... :pale:

NicoDE 12. Jun 2006 12:00

Re: Benutzernamen von Prozessen ermitteln
 
Zitat:

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:

Zitat von Olli
CachedGetUserFromSid() aus UTILDLL.DLL?

Das ist nur eine optimierte Variante, die letztendlich LookupAccountSid verwendet und die Daten der letzten Aufrufe zwiswchenspeichert.

peanut 12. Jun 2006 12:05

Re: Benutzernamen von Prozessen ermitteln
 
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 :-D

Viele Grüße

peanut.

Olli 12. Jun 2006 12:30

Re: Benutzernamen von Prozessen ermitteln
 
Zitat:

Zitat von NicoDE
Zitat:

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 ... :mrgreen:
Aber schon interessant. Würdest du dich dazu herablassen zu dieser Funktion und WinStationConnect die C- oder Delphi-Prototypen hier hinzuklimpern? :tongue:

Zitat:

Zitat von NicoDE
Zitat:

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:13 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