2010-07-07 21 views
1

J'ai essayé de détecter si les services Terminal Server sont en cours d'exécution. J'ai essayé d'utiliser le MSDN Way:Détection correcte des services Terminal Server

OSVERSIONINFOEX osVersionInfo; 
DWORDLONG dwlConditionMask = 0; 

memset(&osVersionInfo, 0, sizeof(osVersionInfo)); 
osVersionInfo.dwOSVersionInfoSize = sizeof(osVersionInfo); 
osVersionInfo.wSuiteMask = VER_SUITE_TERMINAL; 

VER_SET_CONDITION(dwlConditionMask, VER_SUITENAME, VER_AND); 

return VerifyVersionInfo(&osVersionInfo, VER_SUITENAME, dwlConditionMask); 

Il fonctionne bien, mais:

OS Name: Microsoft(R) Windows(R) Server 2003, Enterprise Edition 
OS Version:    5.2.3790 Service Pack 2 Build 3790 
OS Manufacturer:   Microsoft Corporation 
OS Configuration:   Standalone Server 
OS Build Type:    Multiprocessor Free 

sans rôle des services Terminal Server, l'appel à VerifyVersionInfo retourne une valeur non-zéro, ce qui signifie « l'exploitation en cours d'exécution le système satisfait aux exigences spécifiées »ou la fonction échoue.

GetLastError retours:

0x000000cb "The system could not find the environment option that was entered." 

Sous Windows XP SP3, un appel à VerifyVersionInfo retourne une valeur nulle, donc il n'y a pas de fautes de frappe, je suppose.

Comment gérer ce problème? Est-ce bon de traiter cela comme s'il n'y avait pas de services Terminal Server? Y a-t-il de meilleures techniques?

Est-ce un bug dans le système d'exploitation?

Mise à jour:

sur le comportement R1 Windows Server 2008 est similaire (échoue). Peut être sur beaucoup d'autres systèmes aussi.

Répondre

0

Terminal Services est un service NT comme un autre, à l'intérieur du nom TermServices, et si vous avez le permission.privilege pour accéder au gestionnaire de services, vous pourriez y interroger pour voir si elle est en cours d'exécution:

OpenSCManager OpenService QueryServiceStatus

0

Eh bien, je trouve une solution presque de travail (échoue uniquement sur le serveur Win2K). Fait intéressant - l'appel à VerifyVersionInfo ne modifie pas le dernier code d'erreur. Le code d'erreur 0x000000cb que GetLastError me renvoie est juste une poubelle.

-1

Une réponse tardive, mais mieux tard que jamais, le code ci-dessous Delphi, mais il ne serait pas besoin de beaucoup de changements pour c/C++

function AreWeRunningTerminalServices: Boolean; 
var VersionInfo: TOSVersionInfoEx; 
    dwlConditionMask: Int64; 
begin 
    // Zero Memory and set structure size 
    ZeroMemory(@VersionInfo, SizeOf(VersionInfo)); 
    VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo); 

    // We are either Terminal Server or Personal Terminal Server 
    VersionInfo.wSuiteMask := VER_SUITE_TERMINAL or VER_SUITE_SINGLEUSERTS; 
    dwlConditionMask := VerSetConditionMask(0, VER_SUITENAME, VER_OR); 

    // Test it 
    Result := VerifyVersionInfo(VersionInfo, VER_SUITENAME, dwlConditionMask); 
end; 

ou si vous voulez vérifier le service Terminal Server est vraiment en cours d'exécution:

function IsTerminalServiceRunning: boolean; 
var hSCM: HANDLE; 
    hService: HANDLE; 
    ServiceStatus: SERVICE_STATUS; 
begin 
    Result := False; 
    // Open handle to Service Control Manager 
    hSCM := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, GENERIC_READ); 
    if hSCM > 0 then 
    begin 
    // Open handle to Terminal Server Service 
    hService := OpenService(hSCM, 'TermService', GENERIC_READ); 
    if hService > 0 then 
    begin 
     // Check if the service is running 
     QueryServiceStatus(hService, ServiceStatus); 
     Result := ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
     // Close the handle 
     CloseServiceHandle(hService); 
    end; 
    // Close the handle 
    CloseServiceHandle(hSCM); 
    end; 
end; 
+0

Je me demande pourquoi c'est downvoted, la réponse est correcte. Si vous downvote quelque chose s'il vous plaît laissez un commentaire !!! – Remko