AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Programm nur mit User-Rechten starten von Admin-Prozess

Programm nur mit User-Rechten starten von Admin-Prozess

Ein Thema von Harry Stahl · begonnen am 3. Dez 2018 · letzter Beitrag vom 5. Dez 2018
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.300 Beiträge
 
Delphi 11 Alexandria
 
#1

Programm nur mit User-Rechten starten von Admin-Prozess

  Alt 3. Dez 2018, 18:03
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.293 Beiträge
 
Delphi 10.3 Rio
 
#2

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

  Alt 3. Dez 2018, 18:14
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;
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 3. Dez 2018 um 19:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.300 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 3. Dez 2018, 21:24
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;

Geändert von Harry Stahl ( 3. Dez 2018 um 22:43 Uhr)
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#4

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

  Alt 4. Dez 2018, 00:01
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
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.300 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 4. Dez 2018, 15:38
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.293 Beiträge
 
Delphi 10.3 Rio
 
#6

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

  Alt 4. Dez 2018, 15:50
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.889 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

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

  Alt 4. Dez 2018, 19:04
Ich ärgere mich so oft über Setups die mit ihrem Häkchen "installiertes Programm jetzt starten" das Programm gleich mit Adminrechten starten

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
  Mit Zitat antworten Zitat
THY4243

Registriert seit: 15. Dez 2012
Ort: München - Untermenzing
29 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 4. Dez 2018, 22:32
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
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
940 Beiträge
 
Delphi 6 Professional
 
#9

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

  Alt 5. Dez 2018, 09:15
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.
Angehängte Dateien
Dateityp: zip Test_SaferAPI.zip (213,6 KB, 19x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.293 Beiträge
 
Delphi 10.3 Rio
 
#10

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

  Alt 5. Dez 2018, 16:03
@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
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf