C#Windows服务文本编写器

本文关键字:文本编写器 服务 C#Windows | 更新日期: 2023-09-27 18:20:40

我创建了一个使用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(进程),其中进程是一个附加程序。流程程序在写入任何内容之前都需要接收输入,而它没有接收输入,因为它使用了错误的帐户。我该怎么解决这个问题?

C#Windows服务文本编写器

应该做与using(...)相同的技巧,但你尝试过吗:

sw.Close();

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

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

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

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

首先,我会使用Log4Net,而不是滚动自己的日志机制,除非有充分的理由不这样做。这样,你可以创建你想要的日志文件,但也可以(通过配置或代码)添加日志附加器,如windows事件日志。然后我会确保我记录任何和所有的异常。你说没有抛出异常,我预计日志线程上会抛出一个没有"冒泡"的异常,所以抓住它并记录它(log.Error(ex))。如果你配置了事件日志附加程序,你可以在事件日志中看到这些异常。

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