2010-03-03 5 views
1

우리는 일부 초기화 구성을 포함하는 배치 스크립트를 통해 시작되는 원격 Windows 시스템에서 실행되는 서버로 실행되는 Java 응용 프로그램을 보유하고 있습니다.일괄 스크립트를 Windows 서비스로 실행

매번 시스템에 로그인하는 것을 피하고 서비스를 시작/중지하려면 해당 배치 스크립트를 "Windows 서비스"로 추가하고 명령 프롬프트를 통해 원격으로 사용하려고했습니다. 몇 번의 시도가 실패한 후에는 제 3 자 소프트웨어를 사용하지 않고도 소프트웨어 사용 제한을 사용하지 못하게하는 간단한 방법이 없다는 것을 알게되었습니다.

해결책으로 저는 서비스로 추가하여 사용할 수있는 C/C++ 프로그램을 작성했습니다. 프로그램 작업 파일. 이제이 코드를 사용하여 배치 스크립트 (system() 메서드 사용)를 실행하려고하지만 배치 스크립트가 실행되지 않습니다. 독립 실행 형 모드에서는 정상적으로 작동합니다.

는 의례 : http://www.devx.com/cplus/Article/9857

친절하게 문제를 정류 나에게 도움이됩니다.

배치 스크립트 :

batscr.bat


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

을 ============================= ===================

독립 C 프로그램이 배치 스크립트

에게 BatchExe.cpp


#include 
#include 

void main() 
{ 
    system("C:\\MyServices\\batscr.bat"); 
} 
0 실행할 서비스

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; 
} 

감사 및 감사에 대한

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

프로그램 ...

+0

Windows Vista 이상에는 명시 적으로 이러한 종류의 동작을 방지하는 보안 기능이 포함되어 있습니다. 즉, 모든 서비스가 더 이상 화면에 표시 할 수없는 세션 0에서 실행됩니다. 여기에 잔인한 문제가있는 것 같습니다. Windows 작업 스케줄러를 사용하여이 작업을 수행하는 것이 어떻습니까? –

+0

"Windows 작업 스케줄러"를 사용하여 응용 프로그램 시작을 트리거하고 Windows의 sc 명령을 사용하여 원격으로 중지하려고합니다. – vcosk

답변

1

이 꽤 일반적인 문제입니다 ... 당신에게 약간 Link here

도움이 될 수 있습니다.

+0

제안 해 주셔서 감사합니다. 먼저 시도했지만 응용 프로그램의 시작은 배치 파일을 통해 이루어져야하며 java 프로그램은 초기 구성을 수행해야하므로 직접 호출 할 수 없습니다. – vcosk

관련 문제