Пакетные файлы, скрипты Powershell, PSExec и системный пользователь
Я пытаюсь установить мониторинг планировщика заданий Windows, у меня есть скрипт Powershell, который запускает следующее:
$serverName = hostname
$schedule = new-object -com("Schedule.Service")
$schedule.connect($serverName)
$tasks = $schedule.getfolder("\").gettasks(0)
$tasks |select name, lasttaskresult, lastruntime
Это возвращает список запланированных задач на сервере, на котором он запущен, результат последней задачи и время последнего выполнения. Цель этого - вернуть набор данных в наше решение для мониторинга (Geneos), которое мы можем использовать для оповещения.
У нас большое состояние Win2008, поэтому я хочу, чтобы скрипт был централизованным, позволяя любому из зондов Geneos вызывать его и возвращать набор данных для своего хоста. Для этого я завернул PowerShell в файл.bat, который выполняет следующие действия:
\\fileserverhk\psexec.exe -accepteula -u admin -p "pwd" powershell.exe cpi \\fileserverhk\scripts\TaskSchedulerMonitor.ps1 -Destination C:\Monitor\TaskSchedulerMonitor.ps1
\\fileserverhk\psexec.exe -accepteula -u admin -p "pwd" powershell.exe -ExecutionPolicy Bypass -File C:\Monitor\TaskSchedulerMonitor.ps1
Первый шаг копирует файл.ps1 локально, чтобы обойти Powershell, не доверяющий UNC-путям, а вторая часть запускает скрипт.
Если я запускаю файл.bat вручную с тестового сервера, он работает нормально (он зарегистрирован под учетной записью администратора). Однако, когда я запускаю файл.bat через Geneos (который запускается под учетной записью SYSTEM), я получаю:
Access is denied.
PsExec could not start powershell.exe:
Поэтому, в основном, мой вопрос: как заставить PsExec переключать пользователя, когда он запускается под учетной записью SYSTEM? Несмотря на то, что PsExec имеет учетные данные, установленные для другой учетной записи, очевидно, что есть что-то, что препятствует его изменению при запуске под системой.
Я прочитал, чтобы попробовать запустить его с ключом -h, но я получаю следующую ошибку:
The handle is invalid.
Connecting to local system...
Starting PsExec service on local system...
Connecting with PsExec service on <server>...
Starting powershell.exe on <server>...
Error communicating with PsExec service on <server>:
В дополнение к вышеприведенной ошибке, я получаю процессы PSExec и powershell, подвешенные на удаленной машине. Интересно то, что я вижу, что PSExec и PSEXEC.SVC работают под SYSTEM, а powershell работает под администратором, так что он почти у цели, но что-то не так.
1 ответ
Нам удалось добраться с помощью оболочки PowerShell по команде Windows Schtasks ( ссылка здесь). Schtasks может быть запущен под учетной записью SYSTEM и будет возвращать всю необходимую информацию о задачах, поэтому нам больше не нужно копаться в разрешениях и больше нет паролей в виде открытого текста в среде (бонус).
Мы завернули:
schtasks.exe Query /FO CSV
в сценарии powershell и использовал PS для форматирования вывода в стиле csv, ожидаемом Geneos.