Windows: Como fazer com que os programas pensem que não estão sendo executados em uma sessão do servidor de terminal?

11

Estou usando o programa "SoftXPand 2011 Duo" da Miniframe no meu PC com Windows 7. Faz duas estações de trabalho em um computador. Ele usa os serviços de terminal criados no Windows para criar a sessão adicional. Eu uso duas telas, dois teclados e dois mouses para criar essa "ilusão" de dois computadores. Funciona muito bem e posso até jogar dois jogos 3D diferentes nas duas telas conectadas a esta única máquina (usando uma Radeon HD5770 e uma Core i5 2500k com 8 Gbytes de RAM).

Existem algumas desvantagens nisso. Acabei de encontrar um que está escondido à primeira vista. As sessões em que você está (mesmo na primeira estação de trabalho) serão identificadas como uma sessão do servidor de terminal! Agora, alguns programas serão executados com efeitos limitados (gráficos) e outros não serão executados.

Isso também resultou em alguns jogos não rodando. Eles apenas dizem "Não pode ser executado em uma sessão do servidor de terminal" e saem. Eu já provei que os melhores jogos modernos (DirectX 10, 11) funcionam tão bem quanto na mesma máquina sem o SoftXPand, portanto, essa é uma limitação bastante artificial!

Então, posso de alguma forma invadir minha sessão atual para que não pareça mais uma sessão de servidor de terminal? IE

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

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

Voltará FALSO? (Não é uma pergunta de programação! Apenas um exemplo de como os programas detectam se estão em uma sessão de servidor de terminal!)

sinni800
fonte
Você tem dois teclados / telas? Por favor, elabore um pouco mais sobre sua configuração.
harrymc
@harrymc Sim, eu faço. Edição.
sinni800
A razão pela qual os aplicativos se recusam a executar em um servidor de terminal, mesmo quando você está usando a sessão do console, é por motivos de licença - para que uma licença não possa ser usada por mais de uma pessoa ao mesmo tempo.
Paradroid

Respostas:

9

Existem várias maneiras de um aplicativo verificar se está sendo executado em uma sessão do Terminal Server. Alguns deles você pode hackear, como abaixo:

  1. Registro: HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\TSAppCompat.
    Essa chave está ausente em uma sessão normal na minha área de trabalho.
    Você pode tentar excluí-lo, se puder.
  2. Valores da variável de ambiente SESSIONNAME: Console / "RDP #" / (vazio).
    Você pode tentar executar o jogo no prompt de comando (cmd) depois de fazer
    SET SESSIONNAME=Console(valor da minha área de trabalho) ou SET SESSIONNAME=(vazio).
    Para descobrir seu valor atual, insira SET SESSIONNAMEantes de alterar qualquer coisa.
  3. O sistema chama GetSystemMetrics (SM_REMOTESESSION) e GetVersionEx ( OSVERSIONINFOEX.wSuiteMask ) retornam o contexto de execução.
    Não há muito o que fazer contra este, exceto escrever um gancho do sistema para ele.
    Se estiver interessado, consulte este artigo do codeproject.com: Revelação de APIs .
harrymc
fonte
Em 2), o nome da sessão é "console" (O que diabos?). A chave TSAppCompat também está ausente aqui. Sobre o terceiro ... Parece difícil de fazer. Não existe um programa em cima de outro programa e intercepte chamadas do sistema como a que mencionei? GetSystemMetrics.
sinni800
De acordo com suas informações, provavelmente o terceiro método vale a pena atacar para GetVersionEx e GetSystemMetrics. Eu adicionei um link acima (para ser usado por um programador).
harrymc
Outra observação: se houver uma maneira de usar o MSTSC / admin no SoftXPand, vale a pena tentar.
harrymc
@harrymc por que MSTSC / admin? Vou dar uma olhada na conexão da API ... Pode ser muito complexo para minhas habilidades de programação.
sinni800
"MSTSC / admin" é um tiro no escuro: é um tipo de sessão remota um pouco diferente, portanto, talvez alguns programas possam não detectá-lo.
harrymc
0

Encontrei uma solução: executando os programas que você deseja por "runas"

Depois de fazer login na área de trabalho, digite isso em cmd:

runas / usuário: YOUR_NAME "YOUR_PROGRAM_PATH"

Testei-o contra os softwares da Bently e eles funcionam bem.

AqD
fonte
Isso contorna o problema do servidor de terminal? Interessante, eu tenho que tentar.
sinni800
Não funciona com efeito de massa 3 (Este programa não pode ser executado remotamente)
Mgamerz
0

Estou usando o Microsoft Remote Desktop e tentei os 2 primeiros métodos publicados por @harrymc, mas eles não funcionam no meu caso. O terceiro é muito complicado para mim, por isso não tentei.

No final, descobri que o Parallel Access me permite usar o programa que estava mostrando o erro. Não é tão suave quanto o RDP, então eu o uso se realmente precisar usar o programa.

Lewen
fonte
0

Não aborda a pergunta do SoftXPand diretamente, mas acabei aqui por causa de uma pesquisa no Google e é a resposta de @ harrymc.

Criei um arquivo em lotes com um atraso de 60 segundos e inicie o aplicativo que desejo executar. Iniciei o arquivo em lotes, desconectado da minha conexão RDP, esperei cerca de 5 minutos e depois me reconectei com o RDP. O aplicativo irritante que eu queria estava esperando por mim quando voltei. Aqui está o conteúdo do arquivo em lote:

timeout 60

start /D "your path here" yourExecutable.exe

As aspas ao redor do caminho são necessárias se você tiver espaços no caminho.

Obtenha as informações de lote aqui: /programming/8324352/creating-a-batch-file-for-programs-to-start-using-a-delay

adereços para esse cara: /programming//users/959263/raihan

(disse para fornecer detalhes e compartilhar minha pesquisa)

LargoBoom
fonte
Solução interessante, não sei se será possível aplicar ao SoftXPand, para ser sincero. Como não posso "sair" da sessão como no RDP.
sinni800