
Estou usando sc start "MyService"
um "Administrador: Prompt de Comando" elevado, mas estou recebendo o seguinte erro:
[SC] StartService FALHOU 5:
Acesso negado.
Para completar, o erro ao tentar executá-lo a partir da GUI ( services.msc
) é:
Erro 5: Acesso negado
Por ser um serviço .NET, foi instalado usando InstallUtil.exe
(executado como Administrador). O serviço está configurado para ser executado como NETWORK SERVICE, mas também tentei com LOCAL SERVICE.
Responder1
Isso ocorreu porque, por padrão, nem o SERVIÇO DE REDE nem o SERVIÇO LOCAL têm permissão para ler o diretório onde reside o executável do meu serviço. Eu precisava conceder-lhes privilégios de leitura na pasta (no mínimo).
Responder2
Me deparei exatamente com esse problema, mas fiquei consternado por não encontrar um conjunto claro de instruções nas respostas para corrigi-lo, então aqui estão as minhas:
Rapido e sujo
A solução mais simples é simplesmente garantir que o aplicativo para o qual você está instalando um serviço (no meu exemplo concreto, Tor) esteja localizado em algum lugar onde NT AUTHORITY\LOCAL SERVICE
seja permitido ler - por exemplo C:\Tor\
- antes de executar os comandos.
Pessoalmente, desprezo soluções como essas.
Mais limpo, mais educativo e mais tedioso
Eu mesmo coloquei o Tor $env:UserProfile\AppData\Local\Programs
, então aqui está o que fiz no Windows 10 usando um terminal PowerShell elevado:
PS C:\Users\User\AppData\Local\Programs>$fsar = New-Object
System.Security.AccessControl.FileSystemAccessRule(`
>> "NT AUTHORITY\LOCAL SERVICE",`
>> "ReadAndExecute",`
>> "ContainerInherit,ObjectInherit",`
>> "InheritOnly",`
>> "Allow")
Isto cria umFileSystemAccessRule(ao qual me refiro como $fsar
no código) que permite que o IdentityReference de "NT AUTHORITY\LOCAL SERVICE" leia e execute (e sincronize, um efeito colateral disso) qualquer arquivo/pasta ao qual a regra é aplicada e seus filhos por meio os sinalizadores de herança "ContainerInherit,ObjectInherit" em combinação com o PropagationFlag "InheritOnly". "Permitir" define a regra para permitir (qualquer negação aplicada a substituiria, mas é improvável que isso aconteça).
Agora queremos aplicar esta regra de acesso à pasta em que instalamos o Tor. A primeira etapa obtém uma ACL existente (para não bagunçarmos o que estava lá em primeiro lugar) usandoObter-Acl. A segunda etapa simplesmente adiciona essa regra de acesso ao objeto que armazenamos em uma variável. A terceira etapa alimenta a lista de controle de acesso que modificamos no comandoDefinir-Aclque também fornecemos o caminho para nossa pasta que contém o 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
Você deve ser capaz de navegar até onde seu arquivo está na estrutura de pastas tor.exe
e executar o comando depois disso.
Coisas somente Tor
Para quem não sabe, existe um atalho integrado que permite fazer isso sem usar sc
diretamente ou qualquer outro aplicativo de serviço.
Se quiser armazenar o torrc
arquivo em algum lugar específico e fazer com que o serviço o utilize, você pode usar isto para instalar o serviço:
PS C:\Users\User\AppData\Local\Programs\MyTorFolder>.\tor.exe --service install -options -f $pathToTorrc
Se você, como eu, esperava que o procedimento acima funcionasse sem problemas antes de perceber que havia problemas tediosos de controle de acesso, então provavelmente você só deseja executar isto:
PS C:\Users\User\AppData\Local\Programs\MyTorFolder>.\tor.exe --service start
Espero que pelo menos uma ou duas pessoas tirem algum benefício desta resposta adicional. Se não, tenho certeza que voltarei aqui em um ou dois anos e usarei eu mesmo quando inevitavelmente esquecer como fiz isso da primeira vez...