Хобрук: Ваш путь к мастерству в программировании

CloseMainWindow не работает в команде вызова

Я хочу остановить приложение winform на удаленном компьютере из локального сценария powershell, но функция CloseMainWindow не работает

--- Это локальная команда для подключения удаленного сервера для выполнения closeApp.ps1, который хранится на сервере--

$remoteSession = New-PSSession -computerName 'xxx' -credential $cred  
Invoke-Command -session $remoteSession -command {F:\AutoDeployment\closeApp.ps1}  
Remove-pSSession -session $remoteSession 

--- Это основное содержимое файла closeApp.ps1, который получает активный процесс и пытается его закрыть--

$app = Get-Process AppName -ErrorAction SilentlyContinue  
if($app)  
{  
  $app.MainWindowTitle  
  $app.CloseMainWindow()  
}  

Я ожидаю, что это должно действовать как локальный, который должен правильно закрыть приложение.

Но теперь он возвращает null для строки mainWindowTitle и False для строки closeMainWindow. Этот скрипт отлично работает, если выполняется напрямую на сервере, но когда он выполняется через invoke-command, MainWindow кажется недействительным и не работает.

Я вызываю эту команду через плагин jenkins powershell

Обновления:

Нет журнала ошибок через invoke-command для closeMainWindow, но он всегда возвращает «False», который должен быть «True».

Более того, у меня есть еще один шаг, который попытается отправить ключевые действия, чтобы остановить это приложение, если closeMainWindow не удалось. Я использую [System.Windows.Forms.SendKeys]::SendWait для этого. Он также работает локально, но не работает через invoke-command на сервере с журналом:

журнал ошибок для sendkeys:

Exception calling "SendWait" with "1" argument(s): "Access is denied" + CategoryInfo : NotSpecified: (Exception calli...cess is denied":String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError

08.12.2017

Ответы:


1

Я подозреваю, что сборки для Winforms не загружаются во время удаленного вызова и в результате у вас нет доступной функции CloseMainWindow. Попробуйте загрузить сборки явно, как в:

Add-Type -AssemblyName System.Windows.Forms
$Form = New-Object system.Windows.Forms.Form

Поскольку вы не предоставили достаточно информации о кодах ошибок, вы можете попробовать следующее, чтобы исключить ограничение политики выполнения, обойдя его для этого запуска:

$remoteSession = New-PSSession -computerName 'xxx' -credential $cred

Invoke-Command -session $remoteSession -command {powershell.exe -execution Bypass -file 'F:\AutoDeployment\closeApp.ps1'}

Remove-pSSession -session $remoteSession
08.12.2017
  • Спасибо за комментарий, но на самом деле closeMainWindow является функцией класса Process вместо Forms, хотя я добавил загрузку сборки в свои сценарии для «System.Windows.Forms» и «Microsoft.VisualBasic» для дальнейшего использования, но он все еще возвращает False на closeMainWindow 11.12.2017

  • 2

    Я думаю, что понял, почему эта проблема возникла сейчас, и надеюсь, что это поможет кому-нибудь.

    Windows просто предотвращает любые удаленные действия для вызова интерактивного процесса (насколько я знаю), поэтому каждый раз, когда я пытаюсь запустить процесс через invoke-command на удаленном компьютере, он просто запускает «призрачный» процесс, и он невидим. Поэтому я думаю, что именно поэтому я не могу правильно использовать функцию closeMainWindow, потому что она связана с пользовательским интерфейсом.

    Моя цель - сделать что-то (отправить ключи) видимой программе на удаленном компьютере для автоматического развертывания, поэтому я считаю, что единственный способ - использовать schtasks для планирования действий на удаленном компьютере и позволить удаленному выполнению части пользовательского интерфейса. Теперь это отлично работает для меня.

    19.12.2017
    Новые материалы

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..

    Раскрытие возможностей НЛП: часть речевой маркировки и ее проблемы
    В сфере обработки естественного языка (NLP) маркировка частей речи (POS) выступает в качестве фундаментального метода, позволяющего компьютерам понимать и анализировать человеческий язык на..

    Под поверхностью: раскрытие деталей системы с помощью инструментов Linux CLI
    Чем больше вы изучаете Linux и продвигаетесь вперед, тем больше вам нужно проверять информацию о вашей системе. Эта информация может касаться аппаратного обеспечения, такого как процессор,..

    Как реализовать линейную регрессию в JavaScript
    Узнайте, как реализовать линейную регрессию в JavaScript с помощью ML.js Линейная регрессия — это метод машинного обучения, используемый для моделирования связи между зависимой переменной и..