Windows Worker 服务文件夹权限 (C#)

Posted

技术标签:

【中文标题】Windows Worker 服务文件夹权限 (C#)【英文标题】:Windows Worker Service Folder Permissions (C#) 【发布时间】:2022-01-01 07:18:40 【问题描述】:

如果有人碰巧知道,请快速提问。我正在开发 dotnet6 中的 Worker 应用程序,该应用程序旨在成为服务,我需要在某处存储一个 json 文件。做一些研究似乎 CommonApplicationData(ex: "C:/ProgramData") 是去的地方。我的问题是,我似乎无法将文件写入该文件夹。我能够创建一个目录就好了。但我的访问权限被拒绝创建实际文件。

该服务目前将在现场服务器上使用,无法回答 UAC 提示。我不确定还能做什么。我可以手动创建文件并访问、编辑它。这似乎工作正常。但我想要动态创建日志文件等等。

这是代码(“它非常基本”)

    var dirPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MyServerService");
    var path = dirPath + "\\service.json";

    var doesDirExist = Directory.Exists(dirPath);
    var doesFileExist = File.Exists(path);
    if (!doesDirExist || !doesFileExist)
    
        Directory.CreateDirectory(dirPath); //<- directory is created just fine
        using var file = File.Create(dirPath); // <- fails here (access is denied)
        //do stuff
    

【问题讨论】:

我没有安装atm 它似乎只能被隔离创建。我可以很好地编辑文件。 并且没有用户帐户。如果我理解正确,您必须登录才能使用与用户帐户相关的服务。我们的大多数服务器都将无头地坐在登录屏幕上,所以这是不行的。它必须与全球本地用户绑定 【参考方案1】:

这段代码对我有用。这确实是正在创建的目录的权限问题。

  public static bool CreateDirWithAccess(string fullPath, bool readOnly)

    var dInfo = Directory.CreateDirectory(fullPath);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), readOnly ? FileSystemRights.Read : FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
    dInfo.SetAccessControl(dSecurity);
    return true;

【讨论】:

以上是关于Windows Worker 服务文件夹权限 (C#)的主要内容,如果未能解决你的问题,请参考以下文章

使用.NET 6.0创建Worker Service服务程序,并注册Windows服务程序

如何为 .NET Core 3.0 Worker 服务设置事件日志

如何在 Google Gears Worker 中包含 javascript 文件(无 DOM 访问权限)

扩展 C# Worker 服务以处理多个配置

.NET Worker Service 作为 Windows 服务运行及优雅退出改进

Net Core Worker Windows 服务中的 EF Core DBContext