Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi runas (https://www.delphipraxis.net/104726-runas.html)

gpvg 10. Dez 2007 11:39


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

Luckie 10. Dez 2007 11:54

Re: runas
 
Mit:
Delphi-Quellcode:
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;
Bekommt man den Besitzer eines Prozesses.

Um an den übergeordneten Prozess zu kommen wirst du ihn wohl aus einer Prozessliste raussuchen müssen.

gpvg 10. Dez 2007 12:07

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.

Luckie 10. Dez 2007 12:35

Re: runas
 
Guck doch mal nach: MSDN-Library durchsuchenCreateProcessWithLogonW

Und so gibt es die ParentID: http://www.delphipraxis.net/internal...process32first

gpvg 16. Dez 2007 19:05

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?

Dezipaitor 16. Dez 2007 19:13

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 13: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