2010-07-07 38 views
1

我一直在嘗試檢測終端服務是否正在運行。我試圖用MSDN Way正確檢測終端服務

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的行爲是相似的(失敗)。也可能在許多其他系統上。

回答

0

終端服務是像任何其他,內部命名TermServices的NT服務,如果您有permission.privilege訪問服務管理器,你可以輪詢那裏看看,如果它的運行:

OpenSCManager OpenService QueryServiceStatus

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只是一個垃圾。

-1

逾期答覆,但更好的後期則從來沒有,下面的代碼是德爾福,但它不需要太大的變化對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; 
+0

我想知道爲什麼這是downvoted,答案是正確的。如果您贊成某事,請留下評論! – Remko 2010-12-12 20:22:40