2013-06-30 45 views
0

我想讓我的服務以用戶的身份創建一個進程,但我必須先獲取該令牌。由於某種原因,我的函數不斷返回錯誤87,這是ERROR_INVALID_PARAMETER。有人知道爲什麼它一直在困擾我幾個小時,參數從我看到的是正確的。謝謝。C++ WTSQueryUserToken函數錯誤

這裏是我的代碼:

PHANDLE currentToken = 0; 
ULONG id = WTSGetActiveConsoleSessionId(); 
    printf("ULONG = %d", id); 
// Get token of the logged in user by the active session ID 
BOOL bRet = WTSQueryUserToken(id, currentToken); 
if (bRet == false) 
{ 
    printf("ERROR: %d", GetLastError()); 
} 

回答

0

也許WTSGetActiveConsoleSessionId沒有返回一個有效的會話ID?嘗試WTSEnumerateSessions獲取活動會話:

WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &dwCount); 

    int dataSize = sizeof(WTS_SESSION_INFO); 

    // look over obtained list in search of the active session 
    for (DWORD i = 0; i < dwCount; ++i) 
    { 
     WTS_SESSION_INFO si = pSessionInfo[i]; 
     if (WTSActive == si.State) 
     { 
     // If the current session is active – store its ID 
      dwSessionId = si.SessionId; 
      break; 
     } 
    } 

    // Get token of the logged in user by the active session ID 
    BOOL bRet = WTSQueryUserToken(dwSessionId, currentToken); 

Source and full code example found here

+0

請參閱我試過這個,但Enumeratesesions只是給我一個錯誤,它不能建立一個RFC服務器。開始認爲它可能不可能在Win7上,因爲:http://msdn.microsoft.com/en-us/windows7trainingcourse_sessionisolation_unit.aspx – JimmySmithJR

+0

聽起來像一個權限問題,因爲有幾個RDS權限,你需要枚舉會話, [請參閱此文檔鏈接](http://msdn.microsoft.com/en-us/library/windows/desktop/aa383488(v = vs.85).aspx)以獲取更多信息。 – 2013-06-30 17:54:06

+0

我也處於相同的位置 - 使用enurmate會話產生正確的會話ID(1 - 通過在命令提示符下使用tasklist進行驗證,我可以看到我的會話ID與正在運行的應用程序的會話ID)但是,使用與上面相同的代碼,給我錯誤87回來。 – Tommy

2

我解決這個問題如下: 定義currentToken作爲手柄,而不是一個指針(PHANDLE),並通過對它的引用到WTSQueryUserToken功能

PHANDLE currentToken = 0; 
changes to: 
HANDLE currentToken = 0; 

而且......

BOOL bRet = WTSQueryUserToken(id, currentToken); 
//Change this to: 
BOOL bRet = WTSQueryUserToken(id, &currentToken); 

之後,我得到了一個1314 - ERROR_PRIVILEGE_NOT_HELD錯誤,但那是因爲應用程序需要以用戶「localsystem」的形式運行,唯一的方法是將其作爲服務運行 - 超出此範圍,我解決了無論如何,87錯誤!