Modification du «Chemin d'accès à l'exécutable» d'un service Windows

253

Je souhaite modifier le chemin d'accès à mon application, mais cela le rompt car le service pointe toujours vers l'ancien emplacement.

En allant sur, Administrative Tools > Servicesvous pouvez ouvrir une boîte de dialogue des propriétés et afficher le Path to executable, mais il n'y a aucun moyen de le modifier.

Existe-t-il un moyen pour un utilisateur de modifier le chemin d'accès au service sans avoir à réinstaller l'application?

GenericJon
la source

Réponses:

245

Il y a aussi cette approche vue sur SuperUser qui utilise la scligne de commande au lieu de modifier le registre:

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

Remarque: l'espace après binPath=est important. Vous pouvez également interroger la configuration actuelle en utilisant:

sc qc <service name>

Cela affiche une sortie similaire à:

[SC] SUCCÈS QueryServiceConfig

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
la source
24
Je recommanderais cette approche plutôt que de modifier directement le registre. De nombreux chemins nécessitent des chaînes entre guillemets, que vous pouvez saisir comme suit, par exemple avec MS SQL Server: sc config mssqlserver binPath= "\"F:\SQL DATA\MSSQL10.MSSQLSERVER\MSSQL\Binn\sqlservr.exe\" -sMSSQLSERVER"
Marc Durdin
2
C'est aussi probablement un peu plus agréable dans un script de déploiement que l'approche de modification directe du registre.
Niall Connaughton
Doux. Plus propre que le déblayage dans reg. ** Remarque: vous devrez fermer et ouvrir services.msc pour voir le changement.
yonsk
1
Si vous obtenez une utilisation [SC] QueryServiceConfig FAILED 122:après voir cecisc qc Xsc qc X 1000
raphael
13
Si vous utilisez ceci de PowerShell, assurez-vous que vous utilisez sc.exe, pas un nusc
fiat
292

Cela implique la modification du registre, mais les informations de service peuvent être trouvées dans HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services. Recherchez le service que vous souhaitez rediriger, recherchez la ImagePathsous - clé et modifiez cette valeur.

Matt McHugh
la source
3
Bien que cela aboutisse finalement à des données de registre, je dois mentionner qu'il existe des fonctions API Windows spéciales pour gérer le service. La modification directe du registre doit être évitée (car vous ne pouvez pas être sûr de ce que Windows change quand il modifie le chemin vers exe, fe), sauf si vous êtes absolument sûr de ce que vous faites.
lospejos
3
@lospejos "Je dois mentionner qu'il existe des fonctions spéciales de l'API Windows pour gérer le service" ... ce serait quoi?
Nick M
Si quelqu'un ne voit pas le chemin d'accès au service mis à jour dans Services.msc, essayez de tuer mmc.exe "taskkill / F / IM mmc.exe" dans cmd
Drag0nKn1ght
10

Vous pouvez également le faire avec PowerShell:

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")

Ou:

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

Ouvrez Exécuter (win + R), tapez "Regedit.exe", pour ouvrir "Éditeur du Registre", accédez à

HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services

trouver " Apache2.4 " ouvrir le dossier trouver le " ImagePath " sur le côté droit, ouvrir "ImagePath" sous " valeur Data " mettre le chemin suivant:

"C: \ xampp \ apache \ bin \ httpd.exe" -k runservice ennemi XAMPP pour les autres pointent vers l'emplacement où Apache est installé et à l'intérieur localisez le dossier bin "C: (emplacement installé Apache) \ bin \ httpd.exe" -k runservice

Antony Joseph
la source
0

Vous ne pouvez pas modifier directement votre chemin pour exécuter un service. Pour cela, vous pouvez utiliser la commande sc,

SC CONFIG ServiceName binPath= "Path of your file"

Par exemple:

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

Légère modification de la réponse de @CodeMaker, pour toute personne comme moi qui essaie de modifier un service MongoDB pour utiliser l'authentification.

Lorsque j'ai regardé le "Chemin d'accès à l'exécutable" dans "Services", la ligne exécutée contenait déjà des marques vocales. J'ai donc dû apporter des modifications mineures à son exemple.

Pour être précis.

  1. Type de services dans Windows
  2. Recherchez MongoDB (ou le service que vous souhaitez modifier) ​​et ouvrez le service, en vous assurant de l'arrêter.
  3. Notez le nom du service (pas le nom d'affichage)
  4. Recherchez et copiez le "Chemin d'accès à l'exécutable" et copiez-le.

Pour moi, le chemin était (notez les marques vocales)

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

Dans un type de ligne de commande

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

Dans mon cas, c'était

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
la source
-2

Vous pouvez supprimer le service:

sc delete ServiceName

Recréez ensuite le service.

Kim Wilson
la source
3
Il n'y a pas besoin de faire cela, il y a au moins 3 meilleures façons de le faire
Liam
-2

Un peu plus en profondeur avec la commande 'SC', nous pouvons extraire tous les 'Services Name' et obtenir tous les '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]

Effectuez une «petite» édition du NOTEPAD2. Sélectionnez "SERVICE_NAME:", CTRL + H, cliquez sur "Remplacer tout" Imaginez que nous pouvons faire «Remplacer tout» dans «CMD»

Ensuite, continuez avec «CMD».

>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]

c'est 'SERVICES sur notre machine' Les données brutes sont prêtes à alimenter le «futur fichier de commandes», le résultat est le suivant ci-dessous !!!

+ -------------+-------------------------+---------------------------+---------------+--------------------------------------------------+------------------+-----+----------------+--------------+--------------------+
| 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        |

Mais le HTML sera plus simple: D

Toutes les idées d'amélioration brillantes sont les bienvenues V ^ _ ^

Rhak Kahr
la source
Ou utilisez scce qui est beaucoup, beaucoup plus facile et moins comme visser.
Liam