c# windows服務如何獲取自己的安裝路徑

由於windows服務安裝時,系統會自動將windows服務的程序文件複製到系統目錄下,通常是System32目錄下,windows服務的運行目錄就是系統目錄,有時候,windows服務在運行時需要知道自己的安裝目錄,比如,windows服務運行時所需要的一些資源文件,通常可能是一些聲音或圖像文件,這些資源文件是位於安裝目錄下的,只有windows服務知道了安裝目錄,才能對這些資源文件進行訪問,那麼windows服務如何知道自己的安裝目錄的信息呢,一種比較簡單的做法是通過訪問註冊表。

如下圖,是一個名字叫MazeServer的服務,通過服務管理器察看屬性,注意,其中的“可執行文件的路徑”一欄所記錄的就是服務的鏡像路徑

windows服務在安裝後,會在系統註冊表中進行記錄,以上面提到的MazeServer爲例,通過運行註冊表編輯器(regedit)可以找到如下鍵值:

/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/MazeServer

打開該鍵可以看到其下面的項,如圖:

其中那個ImagePath的項的值就是我們需要得到的信息。
由此,我們可以知道,只要我們能夠從系統註冊表中找到對應的鍵讀取ImagePath的項就可以得到安裝路徑信息。提供如下類供參考。

在Windows服務中需要獲得當前服務所在的路徑時,不能簡單的使用Environment.CurrentDirectory來獲得當前路徑,因爲windows服務所啓動的目錄都是在c:/windows/system32。如果在你的服務中需要檢測某個配置文件時,你無法獲得這個配置文件的路徑。這時有2種解決方案:

一、就是將你的配置文件安裝在system32目錄下

二、在你的服務中通過註冊表來獲得這個服務的安裝路徑

/*
  Windows服務在系統安裝後會在註冊表的 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[ServiceName]"下以服務的ServiceName建1個目錄,目錄中會有"ImagePath"節,這裏保存的就是該服務的安裝路徑。
*/

        /// <summary>
        /// 獲取服務安裝路徑
        /// </summary>
        /// <param name="ServiceName"></param>
        /// <returns></returns>
        public static string GetWindowsServiceInstallPath(string ServiceName)
        {
            string key = @"SYSTEM\CurrentControlSet\Services\" + ServiceName;
            string path = Registry.LocalMachine.OpenSubKey(key).GetValue("ImagePath").ToString();
            //替換掉雙引號   
            path = path.Replace("\"", string.Empty);

            FileInfo fi = new FileInfo(path);
            return fi.Directory.ToString();

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章