2010-07-07 3 views
1

터미널 서비스가 실행 중인지 여부를 감지하려고했습니다.터미널 서비스의 올바른 탐지

그것은 잘 작동
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에 대한 호출이 의미가 0이 아닌 값을 리턴 "현재 실행중인 운영 나는 MSDN Way을 사용하려 시스템이 지정된 요구 사항을 충족시킵니다. "또는 함수가 실패합니다.

GetLastError 반환 : 윈도우 XP SP3에

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

VerifyVersionInfo에 대한 호출이 0 값을 반환, 그래서 타이핑 오류가 없는지, 나는 가정한다.

이 동작을 어떻게 처리합니까? 터미널 서비스가없는 것처럼 이것을 처리하는 것이 좋습니까? 더 좋은 기술이 있습니까?

OS의 버그입니까?

업데이트 : 윈도우 서버 2008 R1 행동에

이 (실패)과 유사하다. 다른 많은 시스템에도있을 수 있습니다.

답변

0

터미널 서비스는 다른, 내부적으로 TermServices 이름이 같은 NT 서비스이며,이 서비스 관리자에 액세스 할 수있는 permission.privilege이있는 경우, 당신은 실행중인 있는지 확인하기 위해이 폴링 수 :

OpenSCManager OpenService QueryServiceStatus

0

글쎄, 나는 거의 작업 솔루션 (단 윈도우 2000 서버에서 실패를) 발견했다.

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는 단지 쓰레기입니다.

-1

늦은 답장하지만 더 나은, 아래의 코드는 델파이 후 결코 늦게하지만 당신이 그것을 확인하려면 /는 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; 

가 또는 터미널 서버 서비스가 정말 C에 대한 많은 변화를 필요가 없을 것입니다 달리기 :

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; 
+0

나는 이것이 왜 downvoted인지, 그 대답이 정확한지 궁금합니다. 뭔가 downvote 경우 코멘트를 남겨주세요! – Remko