zoukankan      html  css  js  c++  java
  • windowsAPI之OpenProcessToken,AdjustTokenPrivileges 和LookupPrivilegeValue<转>

    这三个函数主要用来提升进程的权限 
    1 OpenProcessToken()函数:获取进程的令牌句柄 
    OpenProcessToken的原型. 
    BOOL WINAPI OpenProcessToken( 
    __in HANDLE ProcessHandle, 
    __in DWORD DesiredAccess, 
    __out PHANDLE TokenHandle 
    ); 
    第一个参数 进程句柄(当前进程为GetCurrentProcess()为参数) 
    第二个参数 访问令牌特权(可以参考msdnhttps://msdn.microsoft.com/zh-cn/library/aa374905) 
    第三个参数 令牌句柄 返回的参数 就是AdjustTokenPrivileges的第一个参数 
    2LookupPrivilegeValue()函数: 
    在认识这个函数之前我们需要了解一下结构体 
    TOKEN_PRIVILEGES结构体 
    typedef struct _TOKEN_PRIVILEGES 

    DWORD PrivilegeCount; 
    LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; 
    }TOKEN_PRIVILEGES; 
    第一个参数是个特权数组。 
    第二个参数是要修改的特权数目 
    LUID_AND_ATTRIBUTES 结构体 
    typedef struct _LUID_AND_ATTRIBUTES 

    LUID Luid; 
    DWORD Attributes; 
    } LUID_AND_ATTRIBUTES;

    LookupPrivilegeValue的原型 
    BOOL WINAPI LookupPrivilegeValue( 
    __in_opt LPCTSTR lpSystemName, 
    __in LPCTSTR lpName, 
    __out PLUID lpLuid 
    ); 
    第一个参数是系统的名字,如果为NULL,就是本地名字(这里就填NULL) 
    第二个参数是特权的名字,要查看详细特权,在这里写SE_DEBUG_NAME 
    第三个参数就可以通过指针返回一个LUID类型的Luid的标识了。 通过这个值就可以填入刚才的结构体里了。 
    3 AdjustTokenPrivileges()函数 
    BOOL WINAPI AdjustTokenPrivileges( 
    __in HANDLE TokenHandle, 
    __in BOOL DisableAllPrivileges, 
    __in_opt PTOKEN_PRIVILEGES NewState, 
    __in DWORD BufferLength, 
    __out_opt PTOKEN_PRIVILEGES PreviousState, 
    __out_opt PDWORD ReturnLength 
    ); 
    第一个参数为OpenProcessToken第三个指针参数传出的句柄值 
    第二个参数为是否禁用所有所有的特权(这里填false) 
    第三个参数为新的TOKEN_PRIVILEGES的特权结构体指针 
    第四个参数是上面结构体的字节长度(sizeof) 
    第五个参数是 接受原先的特权的结构体 
    第六个参数也是这个结构体的字节长度的指针

    最后要记得调用CloseHandle()函数 
    我们可以将上述函数组合为一个方法

    void EenableDebugPriv()
    {
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp;
        OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);
        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
        CloseHandle( hToken );
    }

    这样就可以修改相关进程的权限了

    原贴地址:https://blog.csdn.net/cxq_1993/article/details/48053997

  • 相关阅读:
    关于使用sudo找不到环境变量的问题
    HDFS修改副本数,并生效。
    Linux创建用户,SFTP只允许访问指定目录
    Docker 技术系列之安装Redis单机版和集群版
    Docker 技术系列之安装多版本Mysql5.6和Mysql5.7
    Docker 技术系列之安装Docker Desktop for Mac
    第五章 Mac系统软件-安装Java Web开发环境基本软件
    第四章 感受Mac之美-效率提高从操作快捷键开始
    第三章 感受Mac之美-万里挑一的装机必备软件
    第二章 感受Mac 之美-惊艳从Mac 外设开始,一周后的使用感受
  • 原文地址:https://www.cnblogs.com/wainiwann/p/9483345.html
Copyright © 2011-2022 走看看