Назад | Перейти на главную страницу

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

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

[SC] StartService FAILED 5:

Доступ запрещен.

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

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

Поскольку это служба .NET, она была установлена ​​с использованием InstallUtil.exe (запустить от имени администратора). Служба настроена для работы как СЕТЕВАЯ СЛУЖБА, но я также пробовал ее с ЛОКАЛЬНОЙ СЛУЖБОЙ.

Это было связано с тем, что по умолчанию ни СЕТЕВАЯ СЛУЖБА, ни ЛОКАЛЬНАЯ СЛУЖБА не имеют разрешений на чтение из каталога, в котором находится исполняемый файл моей службы. Мне нужно было предоставить им права чтения в папке (по крайней мере).

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

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

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

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