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 访问权限)