由於windows服務安裝時,系統會自動將windows服務的程式檔案複製到系統目錄下,通常是System32目錄下,windows服務的運行目錄就是系統目錄,有時候,windows服務在運行時需要知道自己的安裝目錄,比如,windows服務運行時所需要的一些資源檔,通常可能是一些聲音或影像檔,這些資源檔是位於安裝目錄下的,只有windows服務知道了安裝目錄,才能對這些資源檔進行訪問,那麼windows服務如何知道自己的安裝目錄的資訊呢,一種比較簡單的做法是通過訪問註冊表。
如,是一個名字叫MazeServer的服務,通過服務管理員察看屬性,注意,其中的“可執行檔的路徑”一欄所記錄的就是服務的鏡像路徑
windows服務在安裝後,會在系統註冊表中進行記錄,以上面提到的MazeServer為例,通過運行登錄編輯程式(regedit)可以找到如下索引值:
/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/MazeServer
開啟該鍵可以看到其下面的項,
其中那個
ImagePath的項的值就是我們需要得到的資訊。由此,我們可以知道,只要我們能夠從系統註冊表中找到對應的鍵讀取ImagePath的項就可以得到安裝路徑資訊。提供如下類供參考。Windows服務的安裝路徑
在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();