Перш ніж мене збити, я знаю, як запланувати завдання, перезапустити службу за допомогою повноважень або надати правам облікового запису, який не є адміністратором, для перезавантаження служби. Це не проблема. Однак проблема полягає у поєднанні всіх цих трьох завдань у поєднанні.
У мене є служба Windows, якій потрібно обробляти файли в мережевій папці. Тому він входить у систему "облікового запису послуги", який фактично є лише звичайним обліковим записом домену. Цей обліковий запис домену не є адміністратором, але має права доступу до вказаної папки. Сервіс працює нормально і робить свою роботу.
Однак іноді в одному з файлів є помилка, яка не дозволяє обробляти інші файли. Зазвичай, хтось помічає, якийсь час помічає, і є відставання.
Отже, я створив скрипт моніторингу в powershell, який опитує мережеву папку для цих помилкових файлів. Якщо вони знайдені, файли переміщуються у тимчасову папку для перегляду, і сервіс потрібно перезапустити.
Я надав привілеї облікового запису служби через групову політику для запуску та припинення послуги.
Коли я входжу на сервер за допомогою облікового запису послуги, я можу перезапустити службу вручну за допомогою сервісу MMC. Я також в змозі виконати скрипт повноважень, і він робить саме те, що повинен робити: опитувати папку, переміщувати файли та перезапускати службу. Чудово!
На наступному етапі я створив планове завдання, яке виконується кожні 10 хвилин. Завдання використовує той самий обліковий запис служби, що і служба для виконання сценарію оболонки повноважень. Поле "Виконати з найвищими привілеями" встановлено. Як я вже говорив, сценарію повноважень потрібен доступ до мережевого накопичувача, тому я не можу запустити його як адміністратор локального сервера, і я не хочу використовувати облікові дані адміністратора домену для такого завдання, як це. (Я намагаюся максимально реалізувати принцип найменшої пільги.)
Я надав правам на обліковий запис служби "вхід як пакетна робота" на локальному сервері за допомогою ММС локальної політики безпеки.
Тепер про частину, яку я не можу з’ясувати: у запланований час заплановані завдання успішно виконуються і сценарій повноважень виконується. Сценарій опитує папку і файли помилок переміщуються. Єдине, що не працює - це перезапуск послуги ...?! Знову ж, запуск сценарію вручну, оскільки той самий користувач працював чудово.
Я не бачу багато в переглядачі подій, але при реєстрації в моєму сценарії зазначена помилка:
TerminatingError (Stop-Service): "Не вдається відкрити диспетчер управління сервісом на комп'ютері". "Ця операція може вимагати інших привілеїв."
Команди, які використовую для перезапуску послуги, є:
Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])
(Я використовую Windows Server 2012 R2 та паттерн версії 4 версії домену R2 2008 року.)
Оновлення: я обидва намагався налаштувати сервісні дозволи для користувача за допомогою 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 на віддаленому комп’ютері, і ваше повідомлення про помилку може бути пов’язане зі спробою підключення до "віддаленого" localhost "." (<== це крапка там.)