(modifié le 2 février 2013 à 17:04)

Edit 05/11/2011 : je vous conseille ServiceRunner qui est compatible Win7

Cet article concerne exclusivement Windows (NT/2K/XP)

But : exécuter/convertir un programme en (.exe) habituellement lancé à la main (ou au démarrage windows par exemple) en tant que service.

Avant de passer dans la partie configuration, un peu d'explications et de définitions...

Un programme c'est quoi ?

c'est un fichier *.exe (exécutable) Windows, il est souvent compilé. Ainsi Notepad, Firefox, Windows Live Messenger... et tout autre logiciel de manière générale est en fait composé d'un programme.

Et un service alors ?


un service est assimilable à un programme, mais son mode de fonctionnement est bien différent. En effet, le proprietaire d'un service n'est pas celui dont la session Windows est ouverte (c.à.d vous) mais un utilisateur virtuel appelé "SYSTEM". Vous vous en rendrez compte en allant dans la liste de processus après un CTRL+ALT+SUPPR.
"WINLOGON.EXE" par exemple, est le service qui génère un peu à près le démarrage de Windows la liste des utilisateurs (vous savez avec les icônes par defaut, le ballon de foot, le cheval, etc...) :

Processus WINLOGON.EXE (proprietaire SYSTEM)

Et la différence entre un programme et un service alors ?


La principale différence c'est effectivement le proprietaire. Et c'est là ou cela devient interessant : un service SYSTEM démarre avant l'authentification Windows (= le logon). Ce qui veut dire qu'un service tourne dès le démarrage du PC, sans intervention et reste complètement indépendant de l'utilisateur qui si'identifiera sur le PC, il est donc commun au système. De plus un service est beaucoup plus stable qu'un programme qui fonctionne car il a une priorité plus élevée par rapport à un simple programme et n'est pas géré de la même façon par Windows.

Personnellement j'ai eu besoin de ce genre de manipulation tout simplement car mon routeur ne me permet pas de rediriger un port vers un autre. J'ai un tout petit soft gratuit qui le fait, mais il ne se lance qu'une fois logué et comporte l'inconvénient suivante : si je le ferme il stoppe le routage... garder un programme en barre des tâches n'est pas non plus le top, dans le systray c'est déjà mieux mais sur ce logiciel pas prévu :(
Comme je souhaitais rediriger un port qui me permet de prendre la main sur mon PC à distance il était impératif qu'il démarre tout seul avant le login Windows (vous suivez :p).

Je vais donc prendre l'exemple de Smallrouter mais les manipulations resterons valables pour tout programme exécutable.

Préparation des répertoires et des fichiers necessaires :

  1. créer un répertoire à la racine de C:/ qui contiendra votre programme en .exe (ici C:/smallrouter)
  2. copier dans le répertoire votre programme, ici smallrouter.exe ainsi que son fichier de configuration (ici ports.dsr mais ce fichier est facultatif et ne pose aucun problème si votre programme n'en necessite pas)
  3. Deux fichierssont nécessaires et propres à Windows (il permettront la création du service). Pour cela 2 options s'offrent à vous :

Création et enregistrement du service

Ouvrez l'invite de commande MS-DOS (démarrer > exécuter > CMD > OK)

Etape 1 : Déclaration de SRVANY.EXE en tant que service NT grâce à INSTSRV.EXE

syntaxe : instsrv [nom_service] [chemin_programme]

Etape 1 instsrv smallrouter “C:/smallrouter/smallrouter.exe”
Pour notre exemple : instsrv smallrouter "C:/smallrouter/smallrouter.exe"

Etape 2 : Vérifiez que le service a bien été ajouté en consultant la liste des services (démarrer > éxecuter > services.msc > OK)

Vérification de l’existance du service dans la console Windows services.msc
Notre service "smallrouter" est bien présent

Etape 3 : modification du chemin "ImagePath" dans le registre:

  1. Ouvrez l'entrée de la base de registre (démarrer > exécuter > regedit > OK)
  2. Placez vous dans l'arborescence HKLM\SYSTEM\CurrentControlSet\Services\smallrouter (ou bien le nom de votre service s'il s'appelle autrement)

Modification regedit de chemin de la variable “ImagePath”

Modifier la valeur de l'entrée "ImagePath" en C:\windows\system32\srvany.exe
(Elle doit être le chemin complet vers SRVANY.EXE ; pensez à ajouter des guillemets si votre chemin contient des espaces)
Le service est désormais créé. Cependant si vous essayez de le démarrer maintenant vous recevrez un message d'erreur, c'est tout à fait normal.

Erreur au lancement du service (normal car le chemin de notre application n’est pas encore précisé)

Dans l'étape suivante nous allons indiquer où ce situe notre application, pour que lorsque le SCM lance SRVANY, ce dernier trouve notre application et le démarre correctement.

Etape 4 : Ajout d'une clé "Parameters":

  1. Naviguez jusqu'à la clé du service que vous venez de déclarer, ici : HKLM\SYSTEM\CurrentControlSet\Services\smallrouter
  2. Créez une clé "Parameters" (Edition > Nouveau > Clé)

Etape 5 : Ajout d'une valeur "Application":

  1. Ouvrez la clé "Parameters"
  2. Créez une clé "Application" de type chaîne (REG_SZ) dans la clé "Parameters" (Edition > Nouveau > Valeur > Chaine)
  3. Editez "Application" et déclarez-y le chemin complet vers notre exécutable. Si vous avez suivi nos prérequis ce chemin est "C:\smallrouter\smallrouter.exe". Nous précisons à Smallrouter notre fichier de règles qui doit être ouvert au lancement du logiciel ; la commande devient donc : "C:\smallrouter\smallrouter.exe" "C:\smallrouter\ports.dsr":

    Ajout de la chaine “Application”

Etape 6 : intéragir avec le bureau :
une fois le service lancé il est exécuté en arrière plan, de manière transparente visuellement. Afin de contrôler le lancement de votre service je vous invite à activer cette option la première fois. Le programme exécuté en tant que service apparaîtra ainsi de la même façon que si vous le lanciez manuellement en tant que simple programme.

  1. retournez dans la console de services (démarrer > éxecuter > services.msc > OK)
  2. double-cliquez sur le service en question "smallrouter" dans notre cas
  3. cliquez sur l'onglet "Connexion"
  4. cocher l'option"Autorisr le service à interagir avec le bureau" :

Activation de l’option “Interagir avec le bureau” afin de contrôle le bon lancement du service

  • Validez avec le bouton "OK"

 

Etape 7 : soufflez, c'est terminé ! le tutoriel est assez long car je souhaitai le rendre disponible au maximum d'entres vous, n'ayez pas peur du registre ça ne mort pas :)

Astuce

Pour lancer le service en ligne de commande : net start smallrouter
Pour stopper le service en ligne de commande : net stop smallrouter
Ainsi vous pouvez aisément faire un raccourci sur votre bureau pour le lancer ou l'arrêter en un clique de souris. Pour cela sur le bureau faîtes un clique-droit > Nouveau > Raccourci, entrez la cible suivante :
%systemroot%\system32\net.exe start smallrouter
(pour le lancement)
%systemroot%\system32\net.exe stop smallrouter (pour l'arrêt)

Pour retirer proprement le service Smallrouter de Windows définitivement utilisez la ligne de commande : "sc delete smallrouter"

N.B. : Pensez à décocher l'option de l'étape 6 si vous ne souhaitez pas visualiser le programme exécuté.

J'attends vos impressions, critiques et conseils :)

Documentation :
Création d'un service défini par l'utilisateur
Créer un service Windows à l'aide de Sc.exe
Lancer des applications avec le compte "Local System"
Création d'un service NT en VB5

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter