1

我一直在尝试检测终端服务是否正在运行。我尝试使用MSDN 方式

OSVERSIONINFOEX osVersionInfo;
DWORDLONG dwlConditionMask = 0;

memset( &osVersionInfo, 0, sizeof( osVersionInfo ) );
osVersionInfo.dwOSVersionInfoSize = sizeof( osVersionInfo );
osVersionInfo.wSuiteMask = VER_SUITE_TERMINAL;

VER_SET_CONDITION( dwlConditionMask, VER_SUITENAME, VER_AND );

return VerifyVersionInfo( &osVersionInfo, VER_SUITENAME, dwlConditionMask );

它运作良好,但在:

OS Name: Microsoft(R) Windows(R) Server 2003, Enterprise Edition  
OS Version:                5.2.3790 Service Pack 2 Build 3790  
OS Manufacturer:           Microsoft Corporation  
OS Configuration:          Standalone Server  
OS Build Type:             Multiprocessor Free

如果没有终端服务角色,则调用VerifyVersionInfo返回一个非零值,这意味着“当前运行的操作系统满足指定的要求”或函​​数失败。

GetLastError返回:

0x000000cb "The system could not find the environment option that was entered."

在 Windows XP SP3 上,调用VerifyVersionInfo返回一个零值,所以我想没有输入错误。

我该如何处理这种行为?将其视为没有终端服务是否很好?有没有更好的技术?

它是操作系统中的错误吗?

更新:

在 Windows Server 2008 R1 上,行为类似(失败)。也可能在许多其他系统上。

4

3 回答 3

0

终端服务是一个 NT 服务,与任何其他内部命名的服务一样TermServices,如果您有访问服务管理器的权限。特权,您可以在那里轮询以查看它是否正在运行:

OpenSCManager OpenService QueryServiceStatus

于 2010-07-10T19:48:39.927 回答
0

好吧,我找到了几乎可行的解决方案(仅在 Win2k 服务器上失败)。

OSVERSIONINFOEX osVersionInfo;
DWORDLONG dwlConditionMask = 0;

memset( &osVersionInfo, 0, sizeof( osVersionInfo ) );
osVersionInfo.dwOSVersionInfoSize = sizeof( osVersionInfo );
osVersionInfo.wSuiteMask = VER_SUITE_SINGLEUSERTS;

VER_SET_CONDITION( dwlConditionMask, VER_SUITENAME, VER_AND );

return !VerifyVersionInfo( &osVersionInfo, VER_SUITENAME, dwlConditionMask );

有趣的事实 - 调用 VerifyVersionInfo 不会修改最后一个错误代码。GetLastError 返回给我的错误代码 0x000000cb 只是一个垃圾。

于 2010-07-14T11:33:03.060 回答
-1

迟到的回复,但迟到总比永远好,下面的代码是 Delphi,但它不需要对 c/c++ 进行太多更改

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;

或者如果你想检查终端服务器服务是否真的在运行:

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;
于 2010-12-03T10:14:25.420 回答