Windows服务无法写入%LOCALAPPDATA%

时间:2012-03-31 08:44:44

标签: c# .net windows-services

我构建了一个仅在不作为Windows服务运行时才有效的应用程序。嗯,服务运行,但它没有做它应该做的事情。该服务使用本地服务帐户。所以为了开始调试,我想我会从简单的事情开始:让它在启动时创建一个目录:

Directory.CreateDirectory(
    Environment.SpecialFolder.LocalApplicationData + "\\MyService");

当我启动该服务时,它几乎立即停止,Windows报告了这一事实。当我注释掉上面的语句,重新编译并重新安装时,服务就会不停地运行。

显然上面的行引发了某种异常。我无法记录错误,因为我无法写入文件系统。任何想法为什么本地服务无法在其自己的%LOCALAPPDATA%?

中创建目录

3 个答案:

答案 0 :(得分:10)

你应该像这样使用GetFolderPath和LocalApplicationData:

string folderName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.LocalApplicationData), 
    "MyService");

Directory.CreateDirectory(folderName)

答案 1 :(得分:4)

我认为这可能是因为没有特殊文件夹。作为本地服务帐户运行时,您在该用户下运行,而不是登录用户。所以你要求一个可能不存在的特殊文件夹,因为我不认为本地服务有个人资料。 (我可能错了) - 我错了:p

万一有人弹出:

C:\Windows\ServiceProfiles\LocalService

是本地服务配置文件文件夹,因此最终会在那里。

如果你想使用try catch调试它,请将该错误写入文件:

try
{
    Directory.CreateDirectory(Environment.SpecialFolder.LocalApplicationData + "\\MyService");
}
catch (Exception ex)
{
    System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\MyServicelog.txt",true);
    file.WriteLine(ex.Message);
    file.Close();
}

至少你可以看到导致错误的是什么

马丁

答案 2 :(得分:0)

我建议您将异常详细信息写入事件日志。所有用户帐户都有权写入事件日志,只要管理员已经创建了日志和源名称(您可以通过首先运行应用程序来完成)。

至于错误的根本原因,可能是因为LocalService通常不会获得默认创建的完整配置文件夹集。我不确定这是设计的,还是我在各种机器上观察到的。