Entwickler-Ecke

Windows API - Dienst startet nicht


delbor - Sa 08.01.11 11:02
Titel: Dienst startet nicht
Hi zusmmen

Ich hab mir MySQL als Win7-Dienst installiert, aber in der Verwaltung auf manuell Starten gestellt. Das Ding läuft standardmässig also gar nicht. Darauf zugreifen will ich nur mit meinem/meinen eigenen Programm/en. So habe ich denn nach einer Möglichkeit gesucht, Dienste zu starten(http://www.delphi-library.de/topic_einen+Service+startenstoppen_77.html).
Obwohl ich die übergebene Variable aMachine mit einem Leerstring initialisiert habe, kriege ich kein Handle:
Zitat:
h_svc := OpenService(h_manager, PChar(aServiceName),SERVICE_START or SERVICE_QUERY_STATUS);

h_svc ist nach dieser Zeile 0, der Dienst wird 'geschlossen' und die funktio verlassen. Woran kann das liegen? Ich tippe auf die Rechte. Die Frage ist aber auch: wie verschaffe ich mir die per Code?

Gruss
Delbor


Delete - Sa 08.01.11 14:44

Mit welchen Rechten läuft das Programm? Als normaler Benutzer hast du nicht die nötigen Rechte, um einen Dienst zu starten. Mit ImpersonateLoggedOnUser kannst du dienen Prozess unter einem anderen Benutzerkonto laufen lassen.

http://www.michael-puff.de/Programmierung/Artikel/Impersonate.shtml


delbor - Sa 08.01.11 15:51

Hi Luckie

Danke für deine Antwort! Das ganze kann doch noch etwas komplizierter werden, da ich bislang Delphi eigentlich ohne Rechte starte, das heisst, ich muss mir die Zugriffsrechte bislang immer erst bestätigen. Welche Rechte das Programm hat, bin ich mir nicht so sicher; es dürfte sich aber um Adminrechte handeln.

Ich werde mir aber die Rechteverwaltung von Windows wohl so oder so nochmal vornehmen müssen. Win7 ist doch komplexer als es WinXP war.

Gruss
Delbor


jaenicke - Sa 08.01.11 17:09

user profile icondelbor hat folgendes geschrieben Zum zitierten Posting springen:
Win7 ist doch komplexer als es WinXP war.
Nicht besonders, aber die meisten Benutzer waren zu faul oder zu unwissend um unter XP als normale Benutzer zu arbeiten. Wenn du dort nicht mit Adminrechten gearbeitet hättest, hättest du die selben Zugriffsprobleme gehabt...

Was gibt denn GetLastError zurück?


Quake User - Sa 08.01.11 20:04

- Du kannst Dir natürlich keine Rechte per Code verschaffen. Das wäre ja absurd. Rechte verschafft Dir der Admin.
- Du brauchst den Dienst nicht beenden. Wenn er nicht verwendet wird, lagert Windows die Speicherbereiche aus. Der Sinn eines Dienstes ist ja u.a., dass er unabhängig von der Nutzeranmeldung läuft.
- Das ein Client den Server hoch oder runterfährt ist unüblich. Bist Du sicher, dass das der richtige Ansatz ist?
- Für Dienste (wie Datenbanken) gibt es Admin-Tools. Mit denen kann der Admin die Dienste starten und stoppen. Nutze diese ggf. Ich verwende dafür bspw. "MySQL Administrator"


delbor - So 09.01.11 00:51

Hi zusammen

@Quake User:

Zitat:
- Du kannst Dir natürlich keine Rechte per Code verschaffen. Das wäre ja absurd. Rechte verschafft Dir der Admin.
Diese Aussage scheint mir doch recht widersprüchig:
- Hmm... Ich, bzw. der User, unter dem ich arbeite, ist Administrator-Mitglied.
- Siehe meinen Link zum Code, der einen Dienst starten kann, bzw.
- Luckie's Link zu meiner Frage wegen den Rechten unter Win7.

Gefragt ist unter Win7 nicht primär die Einsparung von Speicherplatz durch Reduzierung der Dienste, sondern der unnötige Zeitaufwand beim Hochstarten des BS durch Aktivierung selten benötigter Dienste.

GrussDelbor


jaenicke - So 09.01.11 01:10

user profile icondelbor hat folgendes geschrieben Zum zitierten Posting springen:
- Hmm... Ich, bzw. der User, unter dem ich arbeite, ist Administrator-Mitglied.
Deshalb hast du aber noch keine vollen Adminrechte. Da Microsoft bei 2000 und XP gemerkt hat, dass Vernunft nichts hilft, haben sie einfach ab Vista auch den standardmäßigen Adminbenutzern die Rechte entzogen. Diese müssen dann über die UAC angefordert werden.

Nur um die Startzeit zu reduzieren der Aufwand? Ob Windows 7 nun in 14 oder 15 Sekunden startet, wen störts...


delbor - So 09.01.11 01:39

Hi jaenicke

Zitat:
Nur um die Startzeit zu reduzieren der Aufwand? Ob Windows 7 nun in 14 oder 15 Sekunden startet, wen störts...


Etwas ähnliches hab ich mich auch schon gefragt: allerdings eher in Bezug auf den Nutzen. Wenn ich allein den Aufwand betrachte, den ich erbracht habe, um mehr zur aktuellen Fragestellung zu erfahren und mir dann vorstelle, ich hätte in der Zeit einfch das aktuelle Projekt mit weniger Schnickschnack/vermeintlichem(?) Problembewusstsein weiterentwickelt...
Andrerseits - Probleme sind dazu da, gelöst, nicht umgangen zu werden...

Gruss
Delbor


jaenicke - So 09.01.11 02:24

Nun, jedenfalls bleibt dir eben nur, den UAC Dialog aufpoppen zu lassen, wenn der Dienst erst gestartet werden muss. Wenn der Benutzer das nicht möchte, kann er den Dienst ja auf automatisch stellen.


delbor - So 09.01.11 11:46

Hi jaenicke

Als ich damals MySQL als Windows-Dienst installiert habe, habe ich im Grunde genommen genau das getan, was andere Programme auch tun. Dabei ist Win7 zumindest auch deshalb schneller als Vista, weil MS dazu übergegangen ist, Dienste, die nicht sofort benötigt werden, nicht beim Systemstart hochzufahren, sondern erst auf Anforderung. Und dann kommen MS-fremde Programme und müllen die Dienste wieder voll...

Trotzdem werde ich MySQL vorerst automatisch starten lassen; die Sache mit dem UAC-Dialog kann ich später im Zuge eines Updates / der Optimierung immer noch realisieren. (Nennt sich Prioritäten setzen :wink: )

Gruss
Delbor


Delete - So 09.01.11 13:46

Um es mal deutlich zu schreiben. Ab Windows Vista hat der Administrator zwei Token. Das des Administrators und das eine eingeschränkten Benutzers. Standardmäßig aktiviert ist das Token des eingeschränkten Benutzers. Der Administrator ist also erst mal nichts weiter wie ein normaler Benutzer. Erst wenn für eine Aktion Administratorenberechtigungen erforderlich sind, wird per UAC das Administratorentoken "aktiviert".


Quake User - So 09.01.11 18:40

user profile icondelbor hat folgendes geschrieben Zum zitierten Posting springen:
Hi zusammen

@Quake User:

Zitat:
- Du kannst Dir natürlich keine Rechte per Code verschaffen. Das wäre ja absurd. Rechte verschafft Dir der Admin.
Diese Aussage scheint mir doch recht widersprüchig:
- Hmm... Ich, bzw. der User, unter dem ich arbeite, ist Administrator-Mitglied.
- Siehe meinen Link zum Code, der einen Dienst starten kann, bzw.
- Luckie's Link zu meiner Frage wegen den Rechten unter Win7.

Gefragt ist unter Win7 nicht primär die Einsparung von Speicherplatz durch Reduzierung der Dienste, sondern der unnötige Zeitaufwand beim Hochstarten des BS durch Aktivierung selten benötigter Dienste.

GrussDelbor

Ich halte Dein Grundannahme für falsch, dass ein Clientprogramm die Rechte haben sollte, einen Dienst zu starten oder zu beenden. Das hebelt jedes Konzept eines Administrator in einer Firma aus. Dienste sollten nicht bei Bedarf gestartet werden. Dienste sollten zur Verfügung stehen! Den Rest macht das Serverbetriebssystem. Darum soll sich kein Client kümmern. (Einsparung von Zeit, Rechenlast, Strom, Speicherplatz, Datensicherung ...)


FrEaKY - Do 24.03.11 21:22

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Um es mal deutlich zu schreiben. Ab Windows Vista hat der Administrator zwei Token. Das des Administrators und das eine eingeschränkten Benutzers. Standardmäßig aktiviert ist das Token des eingeschränkten Benutzers. Der Administrator ist also erst mal nichts weiter wie ein normaler Benutzer. Erst wenn für eine Aktion Administratorenberechtigungen erforderlich sind, wird per UAC das Administratorentoken "aktiviert".

Ist das nicht eine, hm, ziemlich krasse Zweckentfremdung? Ich kann in dem Begriff "Administrator" nichts zweideutiges erkennen. Was sich M$ da mal wieder gedacht hat...
Naja, meine Haltung zu Win7 kennst Du ja bereits ;) :lol:


jaenicke - Do 24.03.11 22:03

user profile iconFrEaKY hat folgendes geschrieben Zum zitierten Posting springen:
Ist das nicht eine, hm, ziemlich krasse Zweckentfremdung? Ich kann in dem Begriff "Administrator" nichts zweideutiges erkennen. Was sich M$ da mal wieder gedacht hat...
Nun ja, was dabei herauskommt, wenn der Standardbenutzer Adminrechte hat, hat man ja bei Windows 2000 und XP gesehen. Die meisten sind einfach zu unwissend, zu dumm oder zu faul als Standardbenutzer zu arbeiten. (Bei deinen Äußerungen wette ich, dass du auch mit Adminrechten arbeitest.) Dementsprechend unsicher sind die meisten XP-Systeme.

Andererseits würden vermutlich viele so dämlich sein immer als Root zu arbeiten, wenn Microsoft einen Weg in die Richtung von Linux und anderen Systemen gegangen wäre (wobei im Grunde der Standardbenutzer von XP ja so etwas ähnliches wie der User root war). Und insofern ist die gefundene Lösung mit der UAC schon ein guter Mittelweg. Man muss sich nicht besonders gut auskennen und hat dennoch einen guten Schutz. Wobei das für Linux mittlerweile ja auch mehr oder weniger gilt.

Aber was wäre denn dein Vorschlag? Oder willst du nur sagen, dass alles Sch*** ist?

In größeren Firmen sieht das natürlich ohnehin anders aus, da dort die Benutzerrechte in der Regel ohnehin verwaltet werden, egal ob es nun Windows 2000 oder Windows 7 ist. Und dort hat der normale Benutzer ohnehin keine Adminrechte, so dass die UAC dort ohnehin keinen so großen Nutzen hat. Insofern hat sich dort weniger viel geändert.

user profile icondelbor hat folgendes geschrieben Zum zitierten Posting springen:
Gefragt ist unter Win7 nicht primär die Einsparung von Speicherplatz durch Reduzierung der Dienste, sondern der unnötige Zeitaufwand beim Hochstarten des BS durch Aktivierung selten benötigter Dienste.
An der Stelle vielleicht so nebenbei:
Damit der Start von Windows nicht unnötig verzögert wird, kann man den Starttyp von Diensten auf automatisch, aber verzögert einstellen.


delbor - Fr 25.03.11 21:37

Hi jaenicke

Zitat:
...automatisch, aber verzögert einstellen.


Danke für die Info. Hab das aus reiner Gewohnheit schlicht übersehen.

Gruss
Delbor