C#Windows服务文本编写器

时间:2012-01-19 08:12:26

标签: c# service textwriter

我创建了一个使用LocalSystem帐户的标准Windows服务。对于日志文件,我使用textwriter写入C:\ Users \ useraccount目录中的指定文件。问题是,当在LocalSystem下作为服务运行时,它根本不想创建或写入文件。

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

正如您所看到的,目录是硬编码的,因此没有任何基本目录冲突,因为LocalSystem将在System32中启动或具有某种性质。该文件夹的权限允许系统帐户完全访问它(Windows 7),为什么我无法创建/写入该文件?

感谢您的任何意见!

编辑:

显然,日志程序线程也作为LocalSystem运行,当我真的需要它作为标准用户运行时。那么如何从服务执行线程进程以在本地用户帐户下运行而不是在LocalSystem下运行。

我使用Thread.new(进程),其中进程是一个额外的程序。进程程序需要在写入任何内容之前接收输入,并且它没有接收输入,因为它位于错误的帐户上。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

应该和using(...)做同样的伎俩,但是你试过了吗?

sw.Close();

没有它,只有一个空文件,但它没有抛出异常..

答案 1 :(得分:0)

尝试此代码并检查异常报告:

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

请注意:对所有实现using(...)接口的类使用IDisposable是个好主意,因此您可以确保在退出块时释放它们!

答案 2 :(得分:0)

首先,我会使用Log4Net而不是滚动自己的日志记录机制,除非有充分的理由不这样做。这样您就可以创建所需的日志文件,但也可以(通过配置或代码)添加日志追加器,例如Windows事件日志。然后我会确保记录任何和所有异常。你说没有抛出任何异常,我希望在日志记录线程上抛出一个异常,它不会“冒泡”,所以抓住并记录它(Log.Error(ex))。如果已配置事件日志追加程序,则可以在事件日志中查看这些异常。

最后,我不确定如何假设登录用户的安全上下文。听起来这将是一个巨大的安全漏洞,除非你写一些提示用户输入他们的凭据或授予进程冒充/假设用户安全上下文的权利。也许这就是答案,服务响应用户通过提示用户授予此权限进行登录。我会到处寻找一个更好的答案。