Modificando o "Caminho para o executável" de um serviço do Windows

253

Gostaria de modificar o caminho para o meu aplicativo, mas isso é interrompido porque o serviço ainda aponta para o local antigo.

Ao Administrative Tools > Servicesacessar Path to executable, você pode abrir uma caixa de diálogo de propriedades e exibir a , mas não há como alterá-la.

Existe alguma maneira de um usuário modificar o caminho do serviço sem precisar reinstalar o aplicativo?

GenericJon
fonte

Respostas:

245

Há também essa abordagem vista no SuperUser, que usa a sclinha de comando em vez de modificar o registro:

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

Nota: o espaço depois binPath=é importante. Você também pode consultar a configuração atual usando:

sc qc <service name>

Isso exibe uma saída semelhante a:

[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
fonte
24
Eu recomendaria essa abordagem sobre alterações diretas no registro. Muitos caminhos exigem seqüências de caracteres entre aspas, que você pode inserir da seguinte maneira, por exemplo, com o MS SQL Server: sc config mssqlserver binPath= "\"F:\SQL DATA\MSSQL10.MSSQLSERVER\MSSQL\Binn\sqlservr.exe\" -sMSSQLSERVER"
Marc Durdin
2
Também é provavelmente um pouco melhor em um script de implantação do que a abordagem de modificação direta do registro.
Niall Connaughton
Doce. Mais limpo do que mexer no reg. ** Nota: você precisará fechar e abrir o services.msc para ver a alteração.
yonsk
1
Se você receber um [SC] QueryServiceConfig FAILED 122:após sc qc Xo uso sc qc X 1000ver isso
raphael
13
Se usar isso a partir PowerShell, garantir que você use sc.exe, não um nusc
fiat
292

Envolve editar o registro, mas informações sobre o serviço podem ser encontradas em HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services. Encontre o serviço que você deseja redirecionar, localize a ImagePathsubchave e altere esse valor.

Matt McHugh
fonte
3
Embora, finalmente, isso leve a dados do registro, devo mencionar que existem funções especiais da API do Windows para lidar com o serviço. A modificação direta do registro deve ser evitada (porque você não pode ter certeza do que mais o Windows está alterando quando modifica o caminho para o exe, fe), a menos que você esteja absolutamente certo do que faz.
lospejos
3
@lospejos "Devo mencionar que existem funções especiais da API do Windows para lidar com o serviço" ... qual seria?
Nick M
Se alguém não vir o caminho do serviço atualizado no Services.msc, tente eliminar o mmc.exe "taskkill / F / IM mmc.exe" no cmd
Drag0nKn1ght
10

Você também pode fazer isso com o 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
fonte
3

Abra Executar (win + R), digite "Regedit.exe", para abrir o "Editor do Registro", vá para

HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services

encontre " Apache2.4 " abra a pasta encontre o " ImagePath " no lado direito, abra "ImagePath" em " value Data " coloque o seguinte caminho:

"C: \ xampp \ apache \ bin \ httpd.exe" -k executa o serviço XAMPP para outros apontar para o local onde o Apache está instalado e dentro de localizar a pasta bin "C: (local instalado do Apache) \ bin \ httpd.exe" -k runservice

Antony Joseph
fonte
0

Você não pode editar diretamente seu caminho para executar um serviço. Para isso você pode usar o comando sc,

SC CONFIG ServiceName binPath= "Path of your file"

Por exemplo:

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

Ligeira modificação nesta resposta do @CodeMaker, para quem gosta de mim que está tentando modificar um serviço MongoDB para usar autenticação.

Quando observei o "Caminho para o executável" em "Serviços", a linha executada já continha marcas de fala. Então eu tive que fazer pequenas modificações no seu exemplo.

Para ser específico.

  1. Digite Serviços no Windows
  2. Encontre o MongoDB (ou o serviço que você deseja alterar) e abra o serviço, certificando-se de interrompê-lo.
  3. Anote o nome do serviço (não o nome de exibição)
  4. Procure e copie o "Caminho para o executável" e copie-o.

Para mim, o caminho foi (observe as marcas do discurso)

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

Em um tipo de linha de comando

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

No meu caso, isso foi

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
fonte
-2

Você pode excluir o serviço:

sc delete ServiceName

Em seguida, recrie o serviço.

Kim Wilson
fonte
3
Não há necessidade de fazer isso, há pelo menos 3 melhores maneiras de fazer isso
Liam
-2

Um pouco mais fundo com o comando 'SC', somos capazes de extrair todos os 'Serviços' e obter todos os '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]

Faça edição 'pequena' do NOTEPAD2. Selecione 'SERVICE_NAME:', CTRL + H, clique em 'Substituir tudo' Imagine que podemos fazer 'Substituir tudo' dentro de 'CMD'

Em seguida, continue com '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]

é 'SERVIÇOS em nossa máquina' Os dados brutos estão prontos para alimentar o 'arquivo em lote futuro', então o resultado é o seguinte abaixo !!!

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

Mas, HTML será bem mais fácil: D

Quaisquer idéias brilhantes para melhoria são bem-vindas V ^ _ ^

Rhak Kahr
fonte
Ou use scmuito, muito mais fácil e menos aparafusar.
Liam