Как программно определить, запущена ли служба сервера терминалов - PullRequest
1 голос
/ 10 июля 2009

Как программно определить, работает ли служба служб терминалов и исправна ли она? Я создаю консольное приложение .net, которое проверяет, запущены ли службы терминалов в списке компьютеров.

Я могу проверить запись в удаленном реестре, чтобы убедиться, что она включена, но это не значит, что она работает. Я думал о создании сокет-соединения с портом 3389, но он не должен прослушивать этот порт.

Есть ли элегантный способ проверить это?

С уважением,

Ответы [ 3 ]

2 голосов
/ 10 июля 2009

Если у вас (или, в частности, у пользователя, под которым запускается приложение) есть разрешение, вы можете удаленно запросить SCM целевой машины, чтобы определить, запущена ли служба TS.

Вы должны иметь возможность использовать System.ServiceProcess.ServiceController.GetServices (строка machineName), чтобы получить список всех служб на компьютере, выполнить итерацию результата, чтобы найти службу служб терминалов и запросить ее состояние.

0 голосов
/ 04 августа 2009

Вы можете использовать WinStationServerPing (недокументированный) API, как Инструмент Ping для сервера терминалов . 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 служба терминалов по умолчанию не работает.

0 голосов
/ 10 июля 2009

Никогда ничего с этим не делал, но WMI, вероятно, является способом проверки процессов на удаленных компьютерах и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...