2012-03-31 18 views
5

我已經構建了一個僅在未作爲Windows服務運行時才起作用的應用程序。那麼,服務運行,但它沒有做它應該做的。該服務使用本地服務帳戶。因此,要揭開序幕調試,我想我會用一些簡單的開始:在啓動時有它創建一個目錄:Windows服務無法寫入%LOCALAPPDATA%

Directory.CreateDirectory(
    Environment.SpecialFolder.LocalApplicationData + "\\MyService"); 

當我開始服務時,它幾乎立即停止和Windows報道事實。當我評論上述語句,重新編譯並重新安裝後,服務就不停地運行。

很明顯,上面的代碼會拋出某種異常。我無法記錄錯誤,因爲我無法寫入文件系統。本地服務無法在自己的%LOCALAPPDATA%中創建目錄的任何想法?

+3

有點兒傷心,這段代碼編譯:( – 2012-03-31 09:03:55

回答

10

你應該使用GetFolderPath與LocalApplicationData像這樣:

string folderName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.LocalApplicationData), 
    "MyService"); 

Directory.CreateDirectory(folderName) 
+1

+ 1擊敗我:0) – Tung 2012-03-31 08:57:16

+1

現在我覺得很愚蠢。我會給它一個旋轉... – 2012-03-31 08:58:16

+0

謝謝。目錄「C:\ Windows \ ServiceProfiles \ LocalService \ AppData \ Local \ MyService」已創建。現在我可以開始記錄。 – 2012-03-31 09:07:38

0

我建議你在事件日誌中寫入異常詳細信息。只要日誌和源名稱已經由管理員創建(您可以簡單地通過首先運行應用程序就可以完成),所有用戶帳戶都有權寫入事件日誌。

至於錯誤的根本原因,它可能是可能是是因爲LocalService通常不會獲取默認創建的完整的一組配置文件夾。我不確定這是通過設計,還是僅僅是我在各種機器上觀察到的。

+0

謝謝,我會盡力的事件日誌我的理解是,(至少在Windows 7)'%LOCALAPPDATA%'爲本地服務是'C:\ WINDOWS \ ServiceProfiles \本地服務\ AppData \ Local'。 – 2012-03-31 08:56:02

4

我認爲這可能是因爲沒有特殊的文件夾。作爲本地服務帳戶運行時,您正在該用戶下運行,而不是登錄的用戶。所以你正在請求一個可能不存在的特殊文件夾,因爲我認爲本地服務沒有配置文件。 (我可能是錯的) - 我錯了:P

萬一有人被彈出:

C:\Windows\ServiceProfiles\LocalService 

是本地服務配置文件的文件夾,所以它會在那裏結束。

如果你想調試它圍繞一個嘗試捕捉這一行,然後寫錯誤到一個文件:

try 
{ 
    Directory.CreateDirectory(Environment.SpecialFolder.LocalApplicationData + "\\MyService"); 
} 
catch (Exception ex) 
{ 
    System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\MyServicelog.txt",true); 
    file.WriteLine(ex.Message); 
    file.Close(); 
} 

至少這樣你可以看到什麼導致了錯誤

馬丁

+0

+1它最有可能沒有配置文件。 – 2012-03-31 09:01:35