AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Einzelne Funktionen als Admin ausführen
Thema durchsuchen
Ansicht
Themen-Optionen

Einzelne Funktionen als Admin ausführen

Ein Thema von RonnyBausA · begonnen am 27. Mär 2012 · letzter Beitrag vom 17. Apr 2012
Antwort Antwort
RonnyBausA

Registriert seit: 29. Nov 2011
10 Beiträge
 
Delphi XE2 Professional
 
#1

AW: Einzelne Funktionen als Admin ausführen

  Alt 27. Mär 2012, 12:15
@Luckie
da hst Du natürlich Recht. Ich hatte es bisher immer global für alle als Autostart eingetragen. Das könnte ich natürlich ändern und nur für den Benutzer den Autostart-Eintrag setzen. Das tut meinem Programm keinen Abbruch, das werde ich machen.

Trotz alledem würde es mich interessieren, ob ich z.B. mit einer DLL oder irgendwie anders auch mal eine Funktion mit Adminrechten ausführen kann und wie das ginge. Es bleibt noch meine Wunschfunktion über, meinen eigenen Dienst auch mal vom Benutzer starten oder stoppen zu lassen, ohne ihn in die Diensteverwaltung leiten zu müssen.

Ronny
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.919 Beiträge
 
Delphi 12 Athens
 
#2

AW: Einzelne Funktionen als Admin ausführen

  Alt 27. Mär 2012, 13:16
Trotz alledem würde es mich interessieren, ob ich z.B. mit einer DLL oder irgendwie anders auch mal eine Funktion mit Adminrechten ausführen kann und wie das ginge.
Wenn der notwendige COM Server von deinem Setup vorher registriert wird, geht das, ja. Aber einfach ist das nicht.

Ich mache das daher wie schon genannt wurde einfach mit der eigenen Exe und passenden Parametern...
Wenn du die mit ShellExecute und runas als Verb startest, bist du schon fast fertig. Ein Befehl also. Und in deiner Projektdatei musst du nun nur noch schauen, ob die Exe mit diesem speziellen Parameter aufgerufen wurde und dann deinen Admincode ausführen.

Dann brauchst du gar keine zweite Datei, weder Exe noch DLL.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
RonnyBausA

Registriert seit: 29. Nov 2011
10 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Einzelne Funktionen als Admin ausführen

  Alt 28. Mär 2012, 12:02
@jaenicke,
ich hab das jetzt so gemacht, wie du es vorgeschlagen hast. Ich starte meine Anwendung ein zweites Mal mit ShellExecuteEx und wahlweise 2 Parametern (1x zum Starten und 1x zum Stoppen meines Dienstes).
Code:
function RunAs(const FileName, StartParam: string): Boolean;
 var sefunc: TShellExecuteInfo;
begin
  FillChar(sefunc, SizeOf(sefunc), 0);
  sefunc.cbSize:= SizeOf(sefunc);
  sefunc.Wnd:= 0;
  sefunc.lpVerb:= PChar('runas');
  sefunc.lpFile:= PChar(FileName);
  sefunc.lpParameters:= PChar(StartParam);
  sefunc.nShow:= SW_HIDE;
  Result:= ShellExecuteEx(@sefunc);
end;

procedure TMainForm.DStartBtnClick(Sender: TObject);
begin
  RunAs(Application.ExeName, ' /startts');
end;
In der Projektdatei frage ich ab, ob einer der beiden Paramter übergeben wurde. Wenn ja führe ich meine Admin-Funktionen aus und beende das Programm. Andernfalls fahre ich ganz normal mit dem Erzeugen der Formulare fort und lasse das Programm normal laufen.
Code:
  StartProg := True;
  if ParamCount > 0 then                                                       // Startparameter wurde übergeben
  begin
    if (LowerCase(ParamStr(1)) = '/startts') then                              // Dienst starten
    begin
      ServiceStart('','MyService');
      StartProg := False;                                                      // Das normale Programm nicht ausführen
    end
    else if (LowerCase(ParamStr(1)) = '/stopts') then                          // Dienst stoppen
    begin
      ServiceStop('','MyService');
      StartProg := False;                                                      // Das normale Programm nicht ausführen
    end;
  end;
  if StartProg then
  begin
    Application.CreateForm(TMainForm, MainForm);
    .
    .
    Application.Run;
  end;
Das funktioniert soweit gut. Damit ist meine Frage beantwortet.
Vielen Dank an euch alle.
Ronny
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#4

AW: Einzelne Funktionen als Admin ausführen

  Alt 16. Apr 2012, 20:03
Trotz alledem würde es mich interessieren, ob ich z.B. mit einer DLL oder irgendwie anders auch mal eine Funktion mit Adminrechten ausführen kann und wie das ginge.
Das geht mal prinzipiell garnicht, es sei denn du hast diverse Privilegien (bzw. der ausführende Prozeß). Im Endeffekt läuft es auf TCB-Privilegien hinaus ...

Ich rede hier von Impersonation, also dem Annehmen einer anderen Benutzeridentität (pro Thread). Alles andere läuft an Prozeßgrenzen ab und kann daher nicht pro Funktion privilegiert gemacht werden.

Es bleibt noch meine Wunschfunktion über, meinen eigenen Dienst auch mal vom Benutzer starten oder stoppen zu lassen, ohne ihn in die Diensteverwaltung leiten zu müssen.
Kannste doch. Dienste sind genau dazu da Löcher in das Rechtesystem zu bohren um gezielt Funktionalität an unprivilegierte Benutzer zu delegieren.

Sprich: schreibe zwei Dienste, oder registriere deinen Dienst zweimal. Einmal bietet er den Dienst an den du halt jetzt schon anbietest (Dienst A). Einmal bietet er (bspw. auf Basis von Gruppenmitgliedschaften oder anderen Eigenschaften) an Dienst A zu starten und zu stoppen. Schon ist die Sache gegessen und Benutzer können das bequem selber erledigen. Das geht dann ggf. sogar ohne UAC-Dialog, wenn man das so will ...
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
RonnyBausA

Registriert seit: 29. Nov 2011
10 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Einzelne Funktionen als Admin ausführen

  Alt 17. Apr 2012, 07:35
Einmal bietet er den Dienst an den du halt jetzt schon anbietest (Dienst A). Einmal bietet er (bspw. auf Basis von Gruppenmitgliedschaften oder anderen Eigenschaften) an Dienst A zu starten und zu stoppen. Schon ist die Sache gegessen und Benutzer können das bequem selber erledigen. Das geht dann ggf. sogar ohne UAC-Dialog, wenn man das so will ...
Dienst B muss dann aber auch mit dem lokalem Systemkonto laufen, damit er Dienst A starten oder stoppen kann, sehe ich dass richtig?
Und kommt die UAC-Abfrage nicht standardmäßig, wenn ein Dienst gestartet oder gestoppt werden soll?
Das wäre jetzt nur mal für mich zum Verständnis. Da ich für diesen Fall das Starten oder Stoppen des Dienstes sowieso nur in Ausnahmefällen und dann mit Benutzerinteraktion mache funktioniert das prima mit dem Starten der zweiten Instanz meines Programms. Aber vielleicht braucht man so eine Funktion ohne UAC ja mal in einem anderen Programm.

Viele Grüße
Ronny
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#6

AW: Einzelne Funktionen als Admin ausführen

  Alt 17. Apr 2012, 14:02
Dienst B muss dann aber auch mit dem lokalem Systemkonto laufen, damit er Dienst A starten oder stoppen kann, sehe ich dass richtig?
Muß er nicht, aber er muß unter einem Konto laufen welches Dienste starten und Stoppen kann. Dabei handelt es sich um ein Recht und das haben sowobl Admins als auch SYSTEM standardmäßig. Es würde also per SYSTEM funktionieren.

Und kommt die UAC-Abfrage nicht standardmäßig, wenn ein Dienst gestartet oder gestoppt werden soll?
Nein. Dienste laufen in einer anderen Session (seit Vista und früher bei aktivem TS), Fenster können die garnicht anzeigen (es gibt da einen widerlichen Workaround seitens MS, der ist aber nur eine Krücke für Dienste die sich nicht ordentlich benehmen).
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 05:32 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