我在vc里面调用WTSQueryUserToken函数,不知道为什么会有这个错误?
不知道该怎么解决啊?大侠们帮帮忙呀~~

解决方案 »

  1.   

    DWORD dwSessionId = WTSGetActiveConsoleSessionId();
     WTSQueryUserToken(dwSessionId, &hToken);
      

  2.   

    就是楼上这么用的,但是WTSQueryUserToken这个函数会返回一个错误ERROR_PRIVILEGE_NOT_HELD
    msdn上说是The caller does not have the SE_TCB_NAME privilege
    但是为什么没有这个权限呢,又该怎么得到这个权限呢?
      

  3.   


    没权限?你的是 win7 么?那可能要先获取到管理员权限,才能进行这个操作。
      

  4.   

     我在xp下面用也提示没有那个权限呀,但是最终win7,和xp2个系统我都是要用的。
    楼上说“msdn上说SID不在ACL里。”啥意思?
      

  5.   

    管理员的进程默认情况下都没有Tcb特权,SYSTEM账号的进程有,可以以服务方式运行。
    可以在组策略里面为管理员添加Tcb特权
      

  6.   

    BOOL EnablePriv()
    {
    HANDLE hToken;
    if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
    {
           TOKEN_PRIVILEGES tkp;
          
           LookupPrivilegeValue( NULL,SE_TCB_NAME,&tkp.Privileges[0].Luid );//修改进程权限
           tkp.PrivilegeCount=1;
           tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
           AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
          
           return( (GetLastError()==ERROR_SUCCESS) );
    }
           return TRUE;
    }
      

  7.   

    没权限那就调整一下,整个权限呗。SE_TCB_NAME这种权限默认都是没有的。代码10楼的已经贴了。
      

  8.   

    #10仅是打开被禁用的特权,对于根本就没有的特权无效。所以对于缺省的administrator进程,EnablePriv是无法获得tcb特权的
      

  9.   

    以服务的方式运行,或者打开一个SYSTEM进程,用RtlCreateUserProcess把SYSTEM进程作为父进程创建一个子进程
    这时子进程就有tcb特权,如果在windowsxp需要用CsrClientCallServer通知csrss.exe