![]() |
Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdminis
Hallo zusammen,
nachdem ich nun mein Installationsprogramm und das Administrationsprogramm brav per UAC in den Administratormodus "elevated" habe, gibt es nun ein kleines neues Problem: Und zwar, wenn das Setup endet gibt es ja immer diese Checkbox "Programm xyz jetzt starten". Im Prinzip funktioniert das auch ganz gut (habe es jetzt per ShellExecute 'open' gemacht), aber das Problem ist, dass das Hauptprogramm nun im Kontext des Administrators gestartet wird. Gibt es irgendeine Möglichkeit das Hauptprogramm im Kontext des aktuell angemeldeten Benutzers zu starten? Das Setupprogramm wird auch für Updates aufgerufen (das Hauptprogramm lädt das Update herunter und übergibt es an das Setupprogramm, dieses installiert als Administrator dann das Update). Nun soll nach dem Update das Hauptprogramm natürlich sofort wieder gestartet werden. Also wie komme ich in den Benutzermodus bzw. in den Kontext des aktuell angemeldeten Benutzers zurück? Habe gestern bereits im Forum und der Code-Library geschmökert, bin aber leider über nichts passendes gestolpert. :? Exceeder |
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Du kannst doch einfach den aktuell angemeldeten Benutzer auslesen und den Prozess unter dessen Kontext starten, oder habe ich deine Frage nicht richtig verstanden?
Dust Signs |
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Ein (der offizielle) Weg führt über den Task Scheduler (Aufgabenplanung).
Ansonsten müsstest du dir das Token des Benutzerkontos holen, es in ein eingeschränktes Token konvertierten und dieses verwenden, um den Prozess zu starten. |
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Hat dein Hauptprogramm auch ein Vista-Kompatibles Manifest? Dort kann doch angegeben werden was das Programm benötigt (Admin, AsInvoker, ...). Und ein ShellExecute sollte diese Einstellungen berücksichtigen.
|
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
@Bernhard Geyer:
sein Programm (Setup) läuft schon als Admin, aber er möchte jetzt von diesem aus ein anderes Programm ohne diese zusätzlichen Rechte starten :zwinker: |
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
In Vista gibt es - falls die UAC aktiv ist - für jedes Admintoken ein verknüpftes eingeschränktes Token :
![]() |
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Zitat:
|
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Zitat:
|
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Zitat:
|
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Hi,
da ist man mal kurz weg und hat gleich soviele Antworten, wow. :) Also die EXE-Dateien welche ich starte haben natürlich alle ein gültiges Vista Manifest. Das Installationprogramm läuft als "asAdministrator" und das Hauptprogramm als "asInvoker". Das Problem ist nur, ist der Invoker Admin, dann läuft das Hauptprogramm auch als Admin. Die Rechte werden scheinbar sowohl bei ShellExecute als auch bei CreateProcess verrebt (zumindest solange man nichts dagegen unternimmt). Nur weiß ich leider nicht, was ich dagegen unternehmen muss, deshalb meine Frage hier. :) Bei CreateProcess scheint es zum Beispiel auch so zu sein, dass ein Programm welches im normalen Benutzerkontext arbeitet keinen Prozess erzeugen kann, welcher laut Manifest Administratorrechte benötigt. CreateProcess schlägt dann fehl (mit welcher Meldung genau weiß ich nicht mehr). Diesen Fall habe ich ja zum Beispiel, wenn das Hauptprogramm das Updatepaket herunterlädt und anschließend dann mit Setup.exe -update "MyZipPackage.zip" aufruft. Wenn man diesen Aufruf mit ShellExecute vornimmt erscheint korrekt die UAC und fragt den Benutzer, ob er das ganze zulässen möchte und fordert noch das Administratorpasswort an. Hat soetwas denn noch niemand gemacht? :( |
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Hallo nochmal,
also hier mal meine StartProcess Funktion und meine ShellExecute Funktion. Eventuell weiß ja jemand was man da verändern muss, damit man zum Ziel kommt.
Delphi-Quellcode:
function StartProcess(const Filename: string; WaitFor: Boolean;
ShowWindow: Boolean = False): Boolean; var StartInfo: TStartupInfo; ProcInfo: TProcessInformation; begin try FillChar(StartInfo, SizeOf(TStartupInfo), #0); FillChar(ProcInfo, SizeOf(TProcessInformation), #0); StartInfo.cb := SizeOf(TStartupInfo); StartInfo.dwFlags := STARTF_USESHOWWINDOW; StartInfo.wShowWindow := Abs(Integer(ShowWindow)); if CreateProcess(nil, PChar(Filename), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, PChar(ExtractFileDir(Filename)), StartInfo, ProcInfo) then begin if WaitFor then WaitForSingleObject(ProcInfo.hProcess, INFINITE); CloseHandle(ProcInfo.hProcess); CloseHandle(ProcInfo.hThread); Result := True; end else Result := False; except Result := False; end; end;
Delphi-Quellcode:
Exceeder
function MyShellExecute(const Filename: string; const Parameters: string = '';
const Operation: string = 'open'; const ShowCmd: Integer = SW_SHOWDEFAULT): Boolean; begin Result := ShellExecute(0, PChar(Operation), PChar(Filename), PChar(Parameters), PChar(ExtractFilePath(Filename)), ShowCmd) > 0; end; |
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Vielleicht hilft dir das CREATE_PRESERVE_CODE_AUTHZ_LEVEL-Flag (siehe
![]() ![]() Dust Signs |
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Zitat:
Daher sollte man nicht asAdmin ins Manifest schreiben, wenn das Prog auch mal als normaler User laufen soll. Man kann auch im Programm noch nachträglich einen neuen Prozess mit Adminrechten starten: ![]() ![]() Zitat:
Ein SD bringt hier nix. |
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Hallo again,
das Problem ist aber auch beim starten als Administrator ohne ein Vista Manifest mit asAdministrator, dass der Prozess dennoch neue Prozesse mit dem gleichen Benutzerlevel startet, wenn es dann doch mal als Administrator ausgeführt wird. Aber: Die Administrations/Installations und das Hauptprogramm sind ohnehin strickt getrennt. Es gibt also keinen Grund den Prozess nicht immer als Administrator auszuführen. Unter Windows XP verfolgt das Administrationsprogramm und auch das Installationsprogramm eine ähnliche Strategie (mit runas), um auch dort nur als Administrator ausgeführt zu werden. Der Link zur Funktion JwShellExecute auf der angegebenen Webseite ist übrigens Tot. Die Gesamte Jedi Lib für das Problem zu installieren, kommt aber zumindest für mich nicht in Frage. Keine Ahnung, ob die Routine da rauskopiert werden dürfte. Eventuell ist die runas Geschichte aber die Lösung, um das Hauptprogramm am Ende des Setups mit
Delphi-Quellcode:
aufzurufen. Die Frage ist nun, wie fülle ich <currentLoggedInUser> mit dem richten Wert? Wenn ich mir die Wobei ich immer noch kaum glauben kann, dass es für dieses Problem keinen offiziellen Weg geben soll.
MyShellExecute('runas <currentLoggedInUser> Hauptprogramm.exe');
In Post #3 hat nicodex geschrieben, dass der offizielle weg über den Task Scheduler führen soll, allerdings kann man diesen Dienst in jedem Windows deaktivieren und dann läuft die Geschichte dort auch nicht mehr. Die Frage ist auch, ob man wirklich erst umständlich dort eine Aufgabe eintragen muss (über irgendein dolles Windows API), um einen Prozess in einem anderen Benutzerkontext zu starten. Denn ich will ja das Programm ohnehin sofort (also ohne Zeitverzögerung starten). Wie machen das denn MSI Installer wie zum Beispiel InstallAware, die bieten ja beim Abschluss der Installation ähnliche Optionen an, hat da jemand Erfahrungen? Exceeder :cry: |
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Thx, habe den Link angepasst. Die Umstellung der Hilfe hat die URL geändert.
Der MS Installer verwendet einen bereits installierten Dienst, der das alles abwickelt. Tipp: Verwende CreateProcessAsUser statt CreateProcess. |
Re: Neuer Prozess im Benutzermodus (wenn Quellprogramm asAdm
Hallo,
habe wohl in meiner ersten Suche (bevor ich den Thread aufgemacht habe) nicht richtig gesucht. Bin gerade per Google Suche über das ![]() Falls noch jemand Ideen dazu hat, würde ich mich freuen noch was zu hören. Ansonsten melde ich mich nochmal, wenn ich eine Lösung gefunden habe, die funktioniert. Exceeder |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:36 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