AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Dienst Starten/Stoppen Windows Server 2012
Thema durchsuchen
Ansicht
Themen-Optionen

Dienst Starten/Stoppen Windows Server 2012

Ein Thema von Byteteufel · begonnen am 27. Sep 2016 · letzter Beitrag vom 1. Okt 2016
Antwort Antwort
Byteteufel

Registriert seit: 20. Sep 2012
13 Beiträge
 
#1

Dienst Starten/Stoppen Windows Server 2012

  Alt 27. Sep 2016, 18:38
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Dienst Starten/Stoppen Windows Server 2012

  Alt 27. Sep 2016, 19:29
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 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.
$2B or not $2B

Geändert von himitsu (27. Sep 2016 um 19:34 Uhr)
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: Dienst Starten/Stoppen Windows Server 2012

  Alt 27. Sep 2016, 21:00
Nicht schlimm, aber k.A. warum ServiceGetStatus/ServiceRunnig mit PChar und nicht auch mit String deklariert wirden.
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.
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Dienst Starten/Stoppen Windows Server 2012

  Alt 28. Sep 2016, 04:11
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

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

@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)
$2B or not $2B

Geändert von himitsu (28. Sep 2016 um 04:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Dienst Starten/Stoppen Windows Server 2012

  Alt 1. Okt 2016, 03:00
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;
Angehängte Dateien
Dateityp: pas h5u.WinAPI.pas (23,5 KB, 38x aufgerufen)
$2B or not $2B

Geändert von himitsu ( 1. Okt 2016 um 03:03 Uhr)
  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 02:20 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