我們有一個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;
}
感謝和問候...
Windows Vista及更高版本包含明確防止此類行爲的安全功能。即,所有服務在會話0中運行,不再允許顯示在屏幕上。看起來你在這裏有一個矯枉過正的問題 - 爲什麼不使用Windows任務計劃程序來完成此任務? – 2010-03-03 21:10:06
我不能使用「Windows任務計劃程序」,因爲我想觸發應用程序啓動並使用sc命令的窗口遠程停止。 – vcosk 2010-03-03 21:19:38