私は、現在のセッションのユーザートークンを取得しようとしているどのといくつかのコードを、持っている:ERRの物理セッションの現在のユーザートークンを取得するにはどうすればよいですか?
#include <Wtsapi32.h>
DWORD activeSessionId = WTSGetActiveConsoleSessionId();
HANDLE currentToken;
BOOL queryRet = WTSQueryUserToken(activeSessionId, ¤tToken);
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, ¤tToken);
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!
うーん、運が良かったけど、運がない。更新1を確認してください。 –
MSDNより: トークンには、NewStateパラメータで指定された1つ以上の特権がありません。特権が調整されていなくても、このエラー値で機能が成功することがあります。 PreviousStateパラメーターは、調整された特権を示します。 この関数は成功する可能性がありますが、特権を有効にできないようです。 – Michael
Aha、GetLastError()がERROR_NOT_ALL_ASSIGNEDを示していることを確認できますが、adjustRetの値はTRUEです。それで、私はTOKEN_PRIVILEGES構造体に値を設定しましたが、PrivilegeCountの値は0です...これは何も変更されていないことを意味しますか?アップデート2を参照してください。 –