Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#10

AW: RunAs unter Win7 (ohne UAC)

  Alt 16. Mär 2012, 13:32
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
  Mit Zitat antworten Zitat