2

我创建了一个使用 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(process) ,其中 process 是一个附加程序。进程程序在写任何东西之前需要接收输入,并且它没有接收输入,因为它在错误的帐户上。我将如何解决这个问题?

4

3 回答 3

1

应该做同样的伎俩,using(...)但你尝试过:

sw.Close();

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

于 2012-01-19T08:56:56.713 回答
0

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

最后,我不确定您将如何假设登录用户的安全上下文。听起来这将是一个很大的安全漏洞,除非您编写一些提示用户输入其凭据的内容或授予进程模拟/假设用户安全上下文的权利。也许这就是答案,服务响应用户通过提示用户授予此权限进行登录。对于这一点,我将四处寻找更好的答案。

于 2012-01-19T09:17:13.633 回答
0

试试这段代码并检查异常报告:

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

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

于 2012-01-19T08:17:16.530 回答