So starten Sie einen Dienst vom CMD neu

1

Ich habe ein Python-Skript, das einen Bluetooth-Dienst über die Registrierung startet, indem der StartWert durch den Wert ersetzt wird, den manualich tun muss, um den Dienst vom CMD neu zu starten. Jetzt weiß ich, dass ich dies durch Eingabe tun kann. net start "Bluetooth Support Service"Wenn ich dies jedoch nach dem Ausführen meines Skripts mache, findet es den Dienst nicht und gibt Folgendes aus:

C:\Users\z-perkins-thomas\Documents\bin\python\fix-dap>net start "Bluetooth Support Service"

System error 1058 has occurred.

The service cannot be started, either because it is disabled or because it has no enabled devices associated with it.

Wie kann ein Dienst nach der erneuten Aktivierung korrekt neu gestartet werden?

13aal
quelle
Ändert sich etwas, wenn Sie sc config bthserv start= demandstattdessen mit mit aktivieren ? Funktioniert es nach einem Neustart?
Ben N
@BenN Natürlich tut es das. Aber das ist nicht der Punkt, ich muss den Dienst neu starten und nicht wieder ändern. Ich erstelle ein Skript, das den Schlüssel bearbeitet und den Dienst neu
startet

Antworten:

2

Durch das Festlegen des Werts in der Registrierung werden die speicherinternen Informationen des Service Control Managers nicht aktualisiert. Die unterstützte Methode ist die Verwendung der SCM-API oder eines Befehlszeilenprogramms, das dies für Sie erledigt:

sc config bthserv start= demand

Beachten Sie, dass der Dienstname, bthservdie Dienst-ID und nicht der Anzeigename ist. Sie können die ID eines bestimmten Dienstes in dessen Eigenschaftenfenster im Dienste-MMC-Snap-In ( services.msc) anzeigen .

Sie können den Dienst dann wie gewohnt starten.

Obwohl durch manuelles Durchschlagen der Registrierung Dienste den neuen geänderten Status anzeigen, ist der Dienst seltsamerweise immer noch effektiv deaktiviert. Ich habe dies getestet und festgestellt, dass es nur mit der unterstützten Methode oder möglicherweise nach einem Neustart wirklich aktiviert wird. Da Ihr Skript bereits ein Windows-Dienstprogramm ( net) verwendet, wird auch scdie Portabilität durch die Verwendung nicht beeinträchtigt.

Ben N
quelle
Durch Ändern des Registrierungsschlüsselwerts von 4 in 3 wird der Wert in services.msc wie gewünscht in manual geändert.
13.
@ 13aal Das ist ziemlich seltsam - obwohl Services den durchgeknallten Zustand anzeigt, scheint der SCM nicht vollständig über die Änderung Bescheid zu wissen. Es wird nur dann wirklich aktiviert, wenn Sie eine unterstützte Methode verwenden. Im Allgemeinen ist es vorzuziehen , die dedizierte API zu verwenden, anstatt mit der Registrierung zu fummeln. Glücklicherweise scwird Ihre Lösung nicht weniger portabel, wenn Sie den Dienst auch neu konfigurieren (anstelle des Skripts zum Ändern der Registrierung), da Sie bereits darauf angewiesen sind net.
Ben N
warum ist das aber Haben Sie eine Idee, würden Sie denken, dass sich eine direkte Bearbeitung der Registrierung sofort verbreiten würde
13aal
1
@ 13aal Ich vermute, dass der SCM die Informationen beim Start aus der Registrierung lädt und sein Wissen im Arbeitsspeicher nur aktualisiert, wenn eine Neukonfiguration über seine API erfolgt. (Ähnlich wie bei Registrierungsänderungen zur Anzeige von Einstellungen ist ein Anmelde- / Abmeldezyklus erforderlich, es sei denn, Sie verwenden die API, die die entsprechenden Anwendungen über die Änderung benachrichtigt.) Ich bin nicht sicher, warum das Dienste-Snap-In die nicht wirksamen Änderungen erkennt, aber Ich habe empirische Beweise dafür, dass Dienste falsch sein können, wenn die direkte Manipulation der Registrierung im Spiel ist.
Ben N