Execute o comando / script no Windows 10 remotamente a partir da máquina Linux

0

Meu objetivo é lançar um simples script AutoHotKey na máquina Windows 10 do host Ubuntu dentro da mesma rede privada. Após googling, eu encontrei o winexe , que soou como se pudesse fazer o que eu quero, mas depois de muitas tentativas, eu não consegui conectá-lo para o Windows 10 ("Falha ao abrir conexão - NT_STATUS_CONNECTION_RESET", googling adicional não ajudou). Como segunda solução, instalei o servidor SSH na máquina Windows (Bitvise SSH Server). Agora posso fazer o login do Ubuntu via ssh para o Windows ou apenas executar comandos na máquina Windows:

$ ssh user@windowsmachine command

Isso funciona para comandos regulares como DIR, MKDIR, ... mas não funciona para scripts AutoHotKey. Por exemplo, com

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

nada acontece na máquina Windows (iniciado localmente, este script de teste mostra apenas uma caixa de mensagem de saudação). As seguintes tentativas também não funcionam:

$ 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'

ATUALIZAÇÃO: O truque quase funciona. Por exemplo, ele inicia o calc.exe:

$ ssh user@windowsmachine calc.exe

Mas se eu iniciar o notepad.exe ou qualquer outro aplicativo, eu os vejo no gerenciador de tarefas executando como processos em segundo plano, sem GUI. (Eu não sei wjat tão especual sobre calc. Exe que funciona normalmente). Eu também consegui consertar o problema com o winexe, mas a situação é absolutamente a mesma do ssh - exceto o calc.exe, todos os aplicativos GUI são lançados como processos em segundo plano. Este problema é discutido aqui . Portanto, o importante é que é preciso um esforço enorme para executar aplicativos GUI no Windows 10 a partir do host Linux. Então, eu acabei de escrever meu próprio aplicativo cliente-servidor no Qt 5, que escuta uma determinada porta, e executa aplicativos / scripts correspondentes quando um comando definido pelo usuário é recebido de outro host.

    
por ThisGuy 02.12.2017 / 16:20

1 resposta

1

O Windows está usando sessões para exibir aplicativos de GUI para os usuários. Seu servidor ssh é provavelmente um serviço do windows executado pelo usuário SYSTEM na sessão 0, que é sem uma exibição gráfica. Assim, você não verá as GUIs dos aplicativos que você está iniciando.

Você pode verificar isso com o Gerenciador de processos da Sysinternals . Após iniciá-lo (como admin), clique com o botão direito do mouse na barra de colunas, clique em "selecionar colunas" e adicione "Sessão", "Acesso à interface do usuário", "Nome de usuário" e "Nível de integridade". Essas informações mostrarão para cada processo em que contexto o aplicativo está sendo executado ("Sessão"), se ele mostra uma janela ("Acesso à UI"), sob qual conta é executada ("Nome de usuário") e com quais permissões ( "Integrity Level", high significa como admin ).

Agora, se você gostaria de executar um aplicativo do seu servidor ssh em sua sessão de usuário, você pode fazê-lo com outro utilitário Sysinternals que é chamado PsExec : psexec -i <session number> -accepteula <application to execute> . Se você quiser que o processo seja executado com seu usuário normal, você também pode usar o parâmetro -u e pode remover permissões com -l , se desejar. Verifique a ajuda executando psexec -? .

Para descobrir o número de suas sessões, você também pode executar o comando qwinsta . Dessa forma, você não precisa do aplicativo GUI do Process Explorer.

Por exemplo, para executar a calculadora, faça o seguinte: Em uma sessão ssh, execute qwinsta , que deve fornecer algo semelhante a isso:

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

Assim, a sua sessão que você gostaria de usar é 1 neste exemplo (pode ser diferente para você). Em seguida, execute psexec -i 1 -accepteula calc.exe . A calculadora deve agora aparecer na sua área de trabalho. (o -accepteula é absolutamente necessário na primeira execução do aplicativo. Sem isso, o aplicativo mostrará o contrato de licença em uma janela da GUI, que - é claro - não será exibida pelos motivos mencionados acima. Em chamadas subseqüentes, você pode ignorar o parâmetro, já que uma vez aceito, a janela da GUI não aparecerá novamente.

Se você prefixar o comando autohotkey.exe com psexec , conforme explicado acima, esperaria que o script funcionasse, mas não posso testá-lo sozinho, pois não conheço esse aplicativo.

    
por 06.12.2017 / 17:11