2010-03-03 7 views
1

Nous avons une application Java qui s'exécute sous la forme d'un serveur s'exécutant sur un système Windows distant qui est démarré via un script batch qui inclut des configurations d'initialisation.Exécution d'un script batch en tant que service Windows

Pour éviter de vous connecter au système à chaque fois et de démarrer/arrêter le service, j'ai projeté d'ajouter ce script batch en tant que "Service Windows" et de l'utiliser à distance via l'invite de commande. Après un certain nombre de tentatives infructueuses, j'ai appris qu'il n'y avait pas de moyen simple de le faire sans utiliser un logiciel tiers dont je ne suis pas autorisé à utiliser les restrictions d'utilisation du logiciel.

En tant que solution, j'ai écrit un programme C/C++ qui peut être ajouté en tant que service et utilisé. Le programme fonctionne fichier. Maintenant, j'essaie d'exécuter un script batch [en utilisant la méthode system()] en utilisant ce code mais le script batch n'est pas exécuté. Où cela fonctionne bien en mode autonome.

Courtoisie: http://www.devx.com/cplus/Article/9857

bien vouloir me aider à rectifier le problème.

lot Script:

batscr.bat


ECHO Error Log Open >C:\MyServices\ERR.LOG 
ECHO Error 1 >>C:\MyServices\ERR.LOG 
ECHO Message 1 >>C:\MyServices\ERR.LOG 

============================= ===================

programme autonome C pour exécuter le script batch

BatchExe.cpp


#include 
#include 

void main() 
{ 
    system("C:\\MyServices\\batscr.bat"); 
} 

=======================

Programme pour le service

StartScript.cpp



#include 
#include 
#include 

#define SLEEP_TIME 5000 
#define LOGFILE "C:\\MyServices\\memstatus.txt" 

SERVICE_STATUS ServiceStatus; 
SERVICE_STATUS_HANDLE hStatus; 

void ServiceMain(int argc, char** argv); 
void ControlHandler(DWORD request); 
void InitService(); 
void main() 
{ 
    SERVICE_TABLE_ENTRY ServiceTable[2]; 
    ServiceTable[0].lpServiceName = "StartScript"; 
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; 

    ServiceTable[1].lpServiceName = NULL; 
    ServiceTable[1].lpServiceProc = NULL; 
    // Start the control dispatcher thread for our service 
    StartServiceCtrlDispatcher(ServiceTable); 
} 


void ServiceMain(int argc, char** argv) 
{ 
    int error; 

    ServiceStatus.dwServiceType  = SERVICE_WIN32; 
    ServiceStatus.dwCurrentState  = SERVICE_START_PENDING; 
    ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; 
    ServiceStatus.dwWin32ExitCode  = 0; 
    ServiceStatus.dwServiceSpecificExitCode = 0; 
    ServiceStatus.dwCheckPoint   = 0; 
    ServiceStatus.dwWaitHint   = 0; 

    hStatus = RegisterServiceCtrlHandler(
     "StartScript", 
     (LPHANDLER_FUNCTION)ControlHandler); 
    if (hStatus == (SERVICE_STATUS_HANDLE)0) 
    { 
     // Registering Control Handler failed 
     return; 
    } 
    // Initialize Service 
    InitService(); 

    // We report the running status to SCM. 
    ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
    SetServiceStatus (hStatus, &ServiceStatus); 



    return; 
} 

// Service initialization 
void InitService() 
{ 
    system("C:\\MyServices\\batscr.bat"); 
    return; 
} 

// Control handler function 
void ControlHandler(DWORD request) 
{ 
    switch(request) 
    { 
     case SERVICE_CONTROL_STOP: 
      ServiceStatus.dwWin32ExitCode = 0; 
      ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
      SetServiceStatus (hStatus, &ServiceStatus); 
      return; 

     case SERVICE_CONTROL_SHUTDOWN: 
      ServiceStatus.dwWin32ExitCode = 0; 
      ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
      SetServiceStatus (hStatus, &ServiceStatus); 
      return; 

     default: 
      break; 
    } 

    // Report current status 
    SetServiceStatus (hStatus, &ServiceStatus); 

    return; 
} 

Merci et salutations ...

+0

Windows Vista et versions supérieures contiennent des fonctionnalités de sécurité qui empêchent explicitement ce type de comportement. A savoir, tous les services s'exécutent dans la session 0, qui n'est plus autorisée à s'afficher à l'écran. Il semble que vous ayez un problème d'overkill ici - pourquoi ne pas utiliser le planificateur de tâches de Windows pour accomplir ceci? –

+0

Je ne peux pas utiliser "Windows Task Scheduler" car je veux déclencher le démarrage de l'application et arrêter à distance en utilisant la commande sc de Windows. – vcosk

Répondre

1

cela peut vous aider un peu Link here

... il est tout à fait un problème commun.

+0

Merci pour la suggestion, j'ai essayé ceci en premier, mais le démarrage de l'application doit se faire par fichier batch et le programme java ne peut pas être appelé directement car certaines configurations initiales doivent être faites :(. – vcosk

Questions connexes