由於windows服務安裝時,系統會自動將windows服務的程序文件復制到系統目錄下,通常是System32目錄下,windows服務的運行目錄就是系統目錄,有時候,windows服務在運行時需要知道自己的安裝目錄,比如,windows服務運行時所需要的一些資源文件,通常可能是一些聲音或圖像文件,這些資源文件是位於安裝目錄下的,只有windows服務知道了安裝目錄,才能對這些資源文件進行訪問,那么windows服務如何知道自己的安裝目錄的信息呢,一種比較簡單的做法是通過訪問注冊表。
如下圖,是一個名字叫MazeServer的服務,通過服務管理器察看屬性,注意,其中的“可執行文件的路徑”一欄所記錄的就是服務的鏡像路徑
windows服務在安裝后,會在系統注冊表中進行記錄,以上面提到的MazeServer為例,通過運行注冊表編輯器(regedit)可以找到如下鍵值:
/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/MazeServer
打開該鍵可以看到其下面的項,如圖:
在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();
