SetTokenInformation 返回参数错误
const int MAXSIZE = 16384; // size _does_ matter
PLUID sessions;
ULONG count;
bool bRet;
NTSTATUS retval;
HANDLE hTokenThis = NULL;
PSECURITY_LOGON_SESSION_DATA sessionData = NULL;
int i;
DWORD needed;
TOKEN_STATISTICS *ts;//TokenStatistics
char szUser[256]={0};
DWORD sSize=256;
GetUserNameA(szUser,&sSize);
char sidbuf[100];
DWORD sidlen = 100,tokenstatis;
char domainbuf[100];
DWORD domainbuflen = 100;
SID_NAME_USE sidnameuse;
LookupAccountName(NULL, // 当前计算机
szUser, // GetUserName获得的结果
(PSID)sidbuf,
&sidlen,
domainbuf,
&domainbuflen,
&sidnameuse
);
char szLocalSid[MAX_PATH];
DWORD dwRet;
dwRet = 255;
GetTextualSid(sidbuf, szLocalSid, &dwRet);
DWORD dwSessionId = WTSGetActiveConsoleSessionId();
HANDLE hThisProcess = GetCurrentProcess();
bRet=OpenProcessToken(hThisProcess, TOKEN_ALL_ACCESS, &hTokenThis);
if (!bRet)
return -1;
GetTokenInformation(hTokenThis,TokenStatistics,NULL,0,&tokenstatis);
byte *stBuffer=new byte[tokenstatis];
bRet=GetTokenInformation(hTokenThis,TokenStatistics,stBuffer,tokenstatis,&tokenstatis);
if (!bRet)
return -1;
ts=(TOKEN_STATISTICS*)stBuffer;
retval = LsaEnumerateLogonSessions(&count, &sessions);
if (retval != 0) {
return -1;
}
TOKEN_PRIVILEGES *tpr;
byte *pbuffer;
//获取权限
bRet = GetTokenInformation(hTokenThis, TokenPrivileges, NULL, 0,&needed);
pbuffer=new byte[needed];
bRet=GetTokenInformation(hTokenThis,TokenPrivileges,pbuffer,needed,&needed);
if (!bRet)
return -1;
tpr=(TOKEN_PRIVILEGES *)pbuffer;
for ( i = 0; i < tpr->PrivilegeCount; i++){
//tpr->Privileges[i].
tpr->Privileges[i].Attributes |= SE_PRIVILEGE_ENABLED;
//SetPrivilege(hTokenThis,tpr->Privileges[i],TRUE);
}
bRet = AdjustTokenPrivileges(hTokenThis, FALSE, tpr, 0, NULL, NULL);
if (!bRet){
printf("AdjustTokenPrivileges error: %u\n", GetLastError() );
return -1;
}
delete[] pbuffer;
for (i =0;i < (int) count; i++) {
retval = LsaGetLogonSessionData (&sessions[i], &sessionData);
char szSid[MAX_PATH];
DWORD dwRet;
dwRet = 255;
GetTextualSid(sessionData->Sid, szSid, &dwRet);
if (!strcmp(szLocalSid,szSid)){
ts->AuthenticationId=sessionData->LogonId;
bRet=SetTokenInformation(hTokenThis, TokenStatistics,(LPVOID) ts, tokenstatis);
if (!bRet)
printf("SetTokenInformation Failed:%d\n",GetLastError());
LsaFreeReturnBuffer(sessionData);
break;
}
LsaFreeReturnBuffer(sessionData);
}
LsaFreeReturnBuffer(sessions);
return 0;
SetTokenInformation函数执行一直失败,返回值为87