[.NET] : 設定Windows Service啟動類型

來源:互聯網
上載者:User

 

前言 :

最近在處理應用程式安裝的相關問題。
系統內有使用Window Time Service來完成時間同步的功能。

 

但在啟動這個服務的時候。
卻發現使用ManagementObject Class控制 WMI的這種方式,
無法將Windows Service啟動類型設定為「自動(延遲開始)」。

 

使用Google搜尋之後,
找到了可以使用 Windows SC命令,來做Windows Service的管理。
並且這個方式,可以將Windows Service啟動類型設定為「自動(延遲開始)」。

 

本篇文章簡單紀錄,
.NET應用程式如何使用Windows SC命令,來做Windows Service啟動類型的設定。

 

方法 :

整個方法思路為
1. 執行一個隱形的 cmd.exe。
2. cmd.exe 呼叫 Windows SC命令來控制Windows Service啟動類型。
3. 隱形的cmd.exe無法取得執行訊息,會無從判斷執行錯誤。
  採用限制輸入、資料驗證、遇時處理等等方法,來盡量減少執行錯誤的機率。

 

下列的程式將上述動作封裝為函式,
使用之前需要先加入System.ServiceProcess參考,直接呼叫即可設定Windows Service啟動類型。

 

使用範例 :

SetWindowsServiceStartupType("w32time", StartupType.AutomaticDelayed);

 

原始碼 :

public enum StartupType{    Automatic,    Manual,    Disabled,    AutomaticDelayed, }        public static void SetWindowsServiceStartupType(String serviceName, StartupType startupType, int timeoutMilliseconds = 0){    // ServiceName    if (string.IsNullOrEmpty(serviceName) == true)    {        throw new ArgumentException("serviceName");    }    // StartType    string startupTypeString = string.Empty;    switch (startupType)    {        case StartupType.Automatic: startupTypeString = "auto"; break;        case StartupType.Manual: startupTypeString = "demand"; break;        case StartupType.Disabled: startupTypeString = "disabled"; break;        case StartupType.AutomaticDelayed: startupTypeString = "delayed-auto"; break;        default: throw new ArgumentException("startupType");    }    // TimeoutMilliseconds    if (timeoutMilliseconds < 0)    {        throw new ArgumentException("timeoutMilliseconds");    }    // Check Existed    bool isExisted = false;    foreach (ServiceController serviceController in ServiceController.GetServices())    {        if (string.Compare(serviceController.ServiceName, serviceName, true) == 0)        {            isExisted = true;            break;        }    }    if (isExisted == false) throw new Exception("Service not existed.");    // Execute         String result = string.Empty;    using (System.Diagnostics.Process process = new System.Diagnostics.Process())    {        process.StartInfo.FileName = "cmd.exe";        process.StartInfo.Arguments = string.Format("/c sc config {0} start= {1}", serviceName, startupTypeString);        process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;        process.StartInfo.CreateNoWindow = false;        process.Start();        if (timeoutMilliseconds == 0)        {                                process.WaitForExit();                           }        else        {            if (process.WaitForExit(timeoutMilliseconds) == false)            {                process.Kill();                throw new System.TimeoutException();            }        }    }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.