Как запустить приложение в существующей сессии

Вопрос или проблема

Когда запускается запланированное задание, я хотел бы открыть окно 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 нет, но вы можете воспользоваться следующей альтернативой:

  1. Сохраните идентификатор процесса (PID) PowerShell:

    $pidPowerShell = $p.Id
  2. Используйте метод 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. Главное, корректно управлять запущенными процессами и завершать их, чтобы избежать неожиданных проблем. Данный подход не только упрощает мониторинг задач, но и повышает эффективность работы как администраторов, так и пользователей. Разработка четкого процесса запуска и завершения задач гарантирует надежную и безопасную работу вашей системы.

Оцените материал
Добавить комментарий

Капча загружается...