Service windows pour maintenir sa connexion internet

Soyez le premier à donner votre avis sur cette source.

Vue 17 403 fois - Téléchargée 1 368 fois

Description

Le but de ce programme était avant tout la création d'un service. La programmation d'un service windows offre de nombreux avantage sur un programme classique. En tant que service le programme se lance automatiquement et sans action de l'utilisateur il est parfaitement invisible pour l'utilisateur. Il ne necessite pas d'être loggué sur le poste pour s'executer.
J'avais besoin d'avoir un programme très fiable et très légè et parfaitement invisible qui puisse tourner en permance même si l'ordinateur n'était pas logué sous windows, qui puisse faire certaine opération de façon cyclique. J'ai donc créé un service windows. Il est le fruit de mes recherches sur le net sur la programmation d'un service

Le code que je vous livre peut facilement être modifié pour faire d'autres opérations avec tous les avantages d'avoir un programme qui tourne en tant que service windows.

Ce code s'adresse à toutes les personnes qui disposent d'une connexion internet permante ou non et qui souhaite empècher celle ci d'être coupé au bout d'un certaint temps d'inactivité. Il provoque tous les x temps une connexion par le port 80 (HTTP) sur la page google, tout cela en arrière plant ss interaction avec l'utilisateur.
Cela permet soit d'éviter les deconnexions intempestives de certains FAI, soit d'empecher l'expiration du bail internet sur un réseau d'entreprise où l'accès à l'exterieur hors du réseau local est soumis à authentification.

pour installer le service :
mettre l'exe ds le rep ou vous souhaitez qu'il s'execute
ouvrez une fenetre DOS
en suite ds la fenetre DOS taper CD "c:\chemin_jusqu'au_fichier"
et pour finir connexion.exe -i pour l'installer

pour le desinstaller meme chose mais avec le paramètre -d pour le supprimé

Source / Exemple :


//Source developpé sous dev c++

//---------------------------------------------------------------------------

//Commande preprocesseur

#include <stdio.h>
#include <time.h>                        //Pour la fonction sleep
#include <winsock2.h>                    //Pour le client winsock

//Déclaration des variables
SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
bool bRunning=true;

//Déclaration des variable pour le client winsock
SOCKET s;
in_addr addr;
sockaddr_in sin;
hostent * host;
WSADATA wsa;
char buf[1024];
int octet = 0;

//Déclaration des fonctions
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceCtrlHandler(DWORD Opcode);
bool InstallService();
bool DeleteService();
int Action(void);
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//Fonction principal
//Analyse des arguments passé en paramètre.
//Si pas de paramètre passé en argument initialisation du service

int main(int argc, char* argv[])
{
    if(argc>1)
    {
        if(strcmp(argv[1],"-i")==0)  //Control de l'argument passé au prog
            {InstallService();}          //Rien lancement du service
                                     //-i pour enregistement du service

        if(strcmp(argv[1],"-d")==0)  //-d pour désactivation du service
            {DeleteService();}
        }
    else
    {
        //Si pas d'argument :
        //déclaration du service et démarrage dans ServiceMain()
        SERVICE_TABLE_ENTRY DispatchTable[]={{"Connexion",ServiceMain},{NULL,NULL}};
        StartServiceCtrlDispatcher(DispatchTable);
    }
    return 0;
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//Fontion principal où se situe le code que le service execute

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{

    //Déclaration des variables
	DWORD status;
    DWORD specificError;

    m_ServiceStatus.dwServiceType        =SERVICE_WIN32;
    m_ServiceStatus.dwCurrentState       = SERVICE_START_PENDING;
    m_ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP;
    m_ServiceStatus.dwWin32ExitCode      = 0;
    m_ServiceStatus.dwServiceSpecificExitCode = 0;
    m_ServiceStatus.dwCheckPoint         = 0;
    m_ServiceStatus.dwWaitHint           = 0;

    m_ServiceStatusHandle = RegisterServiceCtrlHandler("Connexion",ServiceCtrlHandler);
    if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
    {
        return;
    }

    m_ServiceStatus.dwCurrentState       = SERVICE_RUNNING;
    m_ServiceStatus.dwCheckPoint         = 0;
    m_ServiceStatus.dwWaitHint           = 0;
    if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
    {

    }

    bRunning=true;

	//C'est la qu'il faut mettre les commandes qui s'éxécuteront pendant tout le temps ou le service fontcionne
    while(bRunning)
    {
        //Commande que le service execute
        //les 4 ligne du dessous servent juste aà montrer que le service tourne et que tout les minutes il écrit test dans le fichier text
		FILE * log ;
        log = fopen ( "c:\\log.txt" , "a" ) ; 
        fprintf ( log , "test\n" ) ;
        fclose ( log ) ;
        Sleep(6000); //Le temps est en millisseconde, sert à temporiser l'action pour pas quelle s'execute en boucle
		//on peut aussi avoir une action qui se déclanche sur un évènement partculié
        Action(); //Fonction où mettre le code a executer
    }

    return;
}

//---------------------------------------------------------------------------
//Fonction de control de l'état du service

void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
    switch(Opcode)
    {
		//Si le service reçoit la commande de se mettre en pause
        case SERVICE_CONTROL_PAUSE:
            m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
            break;

        case SERVICE_CONTROL_CONTINUE:
            m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
            break;

        //Si le service reçoit la commande de stopper
		case SERVICE_CONTROL_STOP:
            m_ServiceStatus.dwWin32ExitCode = 0;
            m_ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
            m_ServiceStatus.dwCheckPoint    = 0;
            m_ServiceStatus.dwWaitHint      = 0;

            SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);
            bRunning=false; //donc la boucle plus haut ne s'effectura plus
            break;

        case SERVICE_CONTROL_INTERROGATE:
            break;
    }
    return;
}

//---------------------------------------------------------------------------
//Si l'argument est -i enregistement du service ici

bool InstallService()
{

    char strDir[1024];
    SC_HANDLE schSCManager,schService;

    GetCurrentDirectory(1024,strDir);
    strcat(strDir,"\\connexion.exe");
    

    schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

    if (schSCManager == NULL)
        return false;

    LPCTSTR lpszBinaryPathName=strDir;

    schService = CreateService(schSCManager,"Connexion","Connexion réseaux",
        SERVICE_ALL_ACCESS,     // Type d'acces
        SERVICE_WIN32_OWN_PROCESS, // Type de service
        SERVICE_AUTO_START,     // Pour le demarrage automatique
        SERVICE_ERROR_NORMAL,       // error control type
        lpszBinaryPathName,     // service's binary
        NULL,                       // no load ordering group
        NULL,                       // no tag identifier
        NULL,                       // no dependencies
        NULL,                       // Si null demarrer en tant que compte system
        NULL);                   // Mot de passe : null si demarrer en tant que system

    if (schService == NULL)
        return false;

    CloseServiceHandle(schService);

    return true;
}

//---------------------------------------------------------------------------
//Si l'argument est -d désactivation du service ici

bool DeleteService()
{
    SC_HANDLE schSCManager;
    SC_HANDLE hService;

    schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

    if (schSCManager == NULL)
        return false;

    hService=OpenService(schSCManager,"Connexion",SERVICE_ALL_ACCESS);

    if (hService == NULL)
        return false;

    if(DeleteService(hService)==0)
        return false;

    if(CloseServiceHandle(hService)==0)
        return false;
    else
        return true;
}

//---------------------------------------------------------------------------
//Fonction pour la connexion a internet

int Action(void)
{
WSAStartup(0x0202, &wsa);

s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
/*if(s == SOCKET_ERROR){
//printf("socket : %d\n", WSAGetLastError());
}

  • /
host = gethostbyname("www.google.fr"); //l'adresse du site (necessite winsock2.h et ws2_32.lib) memcpy(&addr, host->h_addr, host->h_length); sin.sin_family = AF_INET; sin.sin_port = htons(80); // HTTP sin.sin_addr = addr; if(SOCKET_ERROR == connect(s,(sockaddr*)&sin, sizeof(sin))){ //printf("connect : %d\n", WSAGetLastError()); } strcpy(buf, "GET http://www.google.fr HTTP/1.0\n\n"); // la requete http send(s, buf, strlen(buf), 0); octet = recv(s, buf, sizeof(buf), 0); closesocket(s); WSACleanup(); return 0; }

Conclusion :


La source est developé sous dev C++ (si qq pouvait la tanscrir sous borland ce serait gentil)
Il est très facile de modifier le nom de l'exe et du service (si necessaire faite moi signe si vous voyez pas comment)
Il est tès facile aussi de rajouter des commandes a executer (pareille faite moi signe)

Je ferais peut être certaine modif pour le rendre plus simple a utilisé notament l'installation du service qui pourait etre plus simple. L'instal necessite un reboot pour demarrer le service, la désinstallation ne supprime pas l'exe...
Si vous êtes interessé par ces petites modif faite moi signe si non pour mon usage perso il restera comme ca

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
lundi 15 mars 2010
Statut
Membre
Dernière intervention
18 juin 2012

svp j'ai une application qui a pour entrée un fichier de paramétrage config.ini et que je veux l'éxecuter en tant que service alors ou je peux mettre le code de mon application.
Messages postés
2
Date d'inscription
lundi 16 janvier 2012
Statut
Membre
Dernière intervention
18 avril 2012

Comment éviter ce genre de soucis sous VS2012?
1>------ Rebuild All started: Project: Service Windows, Configuration: Release Win32 ------
1>Build started 18/04/2012 09:32:15.
1>_PrepareForClean:
1> Deleting file "Release\Service Windows.lastbuildstate".
1>InitializeBuildStatus:
1> Touching "Release\Service Windows.unsuccessfulbuild".
1>ClCompile:
1> main.cpp
1>main.cpp(88): warning C4101: 'status' : variable locale non référencée
1>main.cpp(89): warning C4101: 'specificError' : variable locale non référencée
1>LINK : fatal error LNK1181: impossible d'ouvrir le fichier en entrée 'C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Lib\WS2_32.Lib'
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.95
======== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
Messages postés
2
Date d'inscription
lundi 16 janvier 2012
Statut
Membre
Dernière intervention
18 avril 2012

bonjour comment récupéré ton code sous VS2010 pro?
Messages postés
1
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
13 novembre 2007

EST IL POSSIBLE D'AVOIR L'EXECUTABLE SVP
MERCI D4AVANCE
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007

C'est bon, ca marche. Il faut activer la coche autoriser le service à interagir avec le bureau dans les propriétés du service ou mettre SERVICE_INTERACTIVE_PROCESS dans le 5° champ du CreateService. Merci à celui qui m'a aidé pour cela.
Afficher les 22 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.