Irgendwie reden wir aneinander vorbei. Ich mache es mal anhand von etwas Code - hier von einem Testprogramm - klar:
Delphi-Quellcode:
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private-Deklarationen }
function RunAs(const verb: string): Boolean;
public
{ Public-Deklarationen }
end;
const
SEE_MASK_NOASYNC = $00000100;
SEE_MASK_WAITFORINPUTIDLE = $02000000;
var
Form1: TForm1;
hnd: THandle;
implementation
function TForm1.RunAs(const verb: string): Boolean;
var sei: TShellExecuteInfo;
begin
ShowMessage(verb);
FillChar(sei, SizeOf(sei), 0);
sei.cbSize:= SizeOf(sei);
sei.Wnd:= 0;
sei.fMask:= SEE_MASK_NOASYNC OR
SEE_MASK_WAITFORINPUTIDLE (*OR
SEE_MASK_FLAG_NO_UI*) OR
SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb:= PChar(verb);
sei.lpFile:= PChar(Application.ExeName);
sei.lpParameters:= PChar('runas');
sei.nShow:= SW_SHOWNORMAL;
Result:= ShellExecuteEx(@sei);
hnd:= sei.hProcess;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if RunAs('runas') then ShowMessage('OK');
ShowMessage(IntToStr(hnd));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if RunAs('runasuser') then ShowMessage('OK');
ShowMessage(IntToStr(hnd));
end;
Beim Klick auf Button1 bekomme ich die Meldung 'runas', gefolgt vom
UAC-Dialog seitens Windows und nach Ende desselben dann die Meldung 'OK' (oder bei Abbruch der
UAC eben gar keine) und zum Schluss das ermittelte
Handle.
Beim Klick auf Button2 bekomme ich die Meldung 'runasuser', und danach kommen
parallel die Dialoge "Ausführen als" (Windows) und 'OK' (von meinem Programm) und zum Schluss wieder das
Handle. Es wird hier also noch gar kein Prozess gestartet, mit dem ich in irgendeiner Weise kommunizieren könnte - was davon abgesehen auch gar nicht geht, weil die "echte" Anwendung auf eine Instanz beschränkt ist via
Mutex.
Das ermittelte
Handle ist übrigens 0, wenn ich bei 'runas' die
UAC abbreche und bei 'runasuser' ist es
in jedem Fall 0. Ich kann also gar nicht auf ein
Handle warten bei 'runasuser', weil die Funktion ShellExecuteEx gar keins zurückgibt.
MfG Dalai