![]() |
runas
Hallihallo,
wie man einen Prozeß unter einem anderen Account startet, wurde hier ja schon oft genug durchgekaut. Mich interessiert jetzt, ob es eine Funktion gibt (möglichst WIN32-API), mit welcher der aufgerufene Prozeß ermitteln kann, wer ihn aufgerufen hat. Also in etwa so: UserA ruft ProzeßB mittels CreateProcessWithLogonW(...) auf. ProzeßB läßt Funktion WhoHasCalledMe:String laufen, welche 'UserA' ausspuckt. Hat jemand eine Idee? Vielen Dank für die Hilfe |
Re: runas
Mit:
Delphi-Quellcode:
Bekommt man den Besitzer eines Prozesses.
function TProcess.InitOwnerName: WideString;
var hProcess : THandle; ppsidOwner : PSID; SecDescriptor : PSECURITY_DESCRIPTOR; err : DWord; s : string; SIDType : DWORD; Owner : WideString; const SE_UNKNOWN_OBJECT_TYPE: DWord = 0; SE_FILE_OBJECT : DWord = 1; SE_SERVICE : DWord = 2; SE_PRINTER : DWord = 3; SE_REGISTRY_KEY : DWord = 4; SE_LMSHARE : DWord = 5; SE_KERNEL_OBJECT : DWord = 6; SE_WINDOW_OBJECT : DWord = 7; begin Owner := ''; hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or GENERIC_READ, False, FProcID); if (hProcess <> 0) then begin err := GetSecurityInfo(hProcess, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, @ppsidOwner, nil, nil, nil, @SecDescriptor); if (err = 0) then begin s := SidToString(ppsidOwner); FOwnerStrSID := s; FPOwnerSID := ppsidOwner; StrSIDToName(s, Owner, SIDType); LocalFree(Cardinal(SecDescriptor)); end; CloseHandle(hProcess); end; Result := Owner; end; Um an den übergeordneten Prozess zu kommen wirst du ihn wohl aus einer Prozessliste raussuchen müssen. |
Re: runas
Hmmmmmh ...
ProzeßA von UserA ruft ProzeßB von UserB mittels CreateProcessWithLogonW(...) auf. Die Frage ist, ob ProzeßA jetzt tatsächlich noch Elternprozeß von ProzeßB ist, also ob ein Prozeß eines Benutzers für den Prozeß eines anderen Users der Elternprozeß sein kann. Ich weiß ja nicht, was CreateProcessWithLogonW im Hintergrund so alles anstellt. |
Re: runas
Guck doch mal nach:
![]() Und so gibt es die ParentID: ![]() |
Re: runas
Ich habe es befürchtet. Ein Miniprogramm der Form:
program testparentid; ... begin writeln(GetCurrentProcessId,' ',GetExecutablefromPID(GetCurrentProcessId)); GetParentID(GetCurrentProcessId, ParentID); writeln(ParentId,' ',GetExecutablefromPID(ParentId)); readln; end. aufgerufen von der Kommandozeile: runas /user:testuser testparentid bringt folgendes Ergebnis: 1272 U:\projects\Test\parentID\testparentid.exe 1168 Eigentlich hatte ich hinter der 1168 c:\windows\system32\cmd.exe erwartet. Da steht aber nichts. Einmal im Taskmanager nachgesehen. Da steht für die PID 1168 svchost.exe, ausgeführt vom System. Böse Falle! Hat jemand eine Idee, wie ich an die PID von cmd.exe komme? Also die PID, die den "Ausführen als ..."-Dienst aufruft? |
Re: runas
Wenn der Dienst dein Programm aufruft isses eigentlich schon vorbei.
runas sendet auch nur per Pipe oder so, dem Dienst die Info, was er aufzurufen hat. Zwischen cmd.exe <--> Dienst besteht ja keine Parent-Beziehung. Daher wirst du da keine Chance haben meiner Meinung nach. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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