Моя цель - запустить простой скрипт AutoHotKey на компьютере с Windows 10 с хоста Ubuntu в той же частной сети. После поиска в Google я нашел winexe, который звучал так, как будто он мог делать то, что я хочу, но после многих испытаний мне не удалось подключить его к Windows 10 («Не удалось открыть соединение - NT_STATUS_CONNECTION_RESET», дальнейшее поиск в Google не помогло). В качестве второго решения я установил SSH-сервер на Windows-машине (Bitvise SSH Server). Теперь я могу войти из Ubuntu через ssh в Windows или просто запустить команды на компьютере с Windows:

$ ssh user@windowsmachine command

Это работает для обычных команд, таких как DIR, MKDIR, ... но не работает для скриптов AutoHotKey. Например, с

$ ssh user@windowsmachine 'C:\path\to\script.ahk'

на компьютере с Windows ничего не происходит (запускается локально, этот тестовый скрипт просто показывает окно приветствия). Следующие попытки также не работают:

$ ssh user@windowsmachine '"C:\Program Files\AutoHotkey\AutoHotkey.exe" C:\path\to\script.ahk'
$ ssh user@windowsmachine 'cmd.exe /c C:\path\to\script.ahk'

ОБНОВЛЕНИЕ: уловка почти работает. Например, он запускает calc.exe:

$ ssh user@windowsmachine calc.exe

Но если я запускаю notepad.exe или любое другое приложение, я вижу их в диспетчере задач, работающем как фоновые процессы, без графического интерфейса. (Я не знаю, что такого особенного в кальке. Отлично, что работает нормально). Мне также удалось исправить проблему с winexe, но ситуация абсолютно такая же, как с ssh - кроме calc.exe, все приложения с графическим интерфейсом запускаются как фоновые процессы. Эта проблема обсуждается здесь. Итак, суть в том, что для запуска приложений с графическим интерфейсом в Windows 10 с хоста Linux требуются огромные усилия. Поэтому я просто написал свое собственное маленькое клиент-серверное приложение в Qt 5, которое прослушивает определенный порт и запускает соответствующие приложения / сценарии, когда пользовательская команда получена от другого хоста.

1 ответ1

1

Windows использует сеансы для отображения приложений с графическим интерфейсом для пользователей. Ваш ssh-сервер, вероятно, является службой Windows, запущенной пользователем SYSTEM в сеансе 0, который не имеет графического отображения. Таким образом, вы не увидите GUI приложений, которые вы запускаете.

Вы можете проверить это с помощью Sysinternals Process Explorer. После запуска (от имени администратора) щелкните правой кнопкой мыши панель столбцов, нажмите "выбрать столбцы" и добавьте "Сеанс", "Доступ к пользовательскому интерфейсу", "Имя пользователя" и "Уровень целостности". Эта информация покажет вам для каждого процесса, в каком контексте это приложение выполняется ("Сеанс"), показывает ли оно окно ("Доступ к пользовательскому интерфейсу"), под какой учетной записью выполняется ("Имя пользователя") и с какими разрешениями ("Уровень целостности", высокий означает как администратор).

Теперь, если вы хотите выполнить приложение с вашего ssh-сервера в сеансе пользователя, вы можете сделать это с помощью другой утилиты Sysinternals, которая называется PsExec: psexec -i <session number> -accepteula <application to execute> . Если вы хотите, чтобы процесс запускался с вашим обычным пользователем, вы также можете использовать параметр -u и при желании вы можете удалить разрешения с помощью -l . Проверьте помощь в запуске psexec -? ,

Чтобы узнать номер вашей сессии, вы также можете запустить команду qwinsta . Таким образом, вам не нужно приложение GUI Process Explorer.

Например, чтобы запустить калькулятор, выполните следующие действия: В сеансе ssh запустите qwinsta , что должно дать вам что-то похожее на это:

C:\>qwinsta
SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
services                                    0  Disc
console           john.doe                  1  Active

Таким образом, ваша сессия, которую вы хотели бы использовать, равна 1 в этом примере (она может отличаться для вас). Затем выполните psexec -i 1 -accepteula calc.exe . Теперь калькулятор должен появиться на вашем рабочем столе. (-accepteula абсолютно необходима при первом запуске приложения. Без этого приложение покажет вам лицензионное соглашение в окне графического интерфейса, которое, разумеется, не будет отображаться по указанным выше причинам. При последующих вызовах вы можете игнорировать параметр, так как после принятия окно GUI больше не будет отображаться)

Если вы префиксите свою команду autohotkey.exe командой psexec как описано выше, я ожидаю, что скрипт будет работать, но я не могу проверить это сам, так как я не знаю этого приложения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .