![]() |
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! |
Re: Benutzernamen von Prozessen ermitteln
Zitat:
|
Re: Benutzernamen von Prozessen ermitteln
Zitat:
|
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) |
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. |
Re: Benutzernamen von Prozessen ermitteln
Zitat:
|
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 ![]() 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 ![]() |
Re: Benutzernamen von Prozessen ermitteln
Zitat:
Zitat:
|
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. |
Re: Benutzernamen von Prozessen ermitteln
Zitat:
Aber schon interessant. Würdest du dich dazu herablassen zu dieser Funktion und WinStationConnect die C- oder Delphi-Prototypen hier hinzuklimpern? :tongue: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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