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/)
-   -   Dienst starten mit Delphi (https://www.delphipraxis.net/190897-dienst-starten-mit-delphi.html)

krac 17. Nov 2016 12:29

Dienst starten mit Delphi
 
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

Luckie 17. Nov 2016 12:34

AW: Dienst starten mit Delphi
 
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.

Der schöne Günther 17. Nov 2016 12:39

AW: Dienst starten mit Delphi
 
Hallo und Herzlich Willkommen in den Heiligen Hallen des Wissens und des Wahnsinns :love:

Delphi-Quellcode:
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.

Bernhard Geyer 17. Nov 2016 12:41

AW: Dienst starten mit Delphi
 
Es werden vermutlich Adminrechte zum Ausführen nötig sein.
Als IDE mit Adminrechten starten wenn du das Debuggen willst.

Luckie 17. Nov 2016 12:43

AW: Dienst starten mit Delphi
 
Jetzt wird rumgeraten. Fehler auswerten und sehen wo ran es liegt. Dann kann man sich um eine Lösung kümmern.

krac 17. Nov 2016 12:50

AW: Dienst starten mit Delphi
 
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.

Luckie 17. Nov 2016 12:52

AW: Dienst starten mit Delphi
 
Fehlercode 5 von GetLastError oder?

Hast du den Code entsprechend angepasst/verbessert?

krac 17. Nov 2016 13:06

AW: Dienst starten mit Delphi
 
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.

himitsu 17. Nov 2016 15:29

AW: Dienst starten mit Delphi
 
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. :roll:
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.

krac 23. Nov 2016 12:11

AW: Dienst starten mit Delphi
 
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.


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