Запланированный перезапуск службы с помощью Powerhshell в качестве учетной записи службы без прав администратора

11

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

У меня есть служба Windows, которая должна обрабатывать файлы в сетевой папке. Поэтому он входит в систему с «учетной записью службы», которая на самом деле является обычной учетной записью домена. Эта учетная запись домена не является администратором, но имеет права доступа к указанной папке. Сервис работает нормально и делает свое дело.

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

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

Я дал привилегии учетной записи службы через групповую политику для запуска и остановки службы.

введите описание изображения здесь

Когда я вхожу на сервер с учетной записью службы, я могу перезапустить службу вручную с помощью службы MMC. Я также могу выполнить скрипт powershell, и он делает именно то, что должен: опрашивать папку, перемещать файлы и перезапускать сервис. Большой!

На следующем этапе я создал запланированное задание, которое запускается каждые 10 минут. Задача использует ту же учетную запись службы, что и служба, для выполнения сценария powershell. Флажок «Выполнить с самыми высокими привилегиями» отмечен. Как я уже сказал, сценарию powershell необходим доступ к сетевому диску, поэтому я не могу запустить его в качестве администратора локального сервера и не хочу использовать учетные данные администратора домена для такой сложной задачи, как эта. (Я стараюсь максимально реализовать принцип наименьших привилегий.)

Я предоставил учетной записи службы права «вход в систему как пакетное задание» на локальном сервере, используя MMC Local Security Policy.

Теперь для части, которую я не могу понять: в запланированное время запланированные задачи успешно завершаются, и выполняется сценарий powershell. Скрипт опрашивает папку и файлы ошибок перемещаются. Единственное, что не работает, это перезапуск службы ...?! Опять же, запуск сценария вручную, поскольку тот же пользователь работал отлично.

Я не вижу много в просмотрщике событий, но вход в мой сценарий утверждает эту ошибку:

TerminatingError (Stop-Service): «Не удается открыть диспетчер управления службами на компьютере». 'Для этой операции могут потребоваться другие привилегии. "

Команды, которые я использую для перезапуска службы:

Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])

(Я использую windows server 2012 R2 и powershell версии 4 в домене 2008 R2.)

Обновление: я оба попытался установить служебные разрешения для пользователя, используя subinacl (как описано здесь ) и вручную установить строку SDDL (как описано здесь ), поэтому мои контрольные флаги выглядят так (A ;; CCLCSWRPWPDTLOCRRC ;;; S-1- X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX). Я также попытался установить для привилегий службы полный контроль в объекте групповой политики. Ни один из них также не решил проблему. Это должно быть проблема с привилегиями где-то, что я все еще пропускаю, потому что, когда я планирую задачу с учетной записью домена, которая является локальным администратором на сервере, она работает просто отлично.

VolrathTheFallen
источник
Это может быть полезно: serverfault.com/questions/357424/… кажется, PowerShell очень требователен к разрешениям, а не к очевидным
Drifter104
@ Drifter104: Несмотря на то, что я использую GPO для установки разрешений для службы, а не для subinacl, я все равно попробовал с параметрами STOE, но все еще вижу тот же результат. Дважды проверил мои настройки объекта групповой политики, и у них также включена опция Enumerate Dependent Services.
VolrathTheFallen
@ MyronSemack-msemack Я попытался установить строку SDDL для службы вручную, как описано в статье, но все же не повезло, я думаю, что в конечном итоге GPO и subinacl делают одно и то же, поскольку они, кажется, перекрывают одно и другое.
VolrathTheFallen
1
Как насчет попытки Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....вместо Stop-ServiceCmdLet? Stop-Service и Start-Service, по-видимому, не могут удаленно работать согласно этому ответу: Не удается использовать Get-Service –ComputerName на удаленном компьютере, и ваше сообщение об ошибке может быть связано с попыткой подключения к «удаленному» локальному узлу ». ' (<== это точка там.)
Джон aka hot2use

Ответы:

3

Anwser на другой вопрос решен мой вопрос , как хорошо.

Шаги, которые я сделал, были:

  1. enable-psremoting на сервере в командной строке администратора PowerShell
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI на сервере в командной строке администратора PowerShell
  3. Добавлена ​​учетная запись службы (или группа безопасности) с полными привилегиями
  4. sc sdshow scmanager на сервере в командной строке администратора
  5. Скопируйте вывод SDDL
  6. Добавьте (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)в SDDL перед S: part
  7. sc sdset scmanager THE_MODIFIED_SDDL мой выглядел так: sc sdset scmanager D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;KA;;;S-1-X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
  8. Измените мой скрипт powershell, чтобы он использовал Start-ServiceCmdLet вместо Set-Service(Set-Service не работал).

Похоже, что-то простое оказалось способом, гораздо сложнее, чем следовало бы ...

VolrathTheFallen
источник