如何以编程方式告诉我们,如果终端服务器服务正在运行(How to programmatically

2019-09-18 06:28发布

我怎么能告诉编程如果终端服务服务正在运行是健康的? 我创建一个.NET控制台应用程序,如果终端服务的计算机列表上运行,将检查。

我可以检查远程注册表项来看看它的启用,但并不意味着它的运行。 我想制作一个套接字连接到端口3389,但它并没有被要么端口上侦听。

有一种优雅的方式来检查呢?

问候,

Answer 1:

如果你(或者,具体而言,应用程序运行的用户)有权这样做,你可以远程查询目标机的供应链管理,以确定TS服务正在运行。

您应该能够使用System.ServiceProcess.ServiceController.GetServices(字符串机器名)来获取计算机上的所有服务的列表,迭代结果找到Terminal Services服务和查询其状态。



Answer 2:

从未做过任何事的,但WMI可能是去检查远程计算机等流程的方式



Answer 3:

您可以使用类似的WinStationServerPing(无证)API 终端服务器Ping工具一样。 检查,如果该服务正在运行(德尔福非托管代码,但不应该是很难翻译)的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中的终端服务服务默认情况下不运行。



文章来源: How to programmatically tell if the terminal server service is running