Прежде чем меня уволят, я знаю, как запланировать задачу, перезапустить службу с 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). Я также попытался установить для привилегий службы полный контроль в объекте групповой политики. Ни один из них также не решил проблему. Это должно быть проблема с привилегиями где-то, что я все еще пропускаю, потому что, когда я планирую задачу с учетной записью домена, которая является локальным администратором на сервере, она работает просто отлично.
Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....
вместо Stop-Service
CmdLet? Stop-Service и Start-Service, по-видимому, не могут удаленно работать согласно этому ответу: Не удается использовать Get-Service –ComputerName на удаленном компьютере, и ваше сообщение об ошибке может быть связано с попыткой подключения к «удаленному» локальному узлу ». ' (<== это точка там.)