我有一个作为 Windows 服务运行的 C# 控制台应用程序。我怎样才能允许它访问文件系统?
我应该为其创建一个帐户吗?如果是这样,我认为我不需要用户帐户。(我注意到其他 Windows 服务在未显示在我的用户帐户下的帐户下运行。)如果这是正确的方法,我如何创建这些类型的帐户之一?
但每当我用谷歌搜索这个时,我似乎只是找到了创建常规用户帐户的页面。
我有一个作为 Windows 服务运行的 C# 控制台应用程序。我怎样才能允许它访问文件系统?
我应该为其创建一个帐户吗?如果是这样,我认为我不需要用户帐户。(我注意到其他 Windows 服务在未显示在我的用户帐户下的帐户下运行。)如果这是正确的方法,我如何创建这些类型的帐户之一?
但每当我用谷歌搜索这个时,我似乎只是找到了创建常规用户帐户的页面。
在 .NET 中创建的 Windows 服务通常如下所示:
MyBackgroundWorker
aBackgroundService
的工作在哪里ExecuteAsync()
。或者可以注册主机将为您运行的各种服务。来自Microsoft.Extensions.Hosting.WindowsServices
UseWindowsService()
的使程序告诉 Windows 的服务控制管理器 (SCM),是的,该进程实际上正在托管一个 Windows 服务。安装
现在,当您在某处部署此服务时,例如
C:\MyCoolService
,必须让 SCM 知道它。通常用于sc.exe
此目的:不指定用户帐户(使用
obj=
参数)默认为内置LocalSystem帐户,该帐户可以执行计算机上的所有操作。它可以访问任何目录,它可以代表网络上的机器,这是一个糟糕的默认值。不管怎样,我们现在有一个作为 Windows 服务运行的 .NET 应用程序,
MyBackgroundWorker
在后台愉快地运行我们的实现。权限
除了其中一些的内置部分之外,Windows 服务用户没有什么特别的。您可以让您的服务作为 运行
LocalSystem
,可以访问系统上的几乎所有内容,也可以让它作为特权较低的帐户运行LocalService
,该帐户几乎无法访问任何内容。或者,您可以创建一个 Windows(Active Directory 或本地)用户并让您的服务作为该用户运行。然后,它可以使用访问控制列表等来访问用户可以访问的任何内容。
问题
正如您在评论中所解释的,您可以用来
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
获取要写入的路径。当运行为 时LocalSystem
,会返回一个空字符串,因为 LocalSystem 用户没有“我的文档”文件夹。无论如何,谁会阅读这些文件?当您使用该空字符串构建写入文件的路径时会发生什么?您相对于当前目录写入。
如果没有另外指定,Windows 服务的当前目录是什么?
C:\Windows\system32
。用户LocalSystem
可以并且乐意在那里书写。那就是你的文件所在的地方。