簡體   English   中英

C#Windows服務文字編寫器

[英]C# Windows Service Textwriter

我已經創建了一個使用LocalSystem帳戶的標准Windows服務。 對於日志文件,我使用文本編寫器寫入C:\\ Users \\ useraccount目錄中的指定文件。 問題是,當在LocalSystem下作為服務運行時,它根本不想創建或寫入文件。

 string dir = @"C:\Users\useraccount\log.txt";
 StreamWriter sw = File.AppendText(dir);

如您所見,該目錄是硬編碼的,因此不會出現任何基本目錄沖突,因為LocalSystem將在System32或類似的性質中啟動。 文件夾上的權限使系統帳戶可以完全訪問它(Windows 7),為什么我不能創建/寫入該文件?

感謝您的輸入!

編輯:

顯然,當我真正需要它以標准用戶身份運行時,日志記錄程序線程也以LocalSystem身份運行。 因此,我如何從服務執行線程化進程以在本地用戶帳戶下而不是在LocalSystem下運行。

我使用Thread.new(process),其中process是一個附加程序。 流程程序在寫任何東西之前需要先接收輸入,並且由於使用了錯誤的帳戶,因此未接收到輸入。 我該如何解決?

應該using(...)using(...)相同的技巧,但是您是否嘗試過:

sw.Close();

沒有它,只有一個空文件,但不會引發異常。

嘗試以下代碼並檢查哪些異常報告:

try
{
     using (StreamWriter sw = File.AppendText(dir))
     {
          sw.WriteLine("test");
     }
}
catch (Exception ex)
{
     Debug.Print(ex.Message);
}

請注意:在所有實現IDisposable接口的類中使用using(...)是個好主意,因此可以確保退出塊時它們已被釋放!

首先,除非有充分的理由,否則我將使用Log4Net而不是使用自己的日志記錄機制。 這樣,您可以創建所需的日志文件,還可以(通過配置或代碼)添加日志附加程序,例如Windows事件日志。 然后,我將確保記錄所有異常。 您說沒有引發異常,我希望在日志記錄線程上引發異常,而不是“冒泡”,因此請捕獲並記錄它(Log.Error(ex))。 如果已配置事件日志追加程序,則可以在事件日志中看到這些異常。

最后,我不確定您如何假定已登錄用戶的安全上下文。 聽起來這將是一個很大的安全漏洞,除非您編寫某些內容來提示用戶輸入其憑據或授予該流程模擬/承擔用戶安全上下文的權限。也許這就是答案,該服務會響應用戶通過提示用戶授予此權限來登錄。 我將四處尋找一個更好的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM