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

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

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

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

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

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

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

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

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

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

Теперь о части, которую я не могу понять: в запланированное время запланированные задачи успешно завершаются и выполняется сценарий 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). Я также попытался установить привилегии службы на «Полный доступ» в GPO. Ничего из этого также не решило проблему. Это должно быть проблема с привилегиями где-то я все еще не замечаю этого, потому что, когда я планирую задачу с учетной записью домена, которая является локальным администратором на сервере, она работает нормально.

В ответьте на другой вопрос решил мою проблему.

Я сделал следующие шаги:

  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:
  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-Service CmdLet вместо Set-Service (Set-Service не работал).

Похоже, получилось что-то простое, НАМНОГО сложнее, чем должно было быть ...