![]() |
Programm nur mit User-Rechten starten von Admin-Prozess
Ich habe ein als mit Admin-Rechten laufendes Programm.
Dies soll nun ein anderes Programm, welches als "Invoker" compiliert wurde, nur mit User-Rechten aufrufen. Wie mache ich das? Problem ist ja, dass normalerweise "Invoker" bedeutet, dass es die Rechte vom aufrufenden Programm erbt. Es soll in diesem Falle aber nicht die Admin-Rechte des aufrufenden Prozesses erben, sondern nur mit User-Rechten gestartet werden. |
AW: Programm nur mit User-Rechten starten von Admin-Prozess
Eventuell mit
![]() ![]() /edit Falls Du die Jedi verwendest, ![]() Copy/Paste von dort falls Link tot geht.
Delphi-Quellcode:
uses
ComObj, ActiveX, JwaWinbase, JwaWtsApi32; {$R *.DFM} procedure ServiceController(CtrlCode: DWORD); stdcall; begin ServiceExample.Controller(CtrlCode); end; function TServiceExample.GetServiceController: TServiceController; begin Result := ServiceController; end; procedure TServiceExample.ServiceExecute(Sender: TService); begin Timer1.Enabled := True; while not Terminated do ServiceThread.ProcessRequests(True); // wait for termination Timer1.Enabled := False; end; procedure TServiceExample.Timer1Timer(Sender: TObject); const ProgramName = 'C:\myTestproject1.exe'; var hToken: THandle; StartupInfo: Windows.TStartupInfo; ProcessInfo: Windows.TProcessInformation; res: boolean; begin Windows.GetStartupInfo(StartupInfo); if WTSQueryUserToken(WtsGetActiveConsoleSessionID, hToken) then begin res := Windows.CreateProcessAsUser(hToken, ProgramName, nil, nil, nil, False, CREATE_NEW_CONSOLE, nil, nil, StartupInfo, ProcessInfo); if res then WaitForSingleObject(ProcessInfo.hProcess,INFINITE); end; end; |
AW: Programm nur mit User-Rechten starten von Admin-Prozess
Hallo Kodezwerg,
schon mal danke für die Mühe. Nein, die Jedis verwende ich nicht. Habe das mal versucht hier umzusetzen, aber WTSQueryUserToken liefert false zurück, so dass in der Folge CreateProcressAsUser nicht ausgeführt wird.
Delphi-Quellcode:
function WTSQueryUserToken(SessionId: ULONG; var phToken: THandle): BOOL; stdcall; external 'Wtsapi32.dll';
procedure TForm3.Button1Click(Sender: TObject); const ProgramName = 'D:\DEV\DX10\FileIO\FileIO.exe'; var hToken: THandle; StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; res: boolean; SessionID: Cardinal; begin GetStartupInfo(StartupInfo); SessionID := WtsGetActiveConsoleSessionID; if WTSQueryUserToken(SessionID, hToken) then begin res := CreateProcessAsUser(hToken, ProgramName, nil, nil, nil, False, CREATE_NEW_CONSOLE, nil, nil, StartupInfo, ProcessInfo); if res then WaitForSingleObject(ProcessInfo.hProcess,INFINITE); end; end; |
AW: Programm nur mit User-Rechten starten von Admin-Prozess
WTSQueryUserToken wird nur innerhalb eines Service mit aktivem TCB-Privilege funktionieren.
Es ist nicht ganz klar, ob das "andere Programm" mit dem selben User, aber ohne Elevation ausgeführt werden soll, oder als gänzlich anderer User. Für die Situation, dass eine Un-Elevation ausgeführt werden soll, bieten sich die APIs ![]() ![]() ![]() Siehe auch: ![]() |
AW: Programm nur mit User-Rechten starten von Admin-Prozess
Zitat:
Standard-Mäßig startet mein Dateimanager-programm mit normalen User-Rechten. Für manche Aufgaben braucht man Admin-Rechte. Das löse ich so, dass einmal ein externes Programm mit Admin-Rechten gestartet wird welches die Aufgaben dann erledigt. Manchmal braucht das Dateimanager-Programm aber selber Adminrechte, um. z.B. bestimmte Verzeichnisse anzuzeigen, die man überhaupt nur mit Adminrechten zu sehen bekommt. Das mache dann so, dass das erwähnte Hilfsprogramm gestartet wird, das Dateimanager-programm beendet wird und dann das Hilfsprogramm das Dateimanager-Programm wieder mit Admin-Rechten startet. Dann ist die Aufgabe erledigt und man möchte das Datamanager-Programm wieder nur mit User-Rechten laufen lassen. Also wird das Hilfsprogramm wieder aufgerufen, das Dateimanager Programm beendet und das Hilfsprogramm soll das Dateimanager-Programm wieder mit einfachen User-Rechten starten. Nur - Das Dateimanager-Programm hatte ja zuletzt Admin-Rechte, so dass der aufgerufene Prozess (das Hilfsprogramm) auch Admin-Rechte hat. Das mit Admin-Rechten laufende Hilfsprogramm soll aber dennoch das Dateimanager-Programm nur mit User-Rechten starten. |
AW: Programm nur mit User-Rechten starten von Admin-Prozess
Alternativ könntest Du versuchen ob Dich
![]() Damit gibst Du per runtime einer bestimmten procedure admin-rechte. Es kommt wie bei externen Programm auch zur UAC Abfrage etc, nur brauchst Du dafür nichts schließen öffnen etc. |
AW: Programm nur mit User-Rechten starten von Admin-Prozess
Ich ärgere mich so oft über Setups die mit ihrem Häkchen "installiertes Programm jetzt starten" das Programm gleich mit Adminrechten starten :evil:
Etwas verstehen kann ich es, das scheint ja echt viel schwieriger umzusetzen zu sein als es sich anhört. Schau mal die Antworten hier: ![]() |
AW: Programm nur mit User-Rechten starten von Admin-Prozess
Wenn das Hilfsprogramm die einmal erworbenen Adminrechte nicht wieder vererben soll, dann gibt es da schon eine Möglichkeit. Es nennt sich "DropMyRights".
Details dazu unter "Browsing the Web and Reading E-mail Safely as an Administrator" ![]() Das Programm lässt sich auch auf andere Exefiles, als den IE anwenden. Microsoft hat die Download URL's nicht mehr aktiv scheint es; deshalb als Alternativquelle: ![]() |
AW: Programm nur mit User-Rechten starten von Admin-Prozess
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm..
@THY4243 DropMyRights entfernt zwar 'Administrator' vom gestarteten Program, aber elevated verbleibt... SaferCreateLevel berücksichtigt anscheinend nicht 'Elevated', da es aus der Zeit davor stammt. Anbei ein kleines Testtool. Es startet sich selber wieder als normaler User. |
AW: Programm nur mit User-Rechten starten von Admin-Prozess
@Harry Stahl, ich habe was in einem der Links gefunden und erfolgreich unter Windows 10 x64 ausprobiert:
Ich habe eine Starter-Applikation geschrieben die eine Batch-Datei aufruft, in der Batch-Datei wird das gemacht: %SYSTEMROOT%\explorer.exe "c:\Projects\RunAs\RunAsTester.exe" Starter-Applikation als Administrator elevated geöffnet Tester.exe als normalo non-elevated geöffnet klappt wunderbar, aber anzumerken ist das Microsoft es jederzeit wieder entfernen kann. Ich hoffe Du verstehst was ich meine und kannst es ebenso erfolgreich für Deine Zwecke nutzen. Viele Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 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 by Thomas Breitkreuz