2009-08-17 24 views
5

私は、現在のセッションのユーザートークンを取得しようとしているどのといくつかのコードを、持っている:ERRの物理セッションの現在のユーザートークンを取得するにはどうすればよいですか?

#include <Wtsapi32.h> 

DWORD activeSessionId = WTSGetActiveConsoleSessionId(); 

HANDLE currentToken; 
BOOL queryRet = WTSQueryUserToken(activeSessionId, &currentToken); 

if (!queryRet) { 
    DWORD err = GetLastError(); 
    return 0; 
} 

値は1314

でアップデート1

ませ運ない今のところ、試してみました現在のプロセスSE_TCB_NAMEを許可しますが、WTSQueryUserToken(1314)から同じエラーが返されます。

HANDLE process = GetCurrentProcess(); 

HANDLE processToken; 
BOOL openTokenRet = OpenProcessToken(
    process, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &processToken); 

if (!openTokenRet) 
{ 
    DWORD err = GetLastError(); 
    return 0; 
} 

TOKEN_PRIVILEGES tokenPrivs; 
BOOL lookupRet = LookupPrivilegeValue(
    NULL, SE_TCB_NAME, &tokenPrivs.Privileges[0].Luid); 

if (!lookupRet) 
{ 
    DWORD err = GetLastError(); 
    return 0; 
} 

tokenPrivs.PrivilegeCount = 1; 
tokenPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

BOOL adjustRet = AdjustTokenPrivileges(
    processToken, FALSE, &tokenPrivs, 0, (PTOKEN_PRIVILEGES)NULL, 0); 

if (!adjustRet) 
{ 
    DWORD err = GetLastError(); 
    return 0; 
} 

// get the user in the active session 
HANDLE currentToken; 
BOOL queryRet = WTSQueryUserToken(activeSessionId, &currentToken); 

if (!queryRet) { 
    DWORD err = GetLastError(); 
    return 0; 
} 

アップデート2:

は、いくつかのより多くのデバッグ情報を追加しましたが、prevState.PrivilegeCountは0 ...

TOKEN_PRIVILEGES prevState; 
DWORD prevStateLen = 0; 

BOOL adjustRet = AdjustTokenPrivileges(
    processToken, FALSE, &tokenPrivs, 
    sizeof(TOKEN_PRIVILEGES), &prevState, &prevStateLen); 

DWORD adjustErr = GetLastError(); 
if (!adjustRet) 
{ 
    return 0; 
} 

ソリューションです:WTSQueryUserToken場合にのみ使用することができますように

が見えますLocalSystemとして走っています。つまり、サービスとして実行し、そこからデバッグする必要があります。Doh!

答えて

8

エラー1314はERROR_PRIVILEGE_NOT_HELDです。 WTSQueryUserTokenを呼び出すには、SE_TCB_NAME権限が必要です。

この権限は、通常、ローカルシステムとして実行されているコードによってのみ保持されます。トークンにこの特権が存在するが無効になっている場合は、AdjustTokenPrivilegesを使用してトークンを有効にすることができます。 SE_TCB_NAMEは潜在的に非常に危険な特権であるため、使用直後に再度無効にする必要があります。この特権を持っているかどうかを確認する簡単な方法は、Process PropertiesウィンドウのSecurityテーブルのProcess Explorerを使用することです。

更新1 - AdjustTokenPrivilegesは成功しましたが、GetLastError()はERROR_NOT_ALL_ASSIGNEDに設定されていますか?特権が有効になっていない場合、MSDNはこれを返す可能性があることを示します。プロセスにSE_TCB_NAME権限があることを確認できますが、無効になっていますか?あなたのプロセスはどんなアカウントで実行されていますか?

+0

うーん、運が良かったけど、運がない。更新1を確認してください。 –

+0

MSDNより: トークンには、NewStateパラメータで指定された1つ以上の特権がありません。特権が調整されていなくても、このエラー値で機能が成功することがあります。 PreviousStateパラメーターは、調整された特権を示します。 この関数は成功する可能性がありますが、特権を有効にできないようです。 – Michael

+0

Aha、GetLastError()がERROR_NOT_ALL_ASSIGNEDを示していることを確認できますが、adjustRetの値はTRUEです。それで、私はTOKEN_PRIVILEGES構造体に値を設定しましたが、PrivilegeCountの値は0です...これは何も変更されていないことを意味しますか?アップデート2を参照してください。 –

関連する問題