如何以编程方式判断终端服务器服务是否正在运行

时间:2009-07-10 15:12:25

标签: c# .net terminal service

如何以编程方式判断终端服务服务是否正在运行并且运行正常? 我正在创建一个.net控制台应用程序,它将检查终端服务是否在计算机列表上运行。

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

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

此致

3 个答案:

答案 0 :(得分:2)

如果您(或者,特别是应用程序运行的用户)有权这样做,您可以远程查询目标计算机的SCM以确定TS服务是否正在运行。

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

答案 1 :(得分:0)

从未对它做过任何事情,但WMI可能是检查远程计算机上的进程等的方法。

答案 2 :(得分:0)

您可以像Terminal Server Ping Tool一样使用WinStationServerPing(未记录的)API。 2检查服务是否正在运行的示例(delphi非托管代码但不应该难以翻译):

// 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上,默认情况下终端服务未运行。