Criar serviço do Windows a partir de executável

349

Existe alguma maneira rápida de, dado um arquivo executável, criar um serviço do Windows que, quando iniciado, o inicia?

Latorre alemão
fonte
8
Aqui estão as instruções da Microsoft sobre como conseguir isso.
PiRX

Respostas:

460

Para criar um serviço do Windows a partir de um executável, você pode usar sc.exe:

sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"

Você deve ter aspas no execaminho real e um espaço após o binPath=.

Mais informações sobre o sccomando podem ser encontradas no Microsoft KB251192 .

Observe que ele não funcionará para nenhum executável: o executável deve ser um serviço do Windows ( ou seja, implementar o ServiceMain ). Ao registrar um executável que não seja de serviço como um serviço, você receberá o seguinte erro ao tentar iniciar o serviço:

Erro 1053: O serviço não respondeu à solicitação de início ou controle em tempo hábil.

Existem ferramentas que podem criar um serviço do Windows a partir de executáveis ​​arbitrários que não são de serviço; consulte as outras respostas para exemplos de tais ferramentas.

Sergii Pozharov
fonte
11
você (quase certamente) tem que executar o prompt de comando como administrador para que esse comando funcione
Jeutnarg
2
O caminho também precisa ser o caminho completo - não foi possível iniciar meu serviço usando um caminho relativo.
RunOfTheShipe
4
o espaço depois de binpath=ter que colocar o caminho do executável entre aspas duplas está totalmente errado, pelo menos para o Windows 10. a citação é necessária se e somente se o caminho contiver caracteres especiais como espaço em branco. Além disso, o revestimento (lowe / maiúsculas / minúsculas) não importa em lugar algum, também nos nomes de variáveis, e displayname="my service"é outro item a ser transmitido na linha de comando ao criar um serviço para exibir como a primeira linha ( Name) em services.msc.
2
O espaço depois binPath=foi necessário para mim no Windows 7, mas não no Windows 10
datchung
242

Use o NSSM ( o Gerenciador de serviços que não é de sucção ) para executar um arquivo .BAT ou qualquer arquivo .exe como um serviço.

http://nssm.cc/

  • Etapa 1 : Faça o download do NSSM
  • Etapa 2 : instale seu serviço comnssm.exe install [serviceName]
  • Etapa 3 : Isso abrirá uma GUI que você usará para localizar seu executável
Kevin Tong
fonte
6
Melhor gerente de serviço de todos os tempos. Até consegui instalar o PlexWatch como um serviço usando o NSSM.
Imperative
2
este conjunto é um serviço para sempre? sempre que o Windows iniciar, o serviço será iniciado? Além disso, como posso fazer isso sem a interação do usuário? um script ou código de algum tipo?
John Demetriou
9
Isso é absolutamente ótimo, eu gostaria de poder aceitar esta resposta em vez da primeira, :-(
German Latorre 7/15
2
Eu posso executar o Dropbox como um serviço no servidor. Absolutamente uma ferramenta não sugadora!
Barry Guvenkaya
11
O arquivo exe deve ser um projeto de serviço do Windows, para poder trabalhar com o nssm ou pode ser um arquivo exe normal?, Porque quando eu uso o nssm start [servicename], ele mostra um erro como, o serviço do Windows não pode ser executado a partir de prompt de comando etc.
Sanjeev
92

Extensão da resposta (Kevin Tong).

Etapa 1: Baixar e descompactar nssm-2.24.zip

Etapa 2: Na linha de comando, digite:

C:\> nssm.exe install [servicename]

ele abrirá a GUI como abaixo (o exemplo é o servidor UT2003) e simplesmente navegue até: yourapplication.exe

insira a descrição da imagem aqui

Mais informações em: https://nssm.cc/usage


fonte
4
Sintaxe correta nssm.exe install [serviceName]. Essa solução funciona, mas se você tiver um aplicativo GUI, não funcionará no Win Serever2003. Se mais tarde você quiser removê-lo, usenssm.exe remove [youservicename]
Hammad Khan
11
Estou assumindo que a referência ao nginx é porque esse é o programa específico que você deseja executar como um serviço? Até que eu vi o comentário do hmd acima, pensei que você estava tentando ajudar, sugerindo que o nginx era uma dependência necessária para instalar ou algo assim ... mas, na GUI, parece que você não está instalando o nginx, está instalando um torneio irreal servidor? Apenas salientando que o exemplo é inconsistente e potencialmente enganoso. Um simples "Suponha que você deseje instalar o nginx como um serviço, então seria assim:" ajudaria.
precisa saber é o seguinte
@ flutefreak7 sim, nginxnão é necessário e enganoso. O comando funcionará sem ele também. É um parâmetro opcional se você deseja fornecer o nome do serviço no prompt de comando.
Hammad Khan
11
Quando tento usar o nssm, meu Windows Forms está em execução, mas o formulário não é mostrado ... Por que?
Radenko Zec
Está rodando seu aplicativo como serviço do Windows, a maioria é para back-end. Também pode estar funcionando como outro nome de usuário root / admin. você tem que verificar. Também há mais informações que você pode conferir aqui: nssm.cc/usage
16

Muitas respostas existentes incluem intervenção humana no momento da instalação. Este pode ser um processo propenso a erros. Se você tem muitos executáveis ​​desejados para serem instalados como serviços, a última coisa que você quer fazer é executá-los manualmente no momento da instalação.

No cenário descrito acima, criei o serman , uma ferramenta de linha de comando para instalar um executável como serviço. Tudo o que você precisa escrever (e escrever apenas uma vez) é um arquivo de configuração de serviço simples, juntamente com o seu executável. Corre

serman install <path_to_config_file>

instalará o serviço. stdoute stderrestão todos registrados. Para mais informações, consulte o site do projeto .

Um arquivo de configuração de trabalho é muito simples, como demonstrado abaixo. Mas também possui muitos recursos úteis, como <env>e <persistent_env>abaixo.

<service>
  <id>hello</id>
  <name>hello</name>
  <description>This service runs the hello application</description>

  <executable>node.exe</executable>

  <!-- 
       {{dir}} will be expanded to the containing directory of your 
       config file, which is normally where your executable locates 
   -->
  <arguments>"{{dir}}\hello.js"</arguments>

  <logmode>rotate</logmode>

  <!-- OPTIONAL FEATURE:
       NODE_ENV=production will be an environment variable 
       available to your application, but not visible outside 
       of your application
   -->
  <env name="NODE_ENV" value="production"/>

  <!-- OPTIONAL FEATURE:
       FOO_SERVICE_PORT=8989 will be persisted as an environment
       variable to the system.
   -->
  <persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>
KFL
fonte
9

esses extras são úteis .. precisam ser executados como administrador

sc create  <service_name> binpath=<binary_path>
sc stop    <service_name>
sc queryex <service_name>
sc delete  <service_name>

Se o nome do seu serviço tiver espaços, coloque "aspas".

PodTech.io
fonte
Não existe são INSTALAR comando nem na minha Meu Win 2003 sc.exe 5.2.3790.3959, nem no M $ F1
user6698332
11
Use "create" em vez de "install". sc create <service_name> binpath= <binary_path>
CSquared 10/10/19
4

Eu testei um bom produto para isso: AlwaysUp . Não é gratuito, mas eles têm um período de avaliação de 30 dias para que você possa experimentá-lo ...

A. Masson
fonte
0

Você pode conferir meu pequeno utilitário gratuito para obter as operações de criação, edição e exclusão de serviços. Aqui está o exemplo de criação:

Vá para Serviço -> Modificar -> Criar

insira a descrição da imagem aqui

Arquivo executável (google drive): [Download]

Código fonte: [Download]

Postagem no blog: [BlogLink]

Classe do editor de serviço: WinServiceUtils.cs

Sergey Vaulin
fonte