우리는 일부 초기화 구성을 포함하는 배치 스크립트를 통해 시작되는 원격 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;
}
감사 및 감사에 대한
=======================
프로그램 ...
Windows Vista 이상에는 명시 적으로 이러한 종류의 동작을 방지하는 보안 기능이 포함되어 있습니다. 즉, 모든 서비스가 더 이상 화면에 표시 할 수없는 세션 0에서 실행됩니다. 여기에 잔인한 문제가있는 것 같습니다. Windows 작업 스케줄러를 사용하여이 작업을 수행하는 것이 어떻습니까? –
"Windows 작업 스케줄러"를 사용하여 응용 프로그램 시작을 트리거하고 Windows의 sc 명령을 사용하여 원격으로 중지하려고합니다. – vcosk