Developpez.com - WinDev
X

Choisissez d'abord la catégorieensuite la rubrique :


Création d'un service Nt

Date de publication : 27 novembre 2008

Par Jean Luc Baptiste (www.btsig.org)
 

Création d'un service Nt (19 méga) Création de procédures globales. Création connexion FTP. Lecture de fichiers texte. Recherche de processus en mémoire. Arrêt de processus.


Ce nouveau cours va vous permettre de créer un service Nt.

WB01071_ Les services NT vous permettent de créer des programmes qui démarrent en même temps que Windows NT (avant l'ouverture de la session).

L'intérêt d'un service Nt est qu'il s'exécute avant l'ouverture de la session de l'utilisateur. Imaginez un instant que malgré vos remarques vos enfants continuent à utiliser des logiciels de téléchargement de type pair To pair (Lphant, Emule, kazaa..). Après les menaces, les injonctions, rien à faire, ils continuent à utiliser les softs à votre insu (ça sent le vécu !).

Comme vous êtes excédé, vous décidez de créer un service Nt qui fermera automatiquement et quasiment immédiatement les programmes incriminés, non, mais ! C'est qui qui commande ?!

WB01071_ Ce support est réalisé avec WinDev 12, mais la procédure est identique pour les versions antérieures.

Nous allons créer un nouveau projet nommé tp12.

Cliquez sur Fichier puis Nouveau.

im1.bmp
Ensuite, dans le carrousel choisissez Projet (L'immense P jaune) :

im2.bmp
L'assistant ouvre la première fenêtre de dialogue :

im3.bmp
Saisissez les informations « Tp11 » dans le champ Nom du projet : et un résumé si vous le désirez ensuite cliquez sur le bouton symbolisant Suivant.


Voici le nouvel écran :

im4.bmp
Comme nous n'avons aucun document à ajouter, nous pouvons cliquer sur Suivant.

im5.bmp
Ici, l'assistant nous demande ce que nous voulons réaliser, le choix par défaut « Exécutable (.exe) » nous convient, cliquons sur le bouton Suivant.

im6.bmp
Le choix par défaut « Plate-forme Windows » nous convient, cliquons sur Suivant.

im7.bmp
Ici, vu la modestie de notre projet, nous allons rien modifier à cet écran et passer directement au suivant.

im8.bmp
Là non plus, nous n'avons rien à indiquer, hop suivant !

im9.bmp
Ici, indiquez que vous travaillez seul et cliquez sur Suivant.

im10.bmp
Nous n'allons pas utiliser le gestionnaire de sources, un clic sur Suivant.

im11.bmp
Nous n'allons pas demander à WinDev de préfixer nos variables et autres objets, choisissez le choix « Non, ne pas utiliser de charte de programmation » et Suivant.

im12.bmp
Un Service Nt ne comportant aucune fenêtre, ni objet graphique choisissez « Aucune » dans la liste des chartes graphiques puis un clic sur Suivant.

im13.bmp
Comme je viens de vous le dire notre projet ne comportera aucune fenêtre, donc cliquez juste sur Suivant.

im14.bmp
Notre projet ne gérera aucune autre langue que le français, vous pouvez cliquer directement sur le bouton Suivant.

im15.bmp
Nous n'utiliserons pas de base de données, sélectionnez ce choix-là et cliquez sur le bouton Suivant.

im16.bmp

Nous voici arrivé à la fin de l'assistant vous pouvez cliquer sur le Jet vert.

im17.bmp
WinDev nous demande ce que l'on veut réaliser, cliquez sur « Aller directement dans l'éditeur de WinDev »


Si vous êtes sous le tableau de bord :

im18.bmp
Cliquez sur l'icône « Afficher le graphe du projet »:

im19.bmp
Un service Nt WinDev doit avoir 3 procédures globales pour pourvoir fonctionner :

Nous allons créer la première « InitService » :

im20.bmp
Dans la zone inférieure de l'éditeur, cliquez sur l'onglet du code, puis sur « Procédures Globales ». Enfin, faites un clic avec le bouton droit de la souris, dans la zone de droite pour faire apparaître le menu contextuel suivant.


Cliquez sur « Nouvelle procédure globale » et nommez là « InitService ».


Faites de même pour « Service » et pour « FinService ».


Voici le résultat attendu :

im21.bmp
Au niveau du projet nous avons besoin de créer des variables globales pour cela cliquez sur « Projet » puis « Code du Projet ».

im22.bmp
Vous voici dans l'éditeur de code du projet :

im23.bmp
Dans la zone « Initialisation de Tp11 » saisissez ceci :

im24.bmp
Nous avons deux booléens qui nous donnerons des renseignements sur l'état du service, une variable de type chaine de caractère qui contiendra le contenu du fichier des programmes interdits et un autre booléen « rec » qui nous indiquera si le fichier texte à bien été récupéré.


Nous allons maintenant créer une procédure globale qui nous permettra de récupérer le fichier texte sur un serveur Ftp.


Pourquoi utiliser un serveur Ftp ?


La nouvelle procédure globale va s'appeler « recupdonnees »

im25.bmp
Voici son contenu :

im26.bmp

La fonction FTPConnecte prend 6 paramètres :


FTPConnecte retourne un numéro de connexion qui doit être différent de -1 si la connexion au serveur FTP s'est bien déroulée.

La fonction FTPRécupére télécharge sur le serveur FTP le fichier demandé (ici pairtopair.txt) et le dépose dans le répertoire d'exécution (par FRepEncours).Cette fonction renvoie vrai si le téléchargement s'est bien passé, faux dans le cas contraire.


Si le téléchargement s'est bien déroulé, nous plaçons dans la chaine de caractère lefichier le contenu du fichier « pairtopair.txt » que voici :

im27.bmp

Ceux qui n'ont pas de serveur FTP peuvent créer un fichier texte nommé pairtopair.txt et le placer dans le répertoire Windows de la machine à contrôler et modifier la procédure de la façon suivante :

im28.bmp

Récapitulons :


Vous avez codé la procédure « recupdonnées », crée un dossier nommé « pairtopair » sur votre serveur FTP et déposé dans celui-ci le fichier « pairtopair.txt » contenant la liste des programmes dont vous ne voulez pas l'exécution sur vos ordinateurs.


Ou alors :


Vous n'avez pas de serveur FTP et vous avez codé la procédure « recupdonnées » simplifiée et avez crée le fichier « pairtopair.txt » que vous avez déposé ou que vous déposerez plus tard sur la machine hôte dans le dossier « System32 » de « Windows ».


À partir de maintenant il nous reste à coder les 3 procédures obligatoires. Commençons par « InitService » :

im29.bmp
Il n'y a pas beaucoup de code. En fait, nous allons mettre notre booléen pour indiquer que le service est activé.


Continuons par « Finservice ».

im30.bmp
Ben oui ! Elle est obligatoire, mais il n'est pas obligatoire d'y mettre quoi que ce soit !


Nous finissons par la procédure globale « Service »

im31.jpg

Quelques commentaires sur le code :


Le début du programme indique que le service est en cours d'exécution grâce au booléen gbServiceEnCours.


Si le service n'est pas démarré alors, on relance l'initialisation du service.


Si rec = faux alors on relance la procédure de récupération du fichier texte.


Si le service est démarré alors, nous allons placer dans la chaine « lesprocess » l'ensemble des processus actifs en mémoire grâce à la fonction ExeListeProcessus. Les processus sont séparés, dans la chaine, par des retours chariot (RC)


Si la chaine lesprocess est différente de chaine vide alors

Pour toute sous chaine « processus » de la chaine « lesprocess » séparée par des retours chariot, on recherche si cette sous-chaine existe dans la liste des fichiers interdits inscrits dans la chaine contenant le fichier texte. La recherche d'une sous chaine dans une chaine se réalise avec la fonction ChaineOccurrence (qui renvoie le nombre de fois ou cette sous-chaine a été trouvée.


Si la sous-chaine a été trouvée, on récupère le process identifiant dans la variable « lepid ».


Le pid (Process identifiant ou l'identifiant du processus) identifie de manière unique le processus en mémoire.


Une fois que l'on a son numéro, il ne reste plus qu'à donner l'ordre à Windows de le tuer avec la fonction ExeTermine(numéro pid).


Voilà la partie codage est quasiment finie. Il nous faut maintenant régler quelques détails techniques.


Création de la bibliothèque.


Il est impératif de créer la bibliothèque de l'application. Pour cela cliquez sur le menu « Atelier » puis « Bibliothèque » puis « Générer la bibliothèque ».

im31.jpg

Un assistant ce met en route, suivons le ensemble. Voici la première fenêtre :

im32.jpg
Comme notre projet est à vocation à être unique cliquez sur « Non ».

im33.jpg

Cliquez sur le bouton « Suivant ».

im34.jpg
Ici, WinDev nous montre les éléments intégrés à la bibliothèque et le lieu ou elle va être créée. Cliquez sur « Suivant ».

im35.jpg
Pour les langues de la bibliothèque le choix proposé par défaut est le bon, cliquez sur « Suivant ».

im36.jpg
Ici, vous pouvez vous faire plaisir en inscrivant ce que vous voulez, puis cliquez sur « Suivant ».

im37.jpg

Comme nous avons déclaré être seul développeur du projet le choix proposé par défaut est correct. Cliquez sur « Suivant ».

im38.jpg

Ici, j'ai indiqué que la bibliothèque ne prendrait pas en compte les patchs, notre applicatif est régénérable intégralement. Cliquez sur « Suivant »

im39.jpg

Voilà, nous sommes arrivés à la fin de l'assistant, il ne reste plus qu'a cliquer sur le jet vert.


Allons jeter un coup d'oil au répertoire de l'applicatif. Pour cela rendez-vous dans le répertoire « Exe » du l'applicatif.

im40.jpg
La bibliothèque est correctement créée. Maintenant il va falloir créer un fichier ini dans ce répertoire. En voici le contenu :

im41.jpg
Pour créer le fichier ini ouvrez un éditeur de texte, saisissez le texte tel qu'au-dessus et enregistrez-le en « WDSERVICE.INI ».


Il nous faut copier ensuite un programme fourni par Pc-Soft qui permet d'inscrire le service dans Windows.


Aller dans le répertoire de votre WinDev, puis dans le dossier Exemples, puis dans le dossier Exemples complets. Dans la liste des exemples, recherchez celui nommé WD Service NT. A l'intérieur vous trouverez 2 répertoires cliquez sur « WD Service NT » puis sur « Exe ». Copiez le programme nommé « WDSERVICE.EXE » dans le répertoire « exe » de notre application « Tp11 ».


Voici a présent le contenu du dossier « exe » du projet « Tp11 ».

im42.jpg
Pour que le programme fonctionne, il faut aussi rajouter le Framework WinDev dans ce dossier. On ne va pas s'embêter à trier les bonnes dll des autres, nous allons toutes les copier. Pour cela allez dans le dossier Programme de votre WinDev et copier toutes les dll WD****.dll, remplacez les 2 premières étoiles par la version de WinDev que vous utilisez. Ensuite copiez l'ensemble dans le dossier « Exe » de « Tp11 ».

im43.jpg
Voilà une capture écran de ce qui y a dans le dossier « exe » de « Tp11 ». Notez bien que beaucoup de ces dll ne sont pas nécessaires, mais plutôt que de passer du temps à rechercher que celle réellement utilisée par le programme la méthode utilisée a été une méthode empirique.


Installation du service :


Pour installer le service, rien de plus simple. Imaginons que vous copiez l'ensemble du répertoire « Exe » dans un dossier d'une clé usb. Imaginons que le dossier de la clé usb se nomme « Tp11 » et que votre clé apparaisse au niveau de l'ordinateur avec la lettre de volume « F ».

Cliquez sur « Démarrer », puis « Exécuter » et ensuite frappez la séquence de touche suivante « f:\Tp11\WDSERVICE.EXE -install » et validez en cliquant sur le bouton « Ok ».


Ouvrez maintenant le gestionnaire de service vous devriez voir apparaître votre service, vérifiez qu'il soit démarré. Si ce n'est pas le cas, démarrez-le.

im43.jpg
Voilà, à partir de maintenant dès qu'un programme de la liste se lancera votre service le tuera aussitôt.


Pour enlever le service, il suffit de saisir :


« f:\Tp11\WDSERVICE.EXE -remove »


C'est fini, merci de m'avoir accompagné jusque-là.



Valid XHTML 1.1!Valid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2008 Jean Luc Baptiste. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Contacter le responsable de la rubrique WinDev