"Acesso negado" ao tentar iniciar o serviço mesmo executando Administrador/elevado

"Acesso negado" ao tentar iniciar o serviço mesmo executando Administrador/elevado

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 SERVICEseja 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 $fsarno 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.exee executar o comando depois disso.

Coisas somente Tor

Para quem não sabe, existe um atalho integrado que permite fazer isso sem usar scdiretamente ou qualquer outro aplicativo de serviço.

Se quiser armazenar o torrcarquivo 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...

informação relacionada