天天看點

C#實作一個用于開機啟動其他程式的Windows服務

很多開機啟動程式僅僅加在啟動項裡面,隻有登陸後才真正啟動。windows服務在開機未進行使用者登入前就啟動了。正是利用這一點,解決一些伺服器自動重新開機後特定軟體也自動啟動的問題。

1.建立一個服務項目 visual C#----windows----windows服務;

2.添加一個dataset(.xsd),用于存儲啟動目标的路徑,日志路徑等。

   在dataset可視化編輯中,添加一個datatable,包含兩列 StartAppPath 和 LogFilePath。分别用于存儲目标的路徑、日志路徑。

   *我認為利用dataset.xsd存儲配置參數的優勢在于可以忽略xml解析的具體過程直接使用xml檔案。

     在dataset中 提供了ReadXml方法用于讀取xml檔案并将其轉換成記憶體中的一張datatable表,資料很容易取出來!同樣,WriteXml方法用于存儲為xml格式的檔案,也僅僅需要一句話而已。

3. program.cs檔案 作為程式入口,代碼如下:

view plaincopy to clipboardprint?

using System.Collections.Generic;  

using System.ServiceProcess;  

using System.Text;  

namespace WindowsServices_AutoStart  

{  

    static class Program  

    {  

        /// <summary>  

        /// 應用程式的主入口點。  

        /// </summary>  

        static void Main()  

        {  

            ServiceBase[] ServicesToRun;  

            // 同一程序中可以運作多個使用者服務。若要将  

            // 另一個服務添加到此程序中,請更改下行以  

            // 建立另一個服務對象。例如,  

            //  

            //   ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};  

            ServicesToRun = new ServiceBase[] { new WindowsServices_AutoStart() };  

            ServiceBase.Run(ServicesToRun);  

        }  

    }  

}

using System.Collections.Generic;

using System.ServiceProcess;

using System.Text;

namespace WindowsServices_AutoStart

{

    static class Program

    {

        /// <summary>

        /// 應用程式的主入口點。

        /// </summary>

        static void Main()

        {

            ServiceBase[] ServicesToRun;

            // 同一程序中可以運作多個使用者服務。若要将

            // 另一個服務添加到此程序中,請更改下行以

            // 建立另一個服務對象。例如,

            //

            //   ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};

            ServicesToRun = new ServiceBase[] { new WindowsServices_AutoStart() };

            ServiceBase.Run(ServicesToRun);

        }

    }

}

4.service.cs主檔案,代碼如下: 

using System;

using System.ComponentModel;

using System.Data;

using System.IO;

using System.Diagnostics;

    public partial class WindowsServices_AutoStart : ServiceBase

        public WindowsServices_AutoStart()

            InitializeComponent();

        string StartAppPath =""; //@"F:\00.exe";

        string LogFilePath ="";// @"f:\WindowsService.txt";

        protected override void OnStart(string[] args)

            string exePath = System.Threading.Thread.GetDomain().BaseDirectory;

            if (!File.Exists(exePath + @"\ServiceAppPath.xml"))

            {

                dsAppPath ds = new dsAppPath();

                object[] obj=new object[2];

                obj[0]="0";

                obj[1]="0";

                ds.Tables["dtAppPath"].Rows.Add(obj);

                ds.Tables["dtAppPath"].WriteXml(exePath + @"\ServiceAppPath.xml");

                return;

            }

            try

                ds.Tables["dtAppPath"].ReadXml(exePath + @"\ServiceAppPath.xml");

                DataTable dt = ds.Tables["dtAppPath"];

                StartAppPath = dt.Rows[0]["StartAppPath"].ToString();

                LogFilePath = dt.Rows[0]["LogFilePath"].ToString();

            catch { return; }

            if (File.Exists(StartAppPath))

                try

                {

                    Process proc = new Process();

                    proc.StartInfo.FileName = StartAppPath; //注意路徑

                    //proc.StartInfo.Arguments = "";

                    proc.Start();

                }

                catch (System.Exception ex)

                    //MessageBox.Show(this, "找不到幫助檔案路徑。檔案是否被改動或删除?\n" + ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                FileStream fs = new FileStream(LogFilePath, FileMode.OpenOrCreate, FileAccess.Write);

                StreamWriter m_streamWriter = new StreamWriter(fs);

                m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);

                m_streamWriter.WriteLine("WindowsService: Service Started" + DateTime.Now.ToString() + "\n");

                m_streamWriter.Flush();

                m_streamWriter.Close();

                fs.Close();

        protected override void OnStop()

                // TODO: 在此處添加代碼以執行停止服務所需的關閉操作。

                m_streamWriter.WriteLine("WindowsService: Service Stopped " + DateTime.Now.ToString() + "\n");

            catch

5.啟動調試,成功時也會彈出一個對話框大緻意思是提示服務需要安裝。

6.把Debug檔案夾下面的.exe執行程式,安裝為windows系統服務,安裝方法網上很多介紹。我說一種常用的:

安裝服務

通路項目中的已編譯可執行檔案所在的目錄。

用項目的輸出作為參數,從指令行運作 InstallUtil.exe。在指令行中輸入下列代碼:

installutil yourproject.exe

解除安裝服務

用項目的輸出作為參數,從指令行運作 InstallUtil.exe。

installutil /u yourproject.exe

至此,整個服務已經編寫,編譯,安裝完成,你可以在控制台的管理工具的服務中,看到你編寫的服務。

7.安裝好了之後在系統服務清單中可以管理服務,這時要注意将服務的屬性視窗----登陸----“允許于桌面互動”勾選!這樣才能在啟動了你要的目标程式後不單單存留于程序。在桌面上也看得到。

8.關于解除安裝服務,目前有兩個概念:一是禁用而已;一是完全删除服務。 前者可以通過服務管理視窗直接完成。後者則需要進入系統資料庫“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”找到服務名稱的檔案夾,整個删掉,重新啟動電腦後,服務消失。

9.擴充思考:經過修改代碼,還可以實作:啟動目标程式之前,檢測程序中是否存在目标程式,存在則不再次啟動。