2009-07-10 59 views
1

如何以编程方式确定终端服务服务是否正在运行并且运行状况良好? 我正在创建一个.net控制台应用程序,用于检查终端服务是否在计算机列表上运行。如何以编程方式确定终端服务器服务是否正在运行

我可以检查远程注册表项以查看它是否启用,但这并不意味着它正在运行。 我正在考虑与端口3389建立套接字连接,但它不一定要在该端口上进行监听。

有没有一个优雅的方式来检查这个?

问候,

+0

服务器是否都在域/ AD? – Kev 2009-07-10 15:25:39

回答

2

如果你(或者,具体而言,用户的应用程序作为)有权这样做,您可以远程查询目标机器的SCM,以确定TS服务是否正在运行。

您应该可以使用System.ServiceProcess.ServiceController.GetServices(string machineName)获取计算机上所有服务的列表,迭代结果以查找终端服务服务并查询其状态。

+0

像魅力一样工作,谢谢! – 2009-07-10 16:59:17

0

从来没有做过任何事的,但WMI可能是去检查远程计算机上的进程的方式,等等。

0

您可以使用WinStationServerPing(未记录)API,如Terminal Server Ping Tool。如果服务正在运行(德尔福非托管代码,但不应该是很难翻译)检查 2个例子:

// 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; 

请注意,在Windows 7中的终端服务服务默认情况下不运行。

相关问题