Créer un service Windows à partir d'un exécutable

349

Existe-t-il un moyen rapide, à partir d'un fichier exécutable, de créer un service Windows qui, une fois démarré, le lance?

Latorre allemand
la source
8
Voici les instructions de Microsoft sur la façon d'y parvenir.
PiRX

Réponses:

460

Pour créer un service Windows à partir d'un exécutable, vous pouvez utiliser sc.exe:

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

Vous devez avoir des guillemets autour du exechemin réel et un espace après le binPath=.

Plus d'informations sur la sccommande peuvent être trouvées dans Microsoft KB251192 .

Notez qu'il ne fonctionnera pas pour n'importe quel exécutable: l'exécutable doit être un service Windows ( c'est-à-dire implémenter ServiceMain ). Lors de l'enregistrement d'un exécutable non-service en tant que service, vous obtiendrez l'erreur suivante en essayant de démarrer le service:

Erreur 1053: Le service n'a pas répondu à la demande de démarrage ou de contrôle en temps opportun.

Il existe des outils qui peuvent créer un service Windows à partir d'exécutables arbitraires non liés au service, voir les autres réponses pour des exemples de tels outils.

Sergii Pozharov
la source
11
vous devrez (presque certainement) exécuter l'invite de commande en tant qu'administrateur pour que cette commande fonctionne
Jeutnarg
2
Le chemin doit également être le chemin complet - je n'ai pas pu démarrer mon service en utilisant un chemin relatif.
RunOfTheShipe
4
l'espace après binpath=ainsi que d'avoir à entourer le chemin exécutable avec des guillemets doubles est totalement faux, au moins pour Windows 10. la citation est requise si et seulement si le chemin contient des caractères spéciaux comme des espaces. De plus, la casse (lowe / upper / mixed-case) n'a pas d'importance n'importe où, dans les noms de variables aussi, et displayname="my service"est un autre avantage à transmettre sur la ligne de commande lors de la création d'un service à afficher comme première ligne ( Name) services.msc.
2
L'espace après binPath=était requis pour moi sur Windows 7 mais pas sur Windows 10
datchung
242

Utilisez NSSM ( le non-Sucking Service Manager ) pour exécuter un fichier .BAT ou tout fichier .EXE en tant que service.

http://nssm.cc/

  • Étape 1 : Téléchargez NSSM
  • Étape 2 : installez votre service avecnssm.exe install [serviceName]
  • Étape 3 : Cela ouvrira une interface graphique que vous utiliserez pour localiser votre exécutable
Kevin Tong
la source
6
Meilleur gestionnaire de service jamais. J'ai même réussi à installer PlexWatch en tant que service en utilisant NSSM.
impératif
2
cet ensemble est-il un service pour toujours? chaque fois que Windows démarre, le service démarre? comment puis-je faire cela sans interaction avec l'utilisateur? un script ou un code quelconque?
John Demetriou
9
C'est absolument génial, j'aimerais pouvoir accepter cette réponse au lieu de la première, :-(
German Latorre
2
Je peux exécuter Dropbox en tant que service sur le serveur. Absolument un outil qui ne suce pas!
Barry Guvenkaya
1
Est-ce que le fichier exe doit être un projet de service Windows, pour pouvoir travailler avec NSSM ou il peut être un fichier exe normal? invite de commande, etc.
Sanjeev
92

Extension de la réponse (Kevin Tong).

Étape 1: Téléchargez et décompressez nssm-2.24.zip

Étape 2: à partir du type de ligne de commande:

C:\> nssm.exe install [servicename]

il ouvrira l'interface graphique comme ci-dessous (l'exemple est le serveur UT2003), puis parcourez-le simplement: yourapplication.exe

entrez la description de l'image ici

Plus d'informations sur: https://nssm.cc/usage


la source
4
Syntaxe correcte nssm.exe install [serviceName]. Cette solution fonctionne mais si vous avez une application GUI, elle ne fonctionnera pas sur Win Serever2003. Si vous souhaitez le supprimer ultérieurement, utiliseznssm.exe remove [youservicename]
Hammad Khan
1
Je suppose que la référence à nginx est parce que c'est le programme particulier que vous souhaitez exécuter en tant que service? Jusqu'à ce que je voie le commentaire de hmd ci-dessus, je pensais que vous essayiez d'aider en impliquant que nginx était une dépendance requise pour l'installation ou quelque chose ... mais dans l'interface graphique, il semble que vous n'installez pas nginx, vous installez un tournoi Unreal serveur? Je souligne simplement que l'exemple est incohérent et potentiellement trompeur. Un simple "Supposons que vous vouliez installer nginx en tant que service, alors cela ressemblerait à ceci:" aiderait.
flutefreak7
@ flutefreak7 oui nginxn'est pas nécessaire et trompeur. La commande fonctionnera également sans elle. Il s'agit d'un paramètre facultatif si vous souhaitez fournir le nom du service à partir de l'invite de commande.
Hammad Khan
1
Lorsque j'essaie d'utiliser nssm, mon Windows Forms est en cours d'exécution mais le formulaire n'est pas affiché ... Pourquoi?
Radenko Zec
Son exécution de votre application en tant que service Windows, la plupart sont pour le backend. Il se peut également que son fonctionnement soit un autre nom d'utilisateur root / admin. vous devez le vérifier. Vous trouverez également plus d'informations ici: nssm.cc/usage
16

De nombreuses réponses existantes incluent une intervention humaine au moment de l'installation. Cela peut être un processus sujet aux erreurs. Si vous souhaitez que de nombreux exécutables soient installés en tant que services, la dernière chose que vous voulez faire est de les faire manuellement au moment de l'installation.

Vers le scénario décrit ci-dessus, j'ai créé serman , un outil en ligne de commande pour installer un exécutable en tant que service. Tout ce que vous avez besoin d'écrire (et d'écrire une seule fois) est un simple fichier de configuration de service avec votre exécutable. Courir

serman install <path_to_config_file>

va installer le service. stdoutet stderrsont tous enregistrés. Pour plus d'informations, consultez le site Web du projet .

Un fichier de configuration de travail est très simple, comme illustré ci-dessous. Mais il possède également de nombreuses fonctionnalités utiles telles que <env>et <persistent_env>ci - dessous.

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

ces extras s'avèrent utiles .. doivent être exécutés en tant qu'administrateur

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

Si le nom de votre service comporte des espaces, placez-les entre "guillemets".

PodTech.io
la source
Il n'y a pas de commande INSTALL ni dans mon My Win 2003 sc.exe 5.2.3790.3959, ni dans M $ F1
user6698332
1
Utilisez "créer" au lieu de "installer". sc create <service_name> binpath= <binary_path>
CSquared
4

J'ai testé un bon produit pour ça: AlwaysUp . Pas gratuit mais ils ont une période d'essai de 30 jours pour que vous puissiez l'essayer ...

A. Masson
la source
0

Vous pouvez consulter mon petit utilitaire gratuit pour les opérations de création, de modification et de suppression de services. Voici un exemple de création:

Allez dans Service -> Modifier -> Créer

entrez la description de l'image ici

Fichier exécutable (google drive): [Télécharger]

Code source: [Télécharger]

Article de blog: [BlogLink]

Classe d'éditeur de service: WinServiceUtils.cs

Sergey Vaulin
la source