Вопрос или проблема
Когда запускается запланированное задание, я хотел бы открыть окно Powershell на своем рабочем столе, чтобы отслеживать файл журнала и наблюдать за процессом. Конкретно, я хотел бы, чтобы задание открыло окно на моем рабочем столе и выполнило Get-Content C:\LogFile.txt -Wait
. Когда задание завершится, я хотел бы, чтобы оно закрыло окно powershell.
Есть ли способ запустить графическое окно от имени другого пользователя? Насколько я понял, большинство команд будет выполняться с привилегиями указанного пользователя, но не создаст окно на их рабочем столе.
Было бы еще лучше, если бы оно запускалось от имени того пользователя, который вошел в систему, когда задание начинается, а не от жестко закодированного пользователя.
ИЗМЕНЕНИЕ: Пока у меня есть код ниже. Он работает в определенной степени. Он создает окно для отслеживания, но когда я вызываю $p.kill()
, он завершает процесс psexec, но не процесс powershell. Могу ли я отправить Ctrl-C
в окно powershell?
# начать отслеживание журнала
$psexec="c:\psexec.exe"
$arguments="-i powershell.exe -windowstyle maximized -command "& {get-content c:\logs\task_log.log -wait}""
$p = start-process $psexec -argumentlist $arguments -passthru
# запустить задание
Some-task.exe
# убить отслеживание
$p.kill()
Сначала вам потребуется PSExec.exe, он бесплатный и предоставляется группой sys internals. Вам нужна команда, подобная этой:
psexec \\RemoteComputer "%systemroot%\system32\windowspowershell\v1.0\powershell.exe" -u username -p password -i -h
Читайте справочный файл PSExec и экспериментируйте с настройками. Вам больше всего интересен переключатель ‘-i’, так как он указывает на сессию, с которой нужно взаимодействовать. Просто используя ‘-i’ без идентификатора сессии (как в примере), psexec просто выбирает один. Если доступной сессии нет, он использует сессию 0.
Вы можете даже обнаружить, что командлеты New-PSSession
и Enter-PSSession
в PowerShell лучше подходят для ваших нужд. На вашем компьютере выполните следующее в PowerShell:
$Session = New-PSSession -ComputerName computer.domain.com
Enter-PSSession -Session $Session
Когда вы выполняете эти команды, ваш терминал на вашем компьютере становится терминалом на удаленном компьютере. Команды, которые вы вводите в удаленной сессии, выполняются на удаленном компьютере, а вывод передается обратно на ваш. Когда вы закончите, введите команду Exit-PSSession
, чтобы вернуться в свою сессию.
Ответ или решение
Запуск приложения в существующей сессии: Решение для создания интерактивного окна PowerShell
В этой статье мы обсудим, как запустить окно PowerShell в существующей пользовательской сессии для мониторинга лог-файла с помощью команды Get-Content
. Мы также рассмотрим, как корректно закрыть окно PowerShell после завершения выполняемой задачи.
Шаг 1: Установка необходимых инструментов
Для начала вам понадобится PSExec, бесплатная утилита от группы Sysinternals, которая позволяет запускать процессы на удалённых машинах и в интерактивных сессиях. Убедитесь, что утилита доступна на вашем компьютере.
Шаг 2: Запуск PowerShell в интерактивной сессии
Используя команду PSExec, можно запустить PowerShell в интерактивной сессии пользователя на рабочем столе. Вот пример команды, которую вы можете использовать:
$psexec = "c:\psexec.exe"
$arguments = "-i powershell.exe -windowstyle maximized -command "& {Get-Content C:\LogFile.txt -Wait}""
$p = Start-Process $psexec -ArgumentList $arguments -PassThru
Несколько ключевых моментов:
- Параметр
-i
указывает на то, что процесс должен взаимодействовать с текущей сессией пользователя. - Используйте
-windowstyle maximized
, чтобы открыть окно PowerShell в развернутом режиме.
Шаг 3: Запуск вашей задачи
После того как вы успешно запустили окно PowerShell для мониторинга лога, следующим шагом будет запуск самой задачи, например, Some-task.exe
:
Some-task.exe
Шаг 4: Корректное завершение работы PowerShell
Для завершения работы PowerShell вы можете использовать метод $p.Kill()
. Однако это может не привести к корректному завершению процесса PowerShell, поскольку он воспринимает это как убийство самого процесса, не давая ему возможности завершить выполнение команд.
Лучший способ — это отправить сочетание клавиш Ctrl+C
в окно PowerShell. К сожалению, встроенного способа отправки Ctrl+C
через PowerShell нет, но вы можете воспользоваться следующей альтернативой:
-
Сохраните идентификатор процесса (PID) PowerShell:
$pidPowerShell = $p.Id
-
Используйте метод
Stop-Process
для корректного завершения:Stop-Process -Id $pidPowerShell -Force
Альтернативные подходы
Если вы ищете более современный подход, то можете рассмотреть использование командлетов PowerShell для управления сессиями, таких как New-PSSession
и Enter-PSSession
. Эти команды обеспечивают возможность взаимодействия с удаленной системой:
$Session = New-PSSession -ComputerName computer.domain.com
Enter-PSSession -Session $Session
Заключение
Запуск интерактивного окна PowerShell для наблюдения за логами в существующей сессии может быть выполнен с использованием PSExec. Главное, корректно управлять запущенными процессами и завершать их, чтобы избежать неожиданных проблем. Данный подход не только упрощает мониторинг задач, но и повышает эффективность работы как администраторов, так и пользователей. Разработка четкого процесса запуска и завершения задач гарантирует надежную и безопасную работу вашей системы.