1. 程式人生 > >c#守護程序(windows服務監測程式,程式關閉後自啟動)最詳細!!!!!!!!

c#守護程序(windows服務監測程式,程式關閉後自啟動)最詳細!!!!!!!!

最近專案需要:程式關閉後自動重新啟動,需要一個監測程式所以寫下這篇文章,為自己以後留個印象,也給大家一個參考,不喜勿噴!!!

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

如果修改這個服務,但是路徑沒有變化的話是不需要重新註冊服務的,直接停止服務,然後用新的檔案覆蓋原來的檔案即可,如果路徑發生變化,應該先解除安裝這個服務,然後重新安裝這個服務。

轉載請註明出處