Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Service starten/stoppen ohne/mit Adminrechten/Elevation (https://www.delphipraxis.net/162152-service-starten-stoppen-ohne-mit-adminrechten-elevation.html)

chaosben 9. Aug 2011 18:54

Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Helft mir mal bitte auf die Sprünge:

Wenn ich unter Win7(64) ein Delphi-Programm mit "normalen" Rechten (ich bin Mitglied der Gruppe Administratoren) laufen lassen, kann es keine Dienste anhalten/starten (GetLastError = Access denied). Starte ich es mit Adminrechten (händisch oder per Manifest) funktionierts.

Bis hier hin verstehe ich es.

Gehe ich aber in die Diensteverwaltung kann ich Dienste anhalten/starten ohne das ich die Adminrechte vorher bestätigen muss.
Warum geht das? Oder anders gefragt: Wie bekomme ich das gleiche Verhalten für mein Delphi-Programm?

musicman56 10. Aug 2011 08:24

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Hallo,

"install" oder "setup" im Dateinamen deiner ausführbaren Datei dürfte das Problem beheben.

himitsu 10. Aug 2011 08:35

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Für die Diensteverwaltung muß man bestimmt auch gewisse Rechte "aktiv" haben, welche wohl in der Diensteverwaltung aktiviert wurden, aber in deinem Programm standardmäßig nicht.

Als mit Adminmanifest ist dein Programm nun nicht beschnitten und darum läuft es dort.

Jetzt müßtest du also nur noch rausfinden, welches Recht du aktivieren mußt, versuchst es in deinem Programm zu aktivieren und könntest dann vermutlich auch ohne Admin-Manifest was machen.

Zitat:

Zitat von musicman56 (Beitrag 1115892)
"install" oder "setup" im Dateinamen deiner ausführbaren Datei dürfte das Problem beheben.

Wozu bitte solche Hacks?

Wenn er in seinem Manifest die Win7-Kompatibilität seines Programms bestätigt, dann wird sowas nicht gemacht, da dieses "nur" ein Kompatibilitätsmodus für alte oder "schlechte" Setupprogramme ist, wo das Admin-Manifest vergessen wurde/noch nicht vorhanden ist, da es damals ja unbekannt war/nicht existierte.
Und ich hoffe mal, daß M$ dieses irgendwann auch wieder ausbaut. :twisted:

PS: Ob mit Admin-Manifest oder diesem Namenshack ... es sollte sich überall das UAC melden, also dann lieber gleich das Manifest.

chaosben 10. Aug 2011 08:41

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Zitat:

Zitat von himitsu (Beitrag 1115894)
Jetzt müßtest du also nur noch rausfinden, welches Recht du aktivieren mußt, versuchst es in deinem Programm zu aktivieren

Welche Art Rechte meinst du denn? Mir fehlt im Moment jeder Ansatz. Mir reicht auch ein MSDN-Link/Stichwort.

DeddyH 10. Aug 2011 08:44

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Vielleicht hilft dieser Artikel (willkürlich gewählt) weiter: StartService
Zitat:

hService [in]

A handle to the service. This handle is returned by the OpenService or CreateService function, and it must have the SERVICE_START access right. For more information, see Service Security and Access Rights.

chaosben 10. Aug 2011 08:59

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Das ist soweit klar. Ich muss beim Öffnen des Dienstes sagen, was ich mit ihm machen will.
In diesem Fall sieht der Code so aus:
Delphi-Quellcode:
OpenService(scm, PWideChar(WideString(FServiceName)), SERVICE_QUERY_STATUS or SERVICE_START or SERVICE_STOP)


Bleibt noch die Frage: wie bekommt mein Programm das Recht dies zu tun?

DeddyH 10. Aug 2011 09:05

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Wenn man dem Link zu "Service Security and Access Rights" folgt, kommt man ziemlich am Ende zu einem weiteren Link, der dann hierhin führt. Evtl. kann das als Ansatz dienen.

himitsu 10. Aug 2011 09:13

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Bei OpenService gibst du nur an, welche Rechte für den späteren Zugriff nötig wären, aber nicht welche Privilegien aktiviert werden müssen.
Das ist wie bei einer Datei: Du hast die Rechte zum Schreiben und Lesen, gibst aber nur das nötige im CreateFile an.
Hast du keine Schreibrechte und versuchst dennoch einen Schreibzugriff zu bekommen (GENERIC_WRITE), dann knallt's.


Entweder über deen Link von DeddyH oder z.B. über http://www.michael-puff.de/Programmi...rivilges.shtml

chaosben 10. Aug 2011 09:42

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Was Deddy gesagt hat, nützt mir nichts, da mein Programm (noch) nicht genug Rechte hat, um auf den Dienst zuzugreifen (und dessen Security-Optionen zu ändern).

Der Hinweis bezüglich der Privilegien hingegen ist gut.
Mein aktueller Stand ist, das ich mit Luckies Routine mir das Privileg SeProfileSingleProcessPrivilege holen kann (es ist vorher nicht gesetzt)
Aber: bisher hat es keine Auswirkungen. Ich kann den den Dienst immer noch nicht öffnen, weil der Zugriff verweigert wird und ich finden keinen Hinweis darauf, welches andere Privileg nötig ist, um einen Dienst zu starten/stoppen

himitsu 10. Aug 2011 10:38

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sysinternals > Process Explorer > Prozess-Eigenschaften
Dort nachsehn, was die Dienstverwaltung alles darf und mit Denen deines Programms vergleichen.

chaosben 10. Aug 2011 11:15

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Zwei **** ein Gedanke ;)

Die 3 Privileges(ChangeNotify, CreateGlobal, Impersonate) die die MMC.exe hat helfen auch nicht weiter. :(

ChrisE 10. Aug 2011 11:25

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Zitat:

Zitat von chaosben (Beitrag 1115862)
Gehe ich aber in die Diensteverwaltung kann ich Dienste anhalten/starten ohne das ich die Adminrechte vorher bestätigen muss.
Warum geht das? Oder anders gefragt: Wie bekomme ich das gleiche Verhalten für mein Delphi-Programm?

Wenn ich mich richtig entsinne, wurde mit Windows 7 doch die Nachfragerei der UAC verbessert. Sie ist jetzt einstellbar in ihrer "Hartnäckigkeit" des Nachfragens. Ich nehme schwer an, dass wenn du die Stufe nach ganz oben stellst, die Diensteverwaltung ebenso eine Admin-UAC-Abfrage generiert - also bei mir ist es zumindest so.

Ich denke an den Rechten die Du benötigst ändert sich gar nichts. Es dürfte damit zu tun haben, was man tun muss, damit man ein Programm erzeugen kann, dass bei entsprechend niedriger Stufe (weniger UAC-Nachfragen) auch keine Nachfrage erzeugt.

Gruß, Chris

himitsu 10. Aug 2011 11:30

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Zitat:

Zitat von chaosben (Beitrag 1115945)
Die 3 Privileges(ChangeNotify, CreateGlobal, Impersonate) die die MMC.exe hat helfen auch nicht weiter. :(

War Impersonate nicht sowas wie das Ändern von Rechten/Privilegien? :stupid:

Wie dem auch sei ... aktiviere die doch mal bei dir uns schau ob es dann geht, eventuell zusammen mit dem Code von DeddyH.

chaosben 10. Aug 2011 11:34

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Mit "helfen auch nicht weiter" meinte ich eigentlich: habs ausprobiert und nützt nix :)

Natürlich könnte ich mich als Administrator-User impersonaten ... aber das ist ja nicht Sinn der Sache.

ChrisE 10. Aug 2011 11:38

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Hallo chaosben,

nur damit ich es verstehe - geht es Dir darum einen Dienst starten / stoppen zu können ohne die Admin-Nachfrage oder geht es dir darum es generell als Benutzer tun zu können?

Ich glaube als Benutzer hast du wenig möglichkeiten Dienste zu steuern. Dein (Sub)Programm braucht auf jeden Fall die Rechte dafür. Ob das Starten des (Sub)programms mit hohen Rechten allerdings mit dem UAC-Dialog ein her geht steht meiner Meinung nach auf einem anderen Blatt.

Gruß, Chris

chaosben 10. Aug 2011 11:52

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Ich als Entwickler kann alles machen, wie es mir gefällt.
Aber eine Komponente von mir soll einen (in diesem Fall Firebird) Dienst anhalten und wieder starten können.
Das ist der Sinn der ganzen Diskussion.

rollstuhlfahrer 10. Aug 2011 11:57

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Zitat:

Zitat von chaosben (Beitrag 1115957)
Aber eine Komponente von mir soll einen (in diesem Fall Firebird) Dienst anhalten und wieder starten können.

Dann muss die sich die Admin-Rechte selber besorgen. Und dann kommt auch der UAC-Dialog und der User muss das händisch bestätigen, dass das Programm das auch darf.

Grund ist, wie Chris schon bemerkt hat: Deine UAC-Einstellungen sind nur auf der 2. Stufe (nicht ganz oben). Das heißt: Alles aus der Systemsteuerung bekommt automatisch die besseren Rechte zugewiesen. Du musst dann für die Systemsteuerung nichts bestätigen. Für alles andere aber schon.
Wenn du jetzt deine UAC-Einstellung nach ganz oben schiebst, dann musst du auch für mmc.exe und Konsorten Admin-Rechte explizit vergeben.

Bernhard

PS: Es gibt noch eine ziemlich unschöne Möglichkeit: Du kannst in den Windows-Einstellungen eine Ausnahme für dein Programm einbauen, dass es immer und ohne Nachfrage an den User mit Admin-Rechten startet.

ChrisE 10. Aug 2011 11:58

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Zitat:

Zitat von chaosben (Beitrag 1115957)
Ich als Entwickler kann alles machen, wie es mir gefällt

Das ist mir klar, ich meinte auch den Benutzer als "Rechteinhaber" unter Windows. Nicht Dich als physische Person :-)

Ich wollte eigentlich auf etwas anderes Raus:
Zitat:

Zitat von chaosben (Beitrag 1115957)
Gehe ich aber in die Diensteverwaltung kann ich Dienste anhalten/starten ohne das ich die Adminrechte vorher bestätigen muss.
Warum geht das?

Das geht meiner Meinung nach nur dann ohne den Admin-Dialog wenn die UAC entsprechend eingestellt ist. Das ist unabhängig von den Rechten die benötigt werden um Dienste zu starten oder zu stoppen.
Aber ich sehe, dass dir das wahrscheinlich schon klar ist.

Gruß, Chris

musicman56 10. Aug 2011 12:05

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Hallo,

Zitat:

Wozu bitte solche Hacks?
hmmmmm....Irrtum, das sind keine Hacks! MSDN lesen würde dieses Missverständnis beseitigen.

Zitat:

PS: Ob mit Admin-Manifest oder diesem Namenshack ... es sollte sich überall das UAC melden, also dann lieber gleich das Manifest.
Zweiter Irrtum: Bei der Steuerung von Diensten ist eine Interaktion mit dem User nicht gestattet, und darum kommt in dieser Situation niemals ein UAC-Dialog.

Abgesehen davon: Ich mach es schon jahrelang mit meinem Datenbankdienst so (NexusDB) wie beschrieben, und es funktioniert auf allen OS.

chaosben 10. Aug 2011 12:16

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
@Chris: Wir beide meinten dasselbe (den User), nur hab ich mich unglücklich ausgedrückt. :-D

Ich lese aus eure Posts folgendes: Es geht nicht anders. Man muss den blöden Dialog hinnehmen. (Und daraus resultiert leider auch, das man das Programm nicht debuggen kann)
Ist das die Moral von der Geschichte?

//edit:
Naja ... nee ... da muss es aber doch noch einen Weg geben. Führe ich das Programm auf einem Server2008 als User Administrator aus, geht alles so wie es sein sollte ... ohne Dialog.
Eigentlich müsste ich mir doch die Rechte des Admins über Gruppen holen können ... oder?

ChrisE 10. Aug 2011 12:24

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Zitat:

Zitat von chaosben (Beitrag 1115967)
@Chris: Wir beide meinten dasselbe (den User), nur hab ich mich unglücklich ausgedrückt. :-D

;-)
Zitat:

Zitat von chaosben (Beitrag 1115967)
Es geht nicht anders. Man muss den blöden Dialog hinnehmen.

Nur schlimmsten Falls - also wenn du UAC entsprechnd eingestellt ist.
Zitat:

Zitat von chaosben (Beitrag 1115967)
(Und daraus resultiert leider auch, das man das Programm nicht debuggen kann)

Nein, wenn die IDE als Admin gestartet wird, dann kannst du "sollche" Programme auch debuggen.
Zitat:

Zitat von musicman56 (Beitrag 1115964)
hmmmmm....Irrtum, das sind keine Hacks! MSDN lesen würde dieses Missverständnis beseitigen.

Hmm, da Wort hack meinte glaube ich nur, dass man damit auch nicht mehr erzeugt, als eine Adminrechte wie auch mit einem Admin-Manifest. Dieser automatismus ist ja auch von MS - wie du auch schreibst - dokumentiert.
Zitat:

Zitat von musicman56 (Beitrag 1115964)
Zweiter Irrtum: Bei der Steuerung von Diensten ist eine Interaktion mit dem User nicht gestattet, und darum kommt in dieser Situation niemals ein UAC-Dialog.

Das stimmt nur halb. Ein Dienst hat keine rechte eine GUI zuhaben - also User-Interaktion. Er halt wohl das recht mit einem "Anzeigeprogramm" zu kommunizieren. Genauso wie ein Anzeigeprogramm einen Dienst Nachrichten schicken kann bzw. mitteilen kann, was er tun soll und was nicht.

Gruß, Chris

P.S. @ chaosben: Nen schuss ins Blaue: Einen Dienst schreiben, der Firebird starten und anhalten kann und diesem per eigenen Programm Nachricht zu kommen lassen start/stop?

rollstuhlfahrer 10. Aug 2011 12:26

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Zitat:

Zitat von chaosben (Beitrag 1115967)
Ist das die Moral von der Geschichte?

Nein. Einfach die IDE als Explizit-Admin starten und schon kann man das wieder debuggen.

Zitat:

Zitat von chaosben (Beitrag 1115967)
Naja ... nee ... da muss es aber doch noch einen Weg geben. Führe ich das Programm auf einem Server2008 als User Administrator aus, geht alles so wie es sein sollte ... ohne Dialog.
Eigentlich müsste ich mir doch die Rechte des Admins über Gruppen holen können ... oder?

Der Benutzer "Administrator" hat die UAC nicht an. Alle anderen Benutzer aber schon. Das heißt:
* Alle Prozesse von "Administrator" haben wirklich Admin-Rechte
* Alle Prozesse von Benutzern aus der Gruppe Administratoren, ungleich "Administrator" haben im Regelfall keine Admin-Rechte. Erst wenn die Meldung bestätigt wird (-> UAC), dann gibt es Admin-Rechte.

Bernhard

chaosben 10. Aug 2011 12:31

AW: Service starten/stoppen ohne/mit Adminrechten/Elevation
 
Ok ... vielen Dank euch allen! :dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 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