我正在使用sc start "MyService"
提升的“管理员:命令提示符”,但出现以下错误:
[SC] StartService 失败 5:
拒绝访问。
为了完整起见,当您尝试从 GUI ( services.msc
) 运行它时出现的错误是:
错误 5:访问被拒绝
由于它是一项 .NET 服务,因此使用InstallUtil.exe
(以管理员身份运行)进行安装。该服务配置为作为网络服务运行,但我也尝试过使用本地服务运行。
答案1
这是因为默认情况下,网络服务和本地服务都没有权限读取我服务可执行文件所在的目录。我需要授予他们对该文件夹的读取权限(至少)。
答案2
我遇到了这个确切的问题,但很沮丧在答案中找不到一组明确的说明来解决这个问题,所以这里是我的:
快速而肮脏
最简单的解决方案是简单地确保您要安装服务的应用程序(在我的具体示例中为 Tor)位于某个地方NT AUTHORITY\LOCAL SERVICE
并且允许读取 - 例如C:\Tor\
- 在运行命令之前。
我个人非常鄙视这样的解决方案。
更清洁、更有教育意义、也更乏味
我自己将 Tor 放入其中$env:UserProfile\AppData\Local\Programs
,因此下面是我在 Windows 10 上使用提升的 PowerShell 终端所执行的操作:
PS C:\Users\User\AppData\Local\Programs>$fsar = New-Object
System.Security.AccessControl.FileSystemAccessRule(`
>> "NT AUTHORITY\LOCAL SERVICE",`
>> "ReadAndExecute",`
>> "ContainerInherit,ObjectInherit",`
>> "InheritOnly",`
>> "Allow")
这将创建一个文件系统访问规则(我在代码中将其称为$fsar
)允许 IdentityReference“NT AUTHORITY\LOCAL SERVICE”读取和执行(并同步,这是它的副作用)通过继承标志“ContainerInherit,ObjectInherit”与 PropagationFlag“InheritOnly”的组合,规则应用到的任何文件/文件夹及其子文件。“Allow”将规则设置为允许(任何应用的拒绝都会覆盖它,但这不太可能出现)。
现在我们要将这个访问规则应用到我们安装 Tor 的文件夹中。第一步是获取一个现有的 ACL(这样我们就不会弄乱那里的东西),使用获取 Acl。第二步只是将该访问规则添加到我们存储在变量中的对象中。第三步将我们修改的访问控制列表输入到命令中设置Acl我们还提供了包含 Tor 的文件夹的路径。
PS C:\Users\User\AppData\Local\Programs>$torFolderAcl = Get-Acl .\MyTorFolder
PS C:\Users\User\AppData\Local\Programs>$torFolderAcl.AddAccessRule($fsar)
PS C:\Users\User\AppData\Local\Programs>$torFolderAcl | Set-Acl .\MyTorFolder
您应该能够导航到tor.exe
文件在文件夹结构中的位置,然后执行该命令。
仅限 Tor 的内容
对于那些不知道的人来说,有一个内置的快捷方式可以让您执行此操作,而无需sc
直接使用或任何其他服务应用程序。
如果您想将torrc
文件存储在特定位置并让服务使用它,您可以使用以下命令安装服务:
PS C:\Users\User\AppData\Local\Programs\MyTorFolder>.\tor.exe --service install -options -f $pathToTorrc
如果您像我一样,在意识到存在繁琐的访问控制问题之前,期望上述操作能够顺利运行,那么您可能只想运行以下命令:
PS C:\Users\User\AppData\Local\Programs\MyTorFolder>.\tor.exe --service start
我希望至少有一两个人能从这个额外的答案中受益。如果没有,我确信我会在一两年后回到这里,当我不可避免地忘记我第一次是如何做到这一点时,我会自己使用它......