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/Stoppen Windows Server 2012 (https://www.delphipraxis.net/190362-dienst-starten-stoppen-windows-server-2012-a.html)

Byteteufel 27. Sep 2016 17:38

Dienst Starten/Stoppen Windows Server 2012
 
Hallo zusammen,

die Funktionen laufen unter Windows 10 einwandfrei. Unter Windows Server 2012 kommt allerdings der Staus-Code = 0 heraus und nichts tut sich. :?:

http://www.delphipraxis.net/88581-di...-abfragen.html

Gibt es diese Routine auch für Windows 2012 Server? Ausgeführt werden die Funktionen mit dem Recht eines Administrators.

Viele Grüße

Axel

himitsu 27. Sep 2016 18:29

AW: Dienst Starten/Stoppen Windows Server 2012
 
Unicode scheint erstmal kein Problem zu sein, bei dem alten Code. (auf den ersten Blick)

Aber bei der Fehlerbehandlung fehlt ein bissl was ... alles mit GetLastError bei Fehlern.
Vieles ist richtig mit
Delphi-Quellcode:
if ... <> 0 then
abgefangen, aber im ELSE wird der Fehler nicht ausgewertet.

Was sagt der Debugger?
Delphi mit Adminrechten starten und dann diesen Code mal schrittweise durchgehn.



Nicht schlimm, aber k.A. warum ServiceGetStatus/ServiceRunnig mit PChar und nicht auch mit String deklariert wirden. :stupid:

mm1256 27. Sep 2016 20:00

AW: Dienst Starten/Stoppen Windows Server 2012
 
Zitat:

Zitat von himitsu (Beitrag 1348977)
Nicht schlimm, aber k.A. warum ServiceGetStatus/ServiceRunnig mit PChar und nicht auch mit String deklariert wirden. :stupid:

Da steckt aber evtl. auch der Wurm drin, wenn z.B. der Rechnername (aus welchen Gründen auch immer) unter 2012 nicht stimmt oder richtig ermittelt wird. Wenn man das auf dem lokalen Rechner/Server aufruft, reicht auch "nil".

Delphi-Quellcode:
  SMHandle := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  ...
  OpenService(SMHandle,PWideChar('ServiceName'),SERVICE_QUERY_STATUS);
  ...
Tut bei mir jedenfalls auf alles OS.

himitsu 28. Sep 2016 03:11

AW: Dienst Starten/Stoppen Windows Server 2012
 
Ein Leerstring ist nil (nur nicht, wenn man das über PChar "castet", denn dieser Cast, leitet bei einem Leerstring auf eine Dummy-Konstante mit dem Inhalt #0#0 um)
Und dann eben andersrum, denn die Start- und Stopfunktionen sind ja mit String deklariert :zwinker:

Die Fehlerbehandlung ist das größere Problemchen.
Der Code mag funktionieren, aber wenn was nicht geht, dann erfährt man nicht das Warum. :angle:

@mm: Genau sowas war/ist das Problem, seit der Unicode-Umstellung, im Jahre 2009, bzw. dein Code knallt vor D2009 im Compiler.
Weil Viele einfach falsche Typen verwendeten.
Zitat:

OpenService(SMHandle,PWideChar
OpenService > PChar(String)
OpenServiceA > PAnsiChar(AnsiString)
OpenServiceW > PWideChar(WideString) oder PWideChar(UnicodeString)

himitsu 1. Okt 2016 02:00

AW: Dienst Starten/Stoppen Windows Server 2012
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab da mal was ausgekoppelt.
Delphi-Quellcode:
if ServiceControl.Start('DeinService') then

if ServiceControl.Stop('DeinService') then
Delphi-Quellcode:
uses
  System.TypeInfo;

procedure TForm6.FormCreate(Sender: TObject);
var
  Arr: TArray<string>;
begin
  Memo1.Lines.Add('GetStatusStr '  + ServiceControl.GetStatusStr('DeinService'));
  Memo1.Lines.Add('GetStatus ' + GetEnumName(TypeInfo(ServiceControl.TStatus), Ord(ServiceControl.GetStatus('DeinService'))));
  Memo1.Lines.Add('IsRunning ' + BoolToStr(ServiceControl.IsRunning('DeinService'), True));
  Memo1.Lines.Add('IsInteractive ' + BoolToStr(ServiceControl.IsInteractive('DeinService'), True));
  Memo1.Lines.Add('AcceptControl ' + SetToString(PTypeInfo(TypeInfo(ServiceControl.TAccepts)), Byte(ServiceControl.AcceptControl('DeinService')), True));
  Memo1.Lines.Add('GetDisplayName ' + ServiceControl.GetDisplayName('DeinService'));

  if True {IsAdmin} then begin
    if ServiceControl.Start('DeinService') then
      Memo1.Lines.Add('Start') else Memo1.Lines.Add('NOT Start');
    if ServiceControl.TAccept.PauseContinue in ServiceControl.AcceptControl('DeinService') then begin
      if ServiceControl.Pause('DeinService') then
        Memo1.Lines.Add('Pause') else Memo1.Lines.Add('NOT Pause');
      if ServiceControl.Continue('DeinService') then
        Memo1.Lines.Add('Continue') else Memo1.Lines.Add('NOT Continue');
    end;
    if ServiceControl.Stop('DeinService') then
      Memo1.Lines.Add('Stop') else Memo1.Lines.Add('NOT Stop');
  end;

  Arr := ServiceControl.GetDependencies('DeinService');
  Memo1.Lines.Add('* GetDependencies ' + IntToStr(Length(Arr)));
  Memo1.Lines.AddStrings(Arr);

  Arr := ServiceControl.EnumServices;
  Memo1.Lines.Add('* EnumServices False ' + IntToStr(Length(Arr)));
  Memo1.Lines.AddStrings(Arr);

  Arr := ServiceControl.EnumServices([ServiceControl.TState.All], True);
  Memo1.Lines.Add('* EnumServices True ' + IntToStr(Length(Arr)));
  Memo1.Lines.AddStrings(Arr);
end;


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