Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programm nur mit User-Rechten starten von Admin-Prozess (https://www.delphipraxis.net/198833-programm-nur-mit-user-rechten-starten-von-admin-prozess.html)

Harry Stahl 3. Dez 2018 18:03

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.

KodeZwerg 3. Dez 2018 18:14

AW: Programm nur mit User-Rechten starten von Admin-Prozess
 
Eventuell mit MSDN-Library durchsuchenCreateProcessWithLogon() oder MSDN-Library durchsuchenCreateProcessAsUser() methode realisierbar, ich habe es noch nicht versucht aber sollte man damit hinbekommen vermute ich.

/edit
Falls Du die Jedi verwendest, hier findest Du ein komplettes Beispiel.

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;

Harry Stahl 3. Dez 2018 21:24

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;

Basilikum 4. Dez 2018 00:01

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 MSDN-Library durchsuchenCreateRestrictedToken oder MSDN-Library durchsuchenSaferComputeTokenFromLevel an, um ein eingeschränktes Token zu erstellen, das dann für MSDN-Library durchsuchenCreateProcessAsUser verwendet werden kann, um das "andere Programm" un-elevated zu starten.
Siehe auch: https://stackoverflow.com/questions/...s-from-process

Harry Stahl 4. Dez 2018 15:38

AW: Programm nur mit User-Rechten starten von Admin-Prozess
 
Zitat:

Zitat von Basilikum (Beitrag 1420038)
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 MSDN-Library durchsuchenCreateRestrictedToken oder MSDN-Library durchsuchenSaferComputeTokenFromLevel an, um ein eingeschränktes Token zu erstellen, das dann für MSDN-Library durchsuchenCreateProcessAsUser verwendet werden kann, um das "andere Programm" un-elevated zu starten.
Siehe auch: https://stackoverflow.com/questions/...s-from-process

Vielleicht sollte ich mal beschreiben, worum es geht.

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.

KodeZwerg 4. Dez 2018 15:50

AW: Programm nur mit User-Rechten starten von Admin-Prozess
 
Alternativ könntest Du versuchen ob Dich das nicht eher ans Ziel bringt.
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.

Der schöne Günther 4. Dez 2018 19:04

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:
https://stackoverflow.com/q/1173630/2298252

THY4243 4. Dez 2018 22:32

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"
https://msdn.microsoft.com/en-us/library/ms972827.aspx
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:
https://www.grc.com/sn/notes-176.htm

HolgerX 5. Dez 2018 09:15

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.

KodeZwerg 5. Dez 2018 16:03

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 16:15 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz