Прежде чем меня расстреляют, я знаю, как запланировать задачу, перезапустить службу с помощью 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. Ничего из этого также не решило проблему. Это должно быть проблема с привилегиями где-то я все еще не замечаю этого, потому что, когда я планирую задачу с учетной записью домена, которая является локальным администратором на сервере, она работает нормально.
В ответьте на другой вопрос решил мою проблему.
Я сделал следующие шаги:
enable-psremoting
на сервере в командной строке администратора PowerShellSet-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI
на сервере в командной строке администратора PowerShellsc sdshow scmanager
на сервере в командной строке администратора(A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)
в SDDL перед частью S: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)
Start-Service
CmdLet вместо Set-Service
(Set-Service не работал).Похоже, получилось что-то простое, НАМНОГО сложнее, чем должно было быть ...