Accueil > > > SERVICE WINDOWS POUR MAINTENIR SA CONNEXION INTERNET
SERVICE WINDOWS POUR MAINTENIR SA CONNEXION INTERNET
Information sur la source
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
- //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;
- }
//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
Historique
- 22 novembre 2004 19:33:38 :
- Correction d'une erreur sur la déclaration des Handle qui generarait le msg a la compile :
Connexion.cpp: In function bool InstallService():
Connexion.cpp:176: error: invalid conversion from void* to SC_HANDLE__*
Connexion.cpp:181: error: invalid conversion from void* to SC_HANDLE__*
Connexion.cpp: In function bool DeleteService():
Connexion.cpp:200: error: invalid conversion from void* to SC_HANDLE__*
ds la fonction Installservice :
bool InstallService()
{
char strDir[1024];
SC_HANDLE schSCManager,schService;.....
}
et ds la fonction DeleteService :
bool DeleteService()
{
SC_HANDLE schSCManager;
SC_HANDLE hService;....
}
- 22 novembre 2004 19:38:18 :
- Retire le MessageBox
- 22 novembre 2004 19:54:32 :
- Rajout la creation d'un fichier test.txt qui ecrit test a chaque execution de la fonction principal a des fin de debuggage pour mieux voir ce qui ce passe
- 22 novembre 2004 20:05:04 :
- Ajout du projet DEC C++ au format zip
- 28 mars 2005 09:23:12 :
- Ajout de commentaire pour une meilleurs compréhension.
Ajout de la source pour Microsoft Visual C++
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|