SetTokenInformation 返回参数错误

kfdkfd 2014-07-07 02:41:20

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
...全文
569 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
哥哥还很小 2015-10-08
  • 打赏
  • 举报
回复
UAC问题?楼主能不能具体说明一下
kfdkfd 2014-07-08
  • 打赏
  • 举报
回复
已经解决,UAC问题
一剑 2014-07-07
  • 打赏
  • 举报
回复
参数错误,建议仔细检查下你的传参。
fishion 2014-07-07
  • 打赏
  • 举报
回复
tokenstatis的大小是sizeof(TOKEN_STATISTICS)吗

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧