2011-08-25 30 views
192

Me gustaría modificar la ruta de acceso a mi aplicación, pero al hacerlo se rompe porque el servicio aún apunta a la ubicación anterior.Modificar la "Ruta al ejecutable" de un servicio de Windows

Al ir a Administrative Tools > Services puede abrir un cuadro de diálogo de propiedades y ver el Path to executable, pero no hay forma de cambiarlo.

¿Hay alguna forma en que un usuario pueda modificar la ruta del servicio sin tener que volver a instalar la aplicación?

Respuesta

151

Existe también this approach seen on SuperUser que utiliza la línea de comandos sc en lugar de modificar el registro:

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

Nota: el espacio después de binPath= es importante. También puede consultar la configuración actual usando:

sc qc <service name> 

Esto muestra una salida similar a:

[SC] QueryServiceConfig ÉXITO

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 : [email protected] 
+11

Recomendaría este enfoque sobre los cambios de registro directo. Muchas rutas requieren cadenas entrecomilladas, que puede ingresar de la siguiente manera, por ejemplo, con el servidor MS SQL: 'sc config mssqlserver binPath =" \ "F: \ SQL DATA \ MSSQL10.MSSQLSERVER \ MSSQL \ Binn \ sqlservr.exe \" -sMSSQLSERVER "' –

+2

También es probablemente un poco mejor en una secuencia de comandos de implementación que el enfoque de modificación de registro directo. –

+0

Dulce. Más limpio que perder el tiempo en reg. ** Nota: Deberá cerrar y abrir services.msc para ver el cambio. – yonsk

264

Se trata de editar el registro, pero la información de servicio se puede encontrar en HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services. Encuentre el servicio que desea redirigir, ubique la subclave ImagePath y cambie ese valor.

+2

aunque finalmente esto lleva al registro de datos, debería mencionar que existen especial de Windows Funciones API para tratar con el servicio. Se debe evitar la modificación directa del registro (porque no puede estar seguro de qué más cambiará Windows cuando modifique la ruta de acceso a exe, por ejemplo) a menos que esté ** totalmente ** seguro de lo que hace. – lospejos

+3

@lospejos "Debo mencionar que existen funciones especiales de Windows API para manejar el servicio" ... ¿cuál sería? –

+3

Esta es una mala respuesta ya que existe el comando sc – Worthy7

0

Usted puede eliminar el servicio:

sc delete ServiceName 

A continuación, vuelva a crear el servicio.

+1

No hay necesidad de hacer esto, hay al menos 3 formas mejores de hacerlo – Liam

7

También puede hacerlo con 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") 

O:

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

un poco más profundo con el comando 'SC', que son capaces de extraer todo 'Servicios Nombre' y tiene todos '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] 

Do 'pequeña' de edición notepad2 .. Select 'SERVICE_NAME: ', CTRL+H, click 'Replace All' Imagine that we can do 'Replace All' within 'CMD'

Luego, continúe con '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] 

it is 'SERVICES on Our Machine' datos en bruto está listo para alimentar el futuro de archivo por lotes 'por lo que el resultado es el siguiente aspecto a continuación !!!

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

Pero, HTML será bastante más fácil: D

Alguna idea brillante de mejora son V bienvenida^_^

+0

O use 'sc' que es mucho, mucho más fácil y menos como para arruinarlo – Liam

Cuestiones relacionadas