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

Как предоставить разрешения на удаленный запуск / остановку службы с помощью Powershell?

У нас есть сценарий PowerShell, который перезапускает службу на другом компьютере. Когда мы используем встроенные командлеты управления службами PowerShell, например:

$svc = Get-Service -Name MyService -ComputerName myservicehostname
Stop-Service -InputObject $svc
Start-Service -InputObject $svc

Мы возвращаем эту ошибку:

Stop-Service: не удается открыть службу MyService на компьютере myservicehostname.

Однако, когда мы используем sc.exe, например:

C:\Windows\System32\sc \\myservicehostname stop MyService
C:\Windows\System32\sc \\myservicehostname start MyService

начало и конец успешны.

Пользователь, выполняющий перезапуск, не администратор. Мы используем subinacl, чтобы предоставить пользователю разрешения на запуск / остановку и запрос службы:

subinacl.exe /service MyService /GRANT=MyServiceControlUser=STO

Почему PowerShell не может остановить мою службу, но sc.exe жестяная банка?

Оказывается Я не давал достаточно разрешений с subinacl. Возможные значения доступа для действия предоставления:

    F : Full Control  
    R : Generic Read  
    W : Generic Write  
    X : Generic eXecute  
  or any following values  
    L : Read controL  
    Q : Query Service Configuration  
    S : Query Service Status  
    E : Enumerate Dependent Services  
    C : Service Change Configuration  
    T : Start Service  
    O : Stop Service  
    P : Pause/Continue Service  
    I : Interrogate Service  
    U : Service User-Defined Control Commands  

Я использовал S (Статус службы запросов), Т (Запустить службу) и О (Остановить службу). Мне также понадобился E (Перечислить зависимые службы). Похоже, что командлеты PowerShell должны смотреть на зависимые службы при запуске / остановке.

Вот мой обновленный subinacl команда:

subinacl.exe /service MyService /GRANT=MyServiceControlUser=STOE

Если вы не хотите скачивать / использовать subinacl.exe, вы можете использовать PowerShell через Углерод модуль Grant-ServiceControlPermission или Грант-Сервис функции. (ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я являюсь владельцем / сопровождающим проекта Carbon.)

Следующая команда работает должным образом на моем компьютере с Windows Server 2008 R2.

Start-Service -InputObject $(Get-Service -Computer [ComputerName] -Name spooler)  

Можете ли вы также попробовать эту одноразовую команду, чтобы определить, работает ли она, и подтвердили ли вы, что пользователь является членом группы, которая является членом группы «Пользователи» на целевых серверах?