У нас есть сценарий 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)
Можете ли вы также попробовать эту одноразовую команду, чтобы определить, работает ли она, и подтвердили ли вы, что пользователь является членом группы, которая является членом группы «Пользователи» на целевых серверах?