2

サービスにユーザーとしてプロセスを作成させようとしていますが、最初にトークンを取得する必要があります。何らかの理由で、私の関数はエラー 87 を返し続けます。これは ERROR_INVALID_PARAMETER です。理由を知っている人はいますか?何時間も私を悩ませてきました.パラメータは私が見たものから正しいです. ありがとう。

これが私のコードです:

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());
}
4

2 に答える 2

2

この問題を次のように解決しました: currentToken をポインター (PHANDLE) ではなく HANDLE として定義し、それへの参照を 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を解決しましたとにかくエラー!

于 2015-08-28T12:24:14.707 に答える
1

有効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);

ソースと完全なコード例はこちらにあります

于 2013-06-30T07:07:58.593 に答える