Ändern des "Pfads zur ausführbaren Datei" eines Windows-Dienstes

253

Ich möchte den Pfad zu meiner Anwendung ändern, bricht ihn jedoch ab, da der Dienst immer noch auf den alten Speicherort verweist.

Wenn Sie zu gehen, können Administrative Tools > ServicesSie ein Eigenschaftendialogfeld öffnen und das anzeigen. Es Path to executablegibt jedoch keine Möglichkeit, es zu ändern.

Gibt es eine Möglichkeit, wie ein Benutzer den Dienstpfad ändern kann, ohne die Anwendung neu installieren zu müssen?

GenericJon
quelle

Antworten:

245

Es gibt auch diesen Ansatz bei SuperUser, der die scBefehlszeile verwendet, anstatt die Registrierung zu ändern :

sc config <service name> binPath= <binary path>

Hinweis: Das Leerzeichen danach binPath=ist wichtig. Sie können die aktuelle Konfiguration auch abfragen mit:

sc qc <service name>

Dies zeigt eine Ausgabe ähnlich der folgenden an:

[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: ServiceName

    TYPE               : 10  WIN32_OWN_PROCESS
    START_TYPE         : 2   AUTO_START
    ERROR_CONTROL      : 1   NORMAL
    BINARY_PATH_NAME   : C:\Services\ServiceName
    LOAD_ORDER_GROUP   :
    TAG                : 0
    DISPLAY_NAME       : <Display name>
    DEPENDENCIES       :
    SERVICE_START_NAME : user-name@domain-name
Niall Connaughton
quelle
24
Ich würde diesen Ansatz gegenüber direkten Registrierungsänderungen empfehlen. Viele Pfade erfordern Zeichenfolgen in Anführungszeichen, die Sie wie folgt eingeben können, beispielsweise mit MS SQL Server: sc config mssqlserver binPath= "\"F:\SQL DATA\MSSQL10.MSSQLSERVER\MSSQL\Binn\sqlservr.exe\" -sMSSQLSERVER"
Marc Durdin
2
Es ist wahrscheinlich auch ein bisschen schöner in einem Bereitstellungsskript als der direkte Registrierungsänderungsansatz.
Niall Connaughton
Süss. Sauberer als herumzuspielen in reg. ** Hinweis: Sie müssen services.msc schließen und öffnen, um die Änderung zu sehen.
Yonsk
1
Wenn Sie eine [SC] QueryServiceConfig FAILED 122:nach sc qc XGebrauch bekommen, sc qc X 1000sehen Sie dies
Raphael
13
Wenn von Powershell mit diesem, sicherzustellen , dass Sie verwenden sc.exe, nicht nacktsc
fiat
292

Es beinhaltet das Bearbeiten der Registrierung, aber Dienstinformationen finden Sie in HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services. Suchen Sie den Dienst, den Sie umleiten möchten, suchen Sie den ImagePathUnterschlüssel und ändern Sie diesen Wert.

Matt McHugh
quelle
3
Obwohl dies letztendlich zu Registrierungsdaten führt, sollte ich erwähnen, dass es spezielle Windows-API-Funktionen gibt, die sich mit dem Dienst befassen. Direkte Änderungen an der Registrierung sollten vermieden werden (da Sie nicht sicher sein können, was Windows sonst noch ändert, wenn es den Pfad zu exe ändert, z. B.), es sei denn, Sie sind sich absolut sicher, was Sie tun.
Lospejos
3
@lospejos "Ich sollte erwähnen, dass es spezielle Windows-API-Funktionen gibt, die sich mit dem Dienst befassen" ... was wäre das?
Nick M
Wenn jemand den in Services.msc aktualisierten Dienstpfad nicht sieht, versuchen Sie, mmc.exe "taskkill / F / IM mmc.exe" in cmd
Drag0nKn1ght
10

Sie können dies auch mit PowerShell tun:

Get-WmiObject win32_service -filter "Name='My Service'" `
    | Invoke-WmiMethod -Name Change `
    -ArgumentList @($null,$null,$null,$null,$null, `
    "C:\Program Files (x86)\My Service\NewName.EXE")

Oder:

Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\My Service" `
    -Name ImagePath -Value "C:\Program Files (x86)\My Service\NewName.EXE"
Greg Sansom
quelle
3

Öffnen Sie Run (win + R), geben Sie "Regedit.exe" ein, um "Registry Editor" zu öffnen, gehen Sie zu

HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services

finden „ Apache2.4 “ öffnen Sie den Ordner finden Sie die „ ImagePath “ auf der rechten Seite, offen „ImagePath“ unter „ Wert Daten “ legen Sie den folgenden Pfad:

"C: \ xampp \ apache \ bin \ httpd.exe" -k Lieferservice- Gegner XAMPP für andere verweisen auf den Speicherort, an dem Apache installiert ist, und suchen im Ordner den Ordner "C: (installierter Apache-Speicherort) \ bin \ httpd.exe". -k Lieferservice

Antonius Joseph
quelle
0

Sie können Ihren Pfad zur Ausführung eines Dienstes nicht direkt bearbeiten. Dafür können Sie den Befehl sc verwenden,

SC CONFIG ServiceName binPath= "Path of your file"

Z.B:

sc config MongoDB binPath="I:\Programming\MongoDB\MongoDB\bin\mongod.exe --config I:\Programming\MongoDB\MongoDB\bin\mongod.cfg --service"
Codemaker
quelle
0

Leichte Änderung an der Antwort von @CodeMaker für alle wie mich, die versuchen, einen MongoDB-Dienst für die Verwendung der Authentifizierung zu ändern.

Als ich mir den "Pfad zur ausführbaren Datei" in "Dienste" ansah, enthielt die ausgeführte Zeile bereits Sprachmarkierungen. Also musste ich sein Beispiel geringfügig ändern.

Um genau zu sein.

  1. Geben Sie Dienste in Windows ein
  2. Suchen Sie MongoDB (oder den Dienst, den Sie ändern möchten) und öffnen Sie den Dienst. Stellen Sie dabei sicher, dass Sie ihn beenden.
  3. Notieren Sie sich den Dienstnamen (nicht den Anzeigenamen).
  4. Suchen Sie nach dem "Pfad zur ausführbaren Datei", kopieren Sie ihn und kopieren Sie ihn.

Für mich war der Weg (beachten Sie die Sprachmarkierungen)

"C:\Program Files\MongoDB\Server\4.2\bin\mongod.exe" --config "C:\Program Files\MongoDB\Server\4.2\bin\mongod.cfg" --service

In einem Befehlszeilentyp

sc config MongoDB binPath= "<Modified string with \" to replace ">"

In meinem Fall war das

sc config MongoDB binPath= "\"C:\Program Files\MongoDB\Server\4.2\bin\mongod.exe\" --config \"C:\Program Files\MongoDB\Server\4.2\bin\mongod.cfg\" --service -- auth"
John Duskin
quelle
-2

Sie können den Dienst löschen:

sc delete ServiceName

Erstellen Sie dann den Dienst neu.

Kim Wilson
quelle
3
Es gibt keine Notwendigkeit, dies zu tun, es gibt mindestens 3 bessere Möglichkeiten, dies zu tun
Liam
-2

Etwas tiefer mit dem Befehl 'SC' können wir alle 'Services Name' extrahieren und haben alle 'QueryServiceConfig' :)

>SC QUERY > "%computername%-services.txt" [enter]

>FIND "SERVICE_NAME: " "%computername%-services.txt" /i > "%computername%-services-name.txt" [enter]

>NOTEPAD2 "%computername%-services-name.txt" [enter]

Mach 'kleine' NOTEPAD2-Bearbeitung. Wählen Sie 'SERVICE_NAME:', STRG + H, klicken Sie auf 'Alle ersetzen'. Stellen Sie sich vor, wir können "Alle ersetzen" in "CMD" ausführen.

Fahren Sie dann mit 'CMD' fort.

>FOR /F "DELIMS= SKIP=2" %S IN ('TYPE "%computername%-services-name.txt"') DO @SC QC "%S" >> "%computername%-services-list-config.txt" [enter]

>NOTEPAD2 "%computername%-services-list-config.txt" [enter]

es ist "DIENSTLEISTUNGEN auf unserer Maschine" Die Rohdaten können jetzt in die 'zukünftige Batch-Datei' eingegeben werden. Das Ergebnis sieht also wie folgt aus !!!

+ -------------+-------------------------+---------------------------+---------------+--------------------------------------------------+------------------+-----+----------------+--------------+--------------------+
| SERVICE_NAME | TYPE                    | START_TYPE                | ERROR_CONTROL | BINARY_PATH_NAME                                 | LOAD_ORDER_GROUP | TAG | DISPLAY_NAME   | DEPENDENCIES | SERVICE_START_NAME |
+ -------------+-------------------------+---------------------------+---------------+--------------------------------------------------+------------------+-----+----------------+--------------+--------------------+
+ WSearch      | 10  WIN32_OWN_PROCESS   | 2   AUTO_START  (DELAYED) | 1   NORMAL    | C:\Windows\system32\SearchIndexer.exe /Embedding | none             | 0   | Windows Search | RPCSS        | LocalSystem        |
+ wuauserv     | 20  WIN32_SHARE_PROCESS | 2   AUTO_START  (DELAYED) | 1   NORMAL    | C:\Windows\system32\svchost.exe -k netsvcs       | none             | 0   | Windows Update | rpcss        | LocalSystem        |

HTML wird jedoch einfacher: D.

Gute Ideen zur Verbesserung sind willkommen V ^ _ ^

Rhak Kahr
quelle
Oder verwenden Sie, scwas viel, viel einfacher ist und weniger gerne vermasselt.
Liam