C#Windows服务Textwriter

C#Windows服务Textwriter,c#,service,textwriter,C#,Service,Textwriter,我已经创建了一个使用LocalSystem帐户的标准windows服务。对于日志文件,我使用textwriter写入C:\Users\useraccount目录中的指定文件。问题是,在LocalSystem下作为服务运行时,它根本不想创建或写入文件 string dir = @"C:\Users\useraccount\log.txt"; StreamWriter sw = File.AppendText(dir); 正如您所看到的,目录是硬编码的,因此没有任何基本目录冲突,因为Local

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

 string dir = @"C:\Users\useraccount\log.txt";
 StreamWriter sw = File.AppendText(dir);
正如您所看到的,目录是硬编码的,因此没有任何基本目录冲突,因为LocalSystem将在System32或类似的东西中启动。文件夹的权限允许系统帐户完全访问它(windows 7),那么为什么我不能创建/写入该文件

谢谢你的意见

编辑:

显然,日志程序线程也以LocalSystem的形式运行,而我确实需要它以标准用户的身份运行。那么,如何从服务执行线程化进程,以在本地用户帐户下而不是在本地系统下运行呢


我使用Thread.new(process),其中process是一个附加程序。进程程序在写入任何内容之前需要接收输入,而它没有接收输入,因为它使用了错误的帐户。如何修复此问题?

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

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

请注意:最好将
使用(…)
与所有实现
IDisposable
接口的类一起使用,这样您就可以确保它们在退出块时被释放

应该使用与使用(…)相同的技巧,但是您是否尝试过:

sw.Close();
没有它,只有一个空文件,但它不会引发异常。

首先,我将使用它,而不是滚动您自己的日志机制,除非有充分的理由不这样做。通过这种方式,您可以创建所需的日志文件,但也可以(通过配置或代码)添加日志附加程序,如windows事件日志。然后我会确保记录所有异常。如果您说没有抛出异常,我希望日志线程上会抛出一个没有“冒泡”的异常,那么捕获它并记录它(log.Error(ex))。如果配置了事件日志追加器,则可以在事件日志中看到这些异常


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

您不能创建文件是什么意思?您是否收到错误,或者它执行代码时没有错误,但没有文件结果?执行时没有错误,但没有要查找的文件注意,如果不调用流的Close(),则不会发生任何事情,因为流正在缓冲所有内容,直到调用缓冲区(如果已满)或Close()/Flush(),则代码可能会实际修复它。。。操作代码不具有处理功能。不确定默认情况下会发生什么。事实上这就是问题所在!什么也没抓到!没有引发异常。。。在没有真正起作用的情况下,无法确定它为什么起作用