zoukankan      html  css  js  c++  java
  • AdjustTokenPrivileges启用权限

    原文链接地址:http://blog.csdn.net/xbgprogrammer/article/details/7276760

       我们有很多操作需要用到OpenProcess函数,而为了使程序有权限使用这个函数,我们经常利用AdjustTokenPrivileges提升权限(准确的说不是提升,而是将访问令牌中禁用的权限启用)

    BOOL SetPrivilege(
                      HANDLE hToken,          // access token handle
                      LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
                      BOOL bEnablePrivilege   // to enable or disable privilege
                      ) 
    {
        TOKEN_PRIVILEGES tp;
        LUID luid;
    
        if ( !LookupPrivilegeValue( 
            NULL,            // lookup privilege on local system
            lpszPrivilege,   // privilege to lookup 
            &luid ) )        // receives LUID of privilege
        {
            printf("LookupPrivilegeValue error: %u
    ", GetLastError() ); 
            return FALSE; 
        }
    
        tp.PrivilegeCount = 1;
        tp.Privileges[0].Luid = luid;
        if (bEnablePrivilege)
            tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        else
            tp.Privileges[0].Attributes = 0;
    
        // Enable the privilege or disable all privileges.
    
        if ( !AdjustTokenPrivileges(
            hToken, 
            FALSE, 
            &tp, 
            sizeof(TOKEN_PRIVILEGES), 
            (PTOKEN_PRIVILEGES) NULL, 
            (PDWORD) NULL) )
        { 
            printf("AdjustTokenPrivileges error: %u
    ", GetLastError() ); 
            return FALSE; 
        } 
    
        if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
    
        {
            printf("The token does not have the specified privilege. 
    ");
            return FALSE;
        } 
    
        return TRUE;
    }
    
    void main( )
    {
    
        HANDLE hToken;
        BOOL bRet = OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken);
        SetPrivilege(hToken,SE_DEBUG_NAME,TRUE);
    }

    这段代码在xp上没有问题,但如果在windows 7 或者vista上,如果程序以标准用户启动,AdjustTokenPrivileges将会调用失败,以管理员省份启动没有问题。

    这是因为在Windows 7上,标准用户权限很少,没有Debug权限,更无从谈起启用Debug权限,用户可以以管理员和标准用户两种方式启用控制台,输入命令whoami /ALL

    来查看两种权限下权限的不同

    0_132997996303BA

    0_1329980003JC4d

    PS:即使提升调试权限,也不意味着对其它进程调用OpenProcess会成功(例如win7系统下的system和audiodg进程)

    关于TOKEN_PRIVILEGES结构

    typedef struct _TOKEN_PRIVILEGES {  DWORD PrivilegeCount;  LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
    } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;

    截图20160331111859

  • 相关阅读:
    POJ 2068 Nim#双人dp博弈
    POJ 1678 I Love this Game!#dp博弈
    HDU 3404&POJ 3533 Nim积(二维&三维)
    POJ 3537 Crosses and Crosses(SG/还未想完全通的一道SG)
    POJ 2311 Cutting Game(SG+记忆化)
    POJ 2484 A Funny Game(找规律)
    POJ 2505 A multiplication game(找规律博弈/贪心)
    POJ 2975 Nim(普通nim)
    POJ 2368 Buttons(巴什博弈变形)
    POJ 1704 Georgia and Bob(阶梯博弈+证明)
  • 原文地址:https://www.cnblogs.com/wuyuan2011woaini/p/5340357.html
Copyright © 2011-2022 走看看