2009-07-10 4 views
1

Wie kann ich programmgesteuert mitteilen, ob der Terminaldienstedienst ausgeführt wird und fehlerfrei ist? Ich erstelle eine .net-Konsolenanwendung, die prüft, ob Terminaldienste auf einer Liste von Computern ausgeführt werden.Wie programmgesteuert mitteilen, ob der Terminalserverdienst ausgeführt wird

Ich kann den Remote-Registrierungseintrag überprüfen, um zu sehen, ob es aktiviert ist, aber das bedeutet nicht, dass es ausgeführt wird. Ich dachte daran, eine Socket-Verbindung zu Port 3389 herzustellen, aber es muss auch nicht auf diesen Port warten.

Gibt es eine elegante Möglichkeit, dies zu überprüfen?

Grüße,

+0

Sind die Server alle in einer Domäne/AD? – Kev

Antwort

2

Wenn Sie (oder der Benutzer speziell die Anwendung als laufen) die Berechtigung dazu hat, können Sie den SCM des Zielcomputers remote abfragen, um festzustellen, ob der TS-Dienst ausgeführt wird.

Sie sollten in der Lage sein, System.ServiceProcess.ServiceController.GetServices (string machineName) zu verwenden, um eine Liste aller Dienste auf dem Computer abzurufen, das Ergebnis zu iterieren, um den Terminaldienstedienst zu suchen und seinen Status abzufragen.

+0

Arbeitete wie ein Charme, danke! –

0

nie etwas mit ihm gemacht, aber WMI ist wahrscheinlich die Art und Weise auf Remote-Computer zu überprüfen, Prozesse zu gehen usw.

0

Sie können die WinStationServerPing (undokumentierte) API wie die Terminal Server Ping Tool Funktion verwenden. 2 Beispiele für die Überprüfung, ob der Dienst ausgeführt wird (delphi nicht verwalteten Code soll aber übersetzen nicht schwer sein):

// This is the way WTSApi32.dll checks if Terminal Service is running 
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; 

// This the way QWinsta.exe checks if Terminal Services is active: 
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; 

Bitte beachten Sie, dass unter Windows 7 den Terminal Service-Dienst ausgeführt wird nicht standardmäßig aktiviert.