Existe uma sessão “Running in terminal session”?

3

O Windows fornece vários shims para corrigir erros e limitações nos programas.

Os calços podem mentir para um programa sobre todos os tipos de coisas

  • mentir sobre a versão do Windows
  • mentir sobre uma operação de arquivo com falha
  • mentir sobre uma chave de registro que não pôde ser aberta

Existe alguma dificuldade em mentir sobre o software sendo executado a partir de uma sessão de terminal (por exemplo, área de trabalho remota) ?

Eu tenho um software que detecta se está sendo executado em uma sessão de terminal e muda seu comportamento de acordo. Outra parte do software recusa-se a ser executado porque diz-se que não é suportado de forma semelhante.

E como um programa que se recusa a rodar em algo mais alto que o Windows 2000, ele pode rodar bem - se apenas se der uma chance.

Existe um " sessão de terminal " shim?

Imagine o psuedocode que contém:

static class Program
{
   if (System.Windows.Forms.SystemInformation.TerminalServerSession)
   {
       System.Environment.FastFail("We're too lazy to make our software work under TS.");
   }
   ...
}

Outras aplicações mudam seu comportamento em uma sessão de terminal:

//Don't enable animations if we're in a TS window, or on battery
Boolean animationsEnabled = 
        (!System.Windows.Forms.SystemInformation.TerminalServerSession)
        &&
        (System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus != 
               PowerLineStatus.Offline);

Eu quero que o Windows minta o aplicativo, para que ele não ache que ele esteja sendo executado em uma Sessão de Terminal / Área de Trabalho Remota.

Isso é semelhante a como outros programas não sabem como escrever código de verificação de versão e, portanto, falhar em algo mais recente que o Windows XP:

static class Program
{
   //Make sure we're on Windows 5.0 or later:
   if (!(WinMajorVersion >= 5) && !(WinMinorVersion >= 0))
       FastFail("Requires Windows XP or later");
}

O prompty do código acima falha no Windows versões 6.0 - que é exatamente o motivo pelo qual os shims de mentiras da versão existem.

    
por Ian Boyd 28.07.2009 / 16:06

3 respostas

4

Eu não acredito que isso seja possível. O código de sinalização específico que seu programa provavelmente está examinando é o sinalizador SM_REMOTESESSION . Como SQLChicken apontou, você pode derrotar isso para um único usuário, tentando pegar a sessão do console, o que vai deixar você com SM_REMOTESESSION = 0 , mas para vários usuários, eu não acho que isso possa ser feito.

Aprecio que isso seja frustrante, mas você provavelmente terá que trabalhar com o fornecedor do programa para resolver isso. É um monte de trabalho corrigir software que se comporta mal sob TS, uma vez que geralmente é causada pela mentalidade ruim do Windows que todos os computadores são apenas PDAs de tela grande e vários usuários estão fora de questão (e rede é realmente para usuários avançados). Problemas causados por isso não estão limitados à função "Não pode ser incomodado para testar" que você descreve (algo como isto:

#include <windows.h>
#pragma comment(lib, "user32.lib")

BOOL IsRemoteSession(void)
{
   return GetSystemMetrics( SM_REMOTESESSION );
}

), mas também o uso de recursos compartilhados e o uso adequado de gráficos (a razão pela qual isso é realmente difícil de fazer certo é discutido por Raymond Chen ).

Portanto, a menos que você tenha algum outro mecanismo para provar que o software funciona corretamente com vários usuários, eu estaria inclinado a supor que derrotar a verificação SM_REMOTESESSION não seria suficiente.

    
por 28.07.2009 / 16:48
0

Estou um pouco confuso, mas vou dar uma olhada nisso. Em termos de remoting em um servidor usando o RDP, você pode usar a conexão do console para poder executar aplicativos que precisam desse estado do console. Clique em Iniciar - > Executar e digite 'mstsc.exe /?' (sem aspas simples). Isso trará as opções de ajuda para qualquer versão do RDP que você esteja executando atualmente. Você pode usar essas opções para iniciar o RDP usando a sessão do console. Por exemplo, para a versão que estou executando atualmente (Windows 7 RC), eu digitaria 'mstsc.exe / v: exampleserver / admin' para conectar-se à sessão de console do servidor denominado exampleserver. Esteja ciente de que há diferenças por aí nas versões do RDP, porque esse / admin switch costumava ser / console. Se você quiser ter certeza, conecte-se ao servidor de destino e execute /? comando e veja o que ele espera para a conexão do console.

    
por 28.07.2009 / 16:12
0

Solução alternativa, em vez de solução.

Você quer executar um único software de gerenciamento ou fornecer um aplicativo para um servidor de terminal?

Se o anterior, você poderia usar algo como VNC / LogMeIn para se conectar ao console - e o sistema não saberia que você estava conectado remotamente.

O perigo no último é que alguns aplicativos usam recursos compartilhados (um aplicativo que usamos tem o mesmo nome de arquivos temporários, portanto vários usuários causam danos) e simplesmente não podem ser executados em um servidor de terminal em várias instâncias devido a um design inadequado. / p>     

por 28.07.2009 / 16:26