AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dienst starten mit Delphi

Ein Thema von krac · begonnen am 17. Nov 2016 · letzter Beitrag vom 23. Nov 2016
Antwort Antwort
krac

Registriert seit: 17. Nov 2016
10 Beiträge
 
#1

Dienst starten mit Delphi

  Alt 17. Nov 2016, 12:29
Hallo zusammen,

ich hätte eine frage zu diesem code :

Delphi-Quellcode:
function ServiceStart(Machine, ServiceName: string): Boolean;
// Machine is UNC path or local machine if empty
var
  h_manager, h_svc: SC_Handle;
  ServiceStatus: TServiceStatus;
  dwCheckPoint: DWORD;
  ServiceArgVectors: PChar;
begin
  h_manager := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT);
  if h_manager > 0 then
  begin
    h_svc := OpenService(h_manager, PChar(ServiceName),
      SERVICE_START or SERVICE_QUERY_STATUS or SC_MANAGER_ALL_ACCESS);
    if h_svc > 0 then //ab hier bricht er ab und beendet alles
    begin
      if (StartService(h_svc, 0, ServiceArgVectors)) then { succeeded } 
      begin
        if (QueryServiceStatus(h_svc, ServiceStatus)) then
        begin
          while (SERVICE_RUNNING <> ServiceStatus.dwCurrentState) do
          begin
            dwCheckPoint := ServiceStatus.dwCheckPoint;
            Sleep(ServiceStatus.dwWaitHint);
            if (not QueryServiceStatus(h_svc, ServiceStatus)) then
              // couldn't check status
              break;
            if (ServiceStatus.dwCheckPoint < dwCheckPoint) then
              break;
          end;
        end;
      end;
      CloseServiceHandle(h_svc);
    end;
    CloseServiceHandle(h_manager);
  end;

  Result := (SERVICE_RUNNING = ServiceStatus.dwCurrentState);
end;

und zwar wenn ich dies ausführe, komme ich nie in die ab kommentar rein

könnt ihr mir lösungvorschläge geben

danke im vorraus

Geändert von krac (17. Nov 2016 um 12:31 Uhr) Grund: Code-tags ergänzt. Beim nächsten mal bitte selber eonfügen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Dienst starten mit Delphi

  Alt 17. Nov 2016, 12:34
Werte im else Zweig der If Beding aus und mach da mal ein GetLastError rein. Ist auch eine Unsitte Fehler nicht auszuwerten.

Oder guck mal in der Ereignisanzeige von Windows, ob du da was findest.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (17. Nov 2016 um 12:40 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Dienst starten mit Delphi

  Alt 17. Nov 2016, 12:39
Hallo und Herzlich Willkommen in den Heiligen Hallen des Wissens und des Wahnsinns

OpenService ist ein WinApi-Aufruf. Schau mal in die Doku dazu:
https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx

Zitat:
If the function succeeds, the return value is a handle to the service.

If the function fails, the return value is NULL. To get extended error information, call GetLastError.
Du bekommst Null zurück. Der Aufruf schlug also fehl. Du kannst jetzt z.B. einmal RaiseLastOSError() aufrufen für eine Fehlermeldung auf dem Bildschirm. Oder dir, wie gesagt, den Wert von GetLastError() anschauen und herausfinden was denn nun sein Problem ist.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Dienst starten mit Delphi

  Alt 17. Nov 2016, 12:41
Es werden vermutlich Adminrechte zum Ausführen nötig sein.
Als IDE mit Adminrechten starten wenn du das Debuggen willst.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Dienst starten mit Delphi

  Alt 17. Nov 2016, 12:43
Jetzt wird rumgeraten. Fehler auswerten und sehen wo ran es liegt. Dann kann man sich um eine Lösung kümmern.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
krac

Registriert seit: 17. Nov 2016
10 Beiträge
 
#6

AW: Dienst starten mit Delphi

  Alt 17. Nov 2016, 12:50
Danke für die Antworten

Hab es ausprobiert und gesehen, dass ich keine rechte habe. Man muss es dann als Admin ausführen, dann funktioniert es.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Dienst starten mit Delphi

  Alt 17. Nov 2016, 12:52
Fehlercode 5 von GetLastError oder?

Hast du den Code entsprechend angepasst/verbessert?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
krac

Registriert seit: 17. Nov 2016
10 Beiträge
 
#8

AW: Dienst starten mit Delphi

  Alt 17. Nov 2016, 13:06
Fehlermeldung : ... 'Systemfehler. Code: 5. Zugriff verweigert' aufgetreten

Wenn ich das Programm aber einfach mit Rechtsklick 'Als Admin ausführen' starte funktioniert es.

Noch hab ich nichts gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#9

AW: Dienst starten mit Delphi

  Alt 17. Nov 2016, 15:29
Aus diesem Grunde sollte man eben auch die Rückgabewerte ordentlich auswerten, denn die sagen einem oft, woran es hängt.
Hier also an den fehlenden Rechten.

Und ja, genau darum geht das dann, denn dann hat dein Programm die nötigen Rechte, um diesen Befehl ausführen zu dürfen.
Entweder dein Programm hat von Anfang an die nötigen Rechte, oder man besurgt sie sich zur Laufzeit und gibt das zugehörige Token da rain, wo du nil übergist.
[edit] Nee, diese APIs haben zufällig mal keinen Parameter für einen SECURITY_DESCRIPTOR. (es gibt nur die Möglichkeit die Rechte für den laufenden Service festzulegen)
Also bliebe nur noch die Möglichkeit die Rechte des Threads für diesen Aufruf anzupassen, wenn das Programm nicht schon mit ausreichenden Rechten gestartet wurde.


PS: Aus diesem Grunde hatte ich in meiner Unit das auch nochmal für den Entwickler kenntlich gemacht.
Leider steht im MSDN nicht welches Privilege/Recht nun genau benötigt wird.
Delphi-Quellcode:
type
  [API('AdvAPI32.dll'), Source('winsvc.h')]
  ServiceControl = class abstract
    [UserAdmin, API('AdvAPI32.dll', 'StartService')] // <<<<<<<<<<<<<< ADMIN <<<<<<<<<<<<<<<<<<
    procedure Start(const ServiceName: string; const Parameters: array of string); overload;
    procedure Start(const ServiceName: string); overload;

    ...
  emd;
http://www.delphipraxis.net/190362-d...ml#post1349417
Also ich würde mir da die Fehlerbehandlung mal abgucken.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Nov 2016 um 01:27 Uhr)
  Mit Zitat antworten Zitat
krac

Registriert seit: 17. Nov 2016
10 Beiträge
 
#10

AW: Dienst starten mit Delphi

  Alt 23. Nov 2016, 12:11
So
tschuldigung für die späte antwort, jedoch konnte ich vorher nicht.

ich hab es so erstellt, dass ich es im Aufgabenplaner anlege. dort lege ich den user als admin fest. und der dienst kann gestartet werden.
  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 17:23 Uhr.
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