![]() |
RunAs unter Win7 (ohne UAC)
Liste der Anhänge anzeigen (Anzahl: 1)
Hey,
ich benutze in einem meiner Programme die Funktion ShellExecuteEx mit dem Verb runas, um den Dialog "Ausführen als" zu öffnen. Das funktioniert unter Win2k und XP einwandfrei. Unter Win7 wird dieser offensichtlich an die UAC weitergegeben. Das kann ich natürlich nicht gebrauchen, denn der Nutzer soll in der Lage sein, den Nutzer selbst zu wählen. Außerdem kommt hinzu, dass der Aufruf ins Leere läuft, wenn die UAC abgeschaltet ist. Kurz: Ich suche eine Möglichkeit, den gewohnten "Ausführen als"-Dialog auch unter Win7 zu zeigen. Ich weiß, dass es ihn noch* gibt (siehe Bild), aber es war mir bisher nicht möglich, herauszufinden, welche API-Funktion dafür zuständig ist. Alle Suchergebnisse drehen sich nur um UAC und "elevated execution" und so Kram. Kann mich jemand erhellen? MfG Dalai * oder evtl. auch wieder, denn irgendwo habe ich gelesen, dass Vista die Möglichkeit "Ausführen als" komplett fehlt. |
AW: RunAs unter Win7 (ohne UAC)
Wie wäre es mit runasuser als Verb? :zwinker:
(Wusste ich auch nicht, habs grad kurz ausprobiert und ging. :mrgreen:) |
AW: RunAs unter Win7 (ohne UAC)
Ich hab mal vor einiger Zeit darüber in About.com Delphi gelesen. Habe mal kurz deren Suche bemüht, vielleicht hilft es:
![]() |
AW: RunAs unter Win7 (ohne UAC)
Zitat:
![]() Zitat:
Zitat:
![]() MfG Dalai |
AW: RunAs unter Win7 (ohne UAC)
Es gibt nicht nur ShellExecute/ShellExecuteEx oder das uralte WinExec ( :lol: ), sondern auch noch CreateProcess.
Zu Letzerem würde ich mal empfehlen ganz genau im MSDN nachzulesen und vorallem auch den Links zu folgen. |
AW: RunAs unter Win7 (ohne UAC)
Die Existenz der Funktion CreateProcessWithLogonW ist mir bekannt. Ich schrieb aber nicht ohne Grund, dass ich mir die Arbeit sparen will, den Nutzer selbst nach einem alternativen Logon zu fragen. Denn wozu das Rad mehrfach erfinden, wenn es die Funktionalität eh schon gibt? Von dem deutlichen Mehraufwand der Ermittlung eines Tokens (bei CreateProcessAsUser) usw. usf. mal abgesehen.
Falls du auf andere Funktionen anspielst, wäre ich dir dankbar, wenn du etwas konkreter wärst. MfG Dalai |
AW: RunAs unter Win7 (ohne UAC)
Zitat:
Du könntest aber als Umgehung deine eigene Anwendung mit diesen Privilegien und einem passenden Parameter starten. Wenn die Anwendung beim Start diesen Parameter findet, startet sie das eigentliche Programm, wartet und sagt dir bei Beendigung Bescheid (Windows Message, Pipe, ...). |
AW: RunAs unter Win7 (ohne UAC)
Zitat:
Zitat:
Ich werd mir das nachher mal in einer anderen Programmiersprache anschauen, um auszuschließen, dass es am Delphi 5 liegt. MfG Dalai |
AW: RunAs unter Win7 (ohne UAC)
Und warum wartest du dann über das Handle anstatt schlicht via IPC der ersten Instanz Bescheid zu sagen?
|
AW: RunAs unter Win7 (ohne UAC)
Irgendwie reden wir aneinander vorbei. Ich mache es mal anhand von etwas Code - hier von einem Testprogramm - klar:
Delphi-Quellcode:
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.
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 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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 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