"Отказано в доступе" при попытке запустить службу, даже если запущен Администратор / повышен

Я использую sc start "MyService" от повышенного уровня "Администратор: Командная строка", но получаю следующую ошибку:

[SC] StartService FAILED 5:

В доступе отказано.

Для полноты, ошибка при попытке запустить его из графического интерфейса (services.msc) является:

Ошибка 5: доступ запрещен

Поскольку это сервис.NET, он был установлен с использованием InstallUtil.exe (запустить от имени администратора). Служба настроена для работы в качестве NETWORK SERVICE, но я также пробовал ее с LOCAL SERVICE.

1 ответ

Это произошло из-за того, что по умолчанию ни NETWORK SERVICE, ни LOCAL SERVICE не имеют разрешения на чтение из каталога, в котором находится исполняемый файл моей службы. Мне нужно было предоставить им права на чтение в папке (как минимум).

Я столкнулся с этой конкретной проблемой, но был встревожен, что не нашел в ответах четких инструкций по ее устранению, поэтому вот мои:

Быстро и грязно

Самое простое решение - просто убедиться, что приложение, для которого вы устанавливаете службу (в моем конкретном примере, 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")

Это создает FileSystemAccessRule (которое я называю $fsarв коде), который позволяет IdentityReference NT AUTHORITY\LOCAL SERVICE читать и выполнять (и синхронизировать, побочный эффект этого) любой файл / папку, к которой применяется правило, и его дочерние элементы с помощью флагов наследования "ContainerInherit,ObjectInherit"в сочетании с PropagationFlag "InheritOnly". "Разрешить" устанавливает разрешающее правило (любой примененный запрет отменяет его, но это вряд ли произойдет).

Теперь мы хотим применить это правило доступа к папке, в которую мы установили Tor. Первый шаг - получить существующий ACL (чтобы мы не испортили то, что было изначально) с помощью Get-Acl. Второй шаг просто добавляет это правило доступа к объекту, который мы сохранили в переменной. Третий шаг передает список управления доступом, который мы изменили, в команду Set-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

Я надеюсь, что хотя бы один или два человека извлекут какую-то пользу из этого дополнительного ответа. Если нет, я уверен, что вернусь сюда через год или два и сам воспользуюсь им, когда я неизбежно забуду, как я сделал это в первый раз...

Другие вопросы по тегам