c#守護程序(windows服務監測程式,程式關閉後自啟動)最詳細!!!!!!!!
阿新 • • 發佈:2018-12-17
最近專案需要:程式關閉後自動重新啟動,需要一個監測程式所以寫下這篇文章,為自己以後留個印象,也給大家一個參考,不喜勿噴!!!
1.開啟VS建立windows服務
2.實現服務的操作步驟(檢視service1程式碼)
3.(右鍵)新增引用(這個dll是為顯示介面的,很多人說windows服務開啟了,程式也在執行就是不顯示介面那就需要這個了)
記得新增名稱空間!!!
引用dll需要用到的程式碼
try { //appStartPath = "程式路徑"; IntPtr userTokenHandle = IntPtr.Zero; ApiDefinitions.WTSQueryUserToken(ApiDefinitions.WTSGetActiveConsoleSessionId(), ref userTokenHandle); ApiDefinitions.PROCESS_INFORMATION procInfo = new ApiDefinitions.PROCESS_INFORMATION(); ApiDefinitions.STARTUPINFO startInfo = new ApiDefinitions.STARTUPINFO(); startInfo.cb = (uint)System.Runtime.InteropServices.Marshal.SizeOf(startInfo); ApiDefinitions.CreateProcessAsUser( userTokenHandle, appStartPath, "", IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref startInfo, out procInfo); if (userTokenHandle != IntPtr.Zero) ApiDefinitions.CloseHandle(userTokenHandle); int _currentAquariusProcessId = (int)procInfo.dwProcessId; } catch (Exception ex) { }
4.在對應位置寫入程式碼
protected override void OnStart(string[] args) { //服務開啟執行程式碼 } protected override void OnStop() { //服務結束執行程式碼 } protected override void OnPause() { //服務暫停執行程式碼 base.OnPause(); } protected override void OnContinue() { //服務恢復執行程式碼 base.OnContinue(); } protected override void OnShutdown() { //系統即將關閉執行程式碼 base.OnShutdown(); }
全部程式碼
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; using System.IO; using Cjwdev.WindowsApi; namespace process { public partial class Service1 : ServiceBase { string appStartPath = @"C:\Users\Administrator\Desktop\okl1\okl1.exe"; public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { // string appStartPath= @"C:\Users\Administrator\Desktop\okl1\okl1.exe"; System.Timers.Timer timer; timer = new System.Timers.Timer(); timer.Interval = 10000;//設定計時器事件間隔執行時間 timer.Elapsed += new System.Timers.ElapsedEventHandler(circulation); timer.Enabled = true; } protected override void OnStop() { } private void circulation(object sender,System.Timers.ElapsedEventArgs e) { try { //appStartPath = "程式路徑"; IntPtr userTokenHandle = IntPtr.Zero; ApiDefinitions.WTSQueryUserToken(ApiDefinitions.WTSGetActiveConsoleSessionId(), ref userTokenHandle); ApiDefinitions.PROCESS_INFORMATION procInfo = new ApiDefinitions.PROCESS_INFORMATION(); ApiDefinitions.STARTUPINFO startInfo = new ApiDefinitions.STARTUPINFO(); startInfo.cb = (uint)System.Runtime.InteropServices.Marshal.SizeOf(startInfo); ApiDefinitions.CreateProcessAsUser( userTokenHandle, appStartPath, "", IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref startInfo, out procInfo); if (userTokenHandle != IntPtr.Zero) ApiDefinitions.CloseHandle(userTokenHandle); int _currentAquariusProcessId = (int)procInfo.dwProcessId; } catch (Exception ex) { } string appName = "okl1";//the path of the exe file bool runFlag = false; Process[] myProcesses = Process.GetProcesses(); foreach (Process myProcess in myProcesses) { if (myProcess.ProcessName.CompareTo(appName) == 0) { runFlag = true; } } if (!runFlag) //如果程式沒有啟動 { Process proc = new Process(); proc.StartInfo.FileName = appName; proc.StartInfo.WorkingDirectory = Path.GetDirectoryName(appStartPath); proc.Start(); } } } }
5.新增安裝程式
在services1的設計介面右鍵,選擇新增安裝程式:
生成serviceInstaller1和 serviceProcessInstaller1兩個元件 。
6.把serviceInstaller1的屬性ServiceName改寫為你的服務程式名,並把啟動模式設定為AUTOMATIC
7.把serviceProcessInstaller1的屬性account改寫為 LocalSystem
8.通過從生成選單中選擇生成來生成專案 安裝解除安裝Windows服務
現在你所需要的程式碼寫完之後點選執行是執行不了的!!!
9.安裝windows服務
1.InstallUtil.exe存在路徑為:C:\WINDOWS\Microsoft.NET\Framework\.NET版本號\InstallUtil.exe
2.找到它把它複製到你的專案中的bin\Debug或者bin\Release下
3.開啟cmd輸入命令runas /user:Administrator cmd 輸入密碼(不知道的自己百度吧)
4.獲得更高許可權,避免後續許可權不夠出問題
5.輸入安裝命令比如:C:\Windows\system32>xxx\xxx\bin\Debug\InstallUtil.exe 空格 服務名.exe
6.安裝成功之後:控制面板>管理工具>計算機管理>服務和應用程式>服務>找到你的服務開啟就ok了
解除安裝Windows服務
輸入命令:C:\Windows\system32>xxx\xxx\bin\Debug\InstallUtil.exe 空格 服務名.exe/u 就是多了個/u
如果修改這個服務,但是路徑沒有變化的話是不需要重新註冊服務的,直接停止服務,然後用新的檔案覆蓋原來的檔案即可,如果路徑發生變化,應該先解除安裝這個服務,然後重新安裝這個服務。
轉載請註明出處