2010-03-03 168 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