我有一个服务应该通过网络复制一些文件,该服务在其中一个本地管理员帐户下运行。
以该管理员身份登录后,我可以手动将文件从网络复制到 下的特定文件夹Program Files
,但服务存在 PermissionDenied 异常以写入文件。我还确定在写入之前文件没有被锁定。
错误如下:
拒绝访问路径“.../SomeAssembly.dll”。
为什么服务会给我这样的错误?我该如何纠正?(我也开发了这项服务,因此可以对程序集进行更改)。
更新
我也尝试过运行它,System
但它无法读取网络上的文件(不知道为什么),LocalService
而且NetworkService
据我所知,帐户没有足够的权限来更改 ProgramFiles......是吗?
更新 2
我无法使用的原因System
是该帐户在设计上无法访问网络资源,NETWORK SERVICE
无法访问本地资源的帐户也是如此。管理员帐户的问题似乎是 Windows 在服务执行文件复制操作时阻止了该操作。
有任何想法吗????
答案1
首先,我会检查是否有任何文件被标记为“只读”,因为我发现此属性有时会取代 NTFS 权限。我见过这样的情况:在“您确定吗?”提示下单击“是”后,您可以在 GUI 中复制文件,但任何使用程序向其中写入数据的尝试都会立即失败,不会给出任何提示。
此外,我会确保服务和相关服务确实在您认为的帐户下运行。我见过一些情况,服务 A 会调用服务 B 来执行某些任务,然后将结果交还给服务 A 来完成任务。如果只有服务 An 使用具有适当权限的帐户,则尝试将失败(因为即使 An 正在调用 B,也不会强制它以 An 正在使用的同一用户身份运行,因此如果 B 本身未配置为使用正确的用户,它将使用默认用户,而默认用户可能无法访问您想要的特定位置)
此外,如果可能的话,请确保它使用的路径像c:\program files\SomeAssembly.dll\somefile.txt
或类似的路径C:/users/don/app/SomeAssembly.dll
也可能导致错误。
答案2
最后我所做的是让应用程序将文件从远程资源复制到低限制文件夹(Application Data
如果我没记错的话),然后调用在下运行的服务System
将它们复制到Program Files
。
这种方法的优点是,它不需要管理权限即可通过网络将文件复制到本地驱动器(当然,只要您read
对网络文件拥有正确的权限),然后它还可以利用对System
写入 Program Files 所施加的低限制。
答案3
根据另一台计算机正在运行的内容,服务通常在网络服务帐户或本地系统帐户下运行。
我会先尝试一下。