2009-07-10 26 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中的終端服務服務默認情況下不運行。

相關問題