2010-03-03 139 views
1

我们有一个java应用程序,它运行在远程Windows系统上运行的服务器上,该系统通过包含一些初始化配置的批处理脚本启动。以Windows服务运行批处理脚本

为避免每次登录系统并启动/停止服务,我计划将该批处理脚本添加为“Windows服务”并通过命令提示符远程使用它。经过多次失败的尝试后,我才知道没有使用第三方软件,我不允许使用适当的软件使用限制的简单方法。

作为一种解决方案,我编写了一个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"); 
} 

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

计划服务

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任务计划程序来完成此任务? – 2010-03-03 21:10:06

+0

我不能使用“Windows任务计划程序”,因为我想触发应用程序启动并使用sc命令的窗口远程停止。 – vcosk 2010-03-03 21:19:38

回答

1

这可能会帮助你一点点 Link here

...这是一个相当普遍的问题。

+0

谢谢你的建议,我先试了一下,但启动的应用程序必须通过批处理文件发生,并且不能直接调用java程序,因为必须完成一些初始配置:(。 – vcosk 2010-03-03 21:11:02