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 ...
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? –
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