公司服務器在每天啟動時,並沒有登錄系統,因此想要運行特定的程序,只有把它作為Windows服務啟動
要求不修改原來的程序,但是又需要與SCM(服務控制管理器)通信,需要另建一個windows服務程序,讓其調用我們的目標程序
網上一些所謂可以把exe注冊為服務的工具(如srvinstw.exe, instsrv.exe, srvany.exe等)實際並沒有效果,或者說只對本身具有與SCM通信功能的程序有作用
以下為C#的windows服務實現
在ServiceBase的派生類中實現虛函數OnStart和OnStop即可
EventLog log = Thread thread = Process proc = exePath = log.Source = ; dir = ExeConfigurationFileMap map = map.ExeConfigFilename = dir + ; Configuration config = exePath = config.AppSettings.Settings[].Value; OnStart( (thread == thread = Thread(startExe); (proc != && ! proc.Kill(); (thread != && thread.ThreadState == thread.Abort(); proc = ProcessStartInfo startInfo = ProcessStartInfo(exePath); proc.StartInfo = }
1.啟動目標程序時候需要使用新線程,如果在service線程中啟動,會阻塞服務與SCM的通信,造成服務啟動失敗
2.OnStart和OnStop中所有可能拋出的異常都需要捕獲,否則啟動時如果有異常,則會提示服務啟動又停止了
3.啟動的目標程序只能以SYSTEM賬戶運行,因此看不到程序界面
4.服務程序也可使用C++實現,同樣最少實現OnStart和OnStop兩個虛函數即可
服務的安裝,兩個辦法:
1.編寫安裝/卸載程序,調用windows API中的函數,CreateService()和DeleteService()
2.使用.Net Framework自帶的工具InstallUtil.exe,一般位於%SystemRoot%\Microsoft.NET\Framework\版本號\
安裝服務:installuitl [服務程序路徑]
卸載服務:installuitl /u [服務程序路徑]