"Отказано в доступе" при попытке запустить службу, даже если запущен Администратор / повышен
Я использую 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
Я надеюсь, что хотя бы один или два человека извлекут какую-то пользу из этого дополнительного ответа. Если нет, я уверен, что вернусь сюда через год или два и сам воспользуюсь им, когда я неизбежно забуду, как я сделал это в первый раз...