2009-05-26 5 views
2

Mon installation doit se comporter légèrement différemment lorsque le programme est installé sur un serveur Terminal Server. Je sais environ GetSystemMetrics(SM_REMOTESESSION) mais pour autant que j'ai compris cela me dira seulement si je cours dans une session RDP. Il ne serait pas attraper le cas où l'administrateur du serveur est connecté localement pour installer le logiciel, ou le ferait-il?Comment puis-je détecter si j'installe sur un serveur Terminal Server dans un script InnoSetup?

La vérification du service Terminal Server ne semble pas viable, car elle s'exécute également sur les postes de travail lorsque le Bureau à distance a été activé. J'ai besoin de différencier cela d'un vrai TS qui permet plusieurs sessions d'ouverture de session simultanées.

N'existe-t-il aucun autre service ou clé de registre que je vérifie?

Répondre

3

Grâce au lien fourni par Magnus Skog, j'ai découvert que InnoSetup supporte déjà la fonction API GetWindowsVersionEx.Par conséquent, tout ce que je devais faire était le suivant:

function IsRunningOnTS: Boolean; 
var 
    lWinVer: TWindowsVersion; 
begin 
    GetWindowsVersionEx(lWinVer); 
    Result := (lWinVer.SuiteMask and VER_SUITE_TERMINAL) <> 0; 
end; 

Je l'ai testé avec succès ce pour les scénarios suivants:

  • connecté localement à un poste de travail de XP avec RDP activé (retours False)
  • connecté à distance à un Terminal Server via RDP (renvoie True)
  • connecté à distance à un poste de travail via RDP (renvoie False)

Je n'ai pas encore eu l'occasion de tester en étant connecté localement sur un TS. Mettra à jour ce poste quand je l'ai.

3

C'est exactement ce dont vous avez besoin:

Detecting Whether Terminal Services Is Installed

Notez que, en plus de cela, vous pouvez utiliser pour déterminer la valeur de GetVersion() si vous êtes du tout en cours d'exécution NT. Si ce n'est pas NT puis renflouer.

// Are we running Windows NT? 
DWORD dwVersion = GetVersion(); 
if (!(dwVersion & 0x80000000)) { 
    // Is it Windows 2000 or greater? 
    if (LOBYTE(LOWORD(dwVersion)) > 4) { 
     // Check with VerSetConditionMask() and VerifyVersionInfo() 
     return ..; 
    } 
    else { 
     // Windows NT 4.0 or earlier. Check ProductSuite value in 
     // HKLM\\System\\CurrentControlSet\\Control\\ProductOptions 
     return ..; 
    } 
} 

return false; 

Le lien montre le code que vous devez interroger si la version est Win2K ou plus tard

+0

Merci! Ce lien m'a orienté dans la bonne direction. Mais comme la question visait spécifiquement à faire cela à partir d'un script InnoSetup plutôt qu'en C++, j'ai posté ma solution en tant que réponse séparée. –

1

Je devine que cette question a un potentiel pour de nombreuses réponses, toutes sembleront peu satisfaisante.

Par exemple, quels sont les scénarios possibles:

  • Workstation, avec RDP activé (par exemple XP avec l'aide à distance activée.)
  • Server, avec RDP activé (faciles à distinguer d'un poste de travail en cochant la Type d'OS)

Toutefois, qu'en est-il d'un serveur sur lequel l'option RDP est activée, mais qui n'est pas utilisée? Que pensez-vous d'un serveur sur lequel l'option RDP est activée, mais l'administrateur installe votre logiciel sur la console, à une heure de la journée où personne n'est connecté via RDP? Vous ne seriez pas en mesure de déterminer si le serveur est réellement utilisé, RDP-sage, ou pas.

La meilleure façon de vous donner une réponse concrète est de vous demander pourquoi vous devez le déterminer? Quel type de fonctionnalité allez-vous activer ou désactiver si vous étiez en mesure de détecter de manière fiable cela?

+0

La raison en est que l'application en question est un addin Outlook et que nous utilisons des licences flottantes, c'est-à-dire que chaque instance démarrée d'Outlook utilise généralement une licence. Cependant, certains clients achètent moins de licences que le nombre total d'utilisateurs sur le serveur. Lors de l'installation sur TS, nous offrons donc l'option supplémentaire d'installer l'application dans un état désactivé afin que seuls les utilisateurs pour lesquels une licence existe puissent activer l'addin. Je veux cacher cette option pour les installations sur les non-TS car cela pourrait dérouter les utilisateurs. –

Questions connexes