首先列出需要的函数

1.OpenProcessToken

2.AdjustTokenPrivileges

3. LookupPrivilegeValue

--------------------------------------------------------------

首先需要获取进程的令牌句柄

OpenProcessToken的原型.

1
2
3
4
5
BOOL WINAPI OpenProcessToken( 
  __in          HANDLE ProcessHandle, 
  __in          DWORD DesiredAccess, 
  __out         PHANDLE TokenHandle 
);

第一个参数 进程句柄(当前进程为GetCurrentProcess()为参数)

第二个参数 访问令牌特权

第三个参数 返回的参数 就是AdjustTokenPrivileges的第一个参数

例子:

1
2
3
4
5
6
7
8
9
10
11
HANDLE hToken; 
     
bool retn = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken); 
     
if(!retn) 
     
     
      return//获取令牌失败。。 
     
}

注:第二个参数 是令牌的权限,这个权限是要有修改权限的特权,意思就是要把你程序的权限修改得更高。

关于其他权限可以查MSDN..            所有权限可以写TOKEN_ALL_ACCESS ,去查看一个令牌特权可以用TOKEN_QUERY

这个下面函数有写。

--------------------------------------------------------------

首先先说一下使用AdjustTokenPrivileges需要的。

在这个函数中的第3和第5个参数中需要用到一个TOKEN_PRIVILEGES的结构体,在这个结构体中还有个LUID_AND_ATTRIBUTES结构体

TOKEN_PRIVILEGES结构体

1
2
3
4
5
6
typedef struct _TOKEN_PRIVILEGES 
     
       DWORD PrivilegeCount;  
       LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; 
}TOKEN_PRIVILEGES;

下面的参数是个特权数组。

上面的参数是要修改的特权数目

LUID_AND_ATTRIBUTES 结构体

1
2
3
4
5
typedef struct _LUID_AND_ATTRIBUTES  
{   
       LUID Luid;   
       DWORD Attributes; 
} LUID_AND_ATTRIBUTES;

第一个参数是Luid是一个标志,不同的Luid代表着各种不同的特权类型

第二个参数是要这个特权干嘛,如启用这个特权(SE_PRIVILEGE_ENABLED)

这里的Luid的值需要用LookupPrivilegeValue来获取。

------------------------------------------------------------------------------------------

LookupPrivilegeValue的原型

1
2
3
4
5
BOOL WINAPI LookupPrivilegeValue( 
  __in_opt      LPCTSTR lpSystemName, 
  __in          LPCTSTR lpName, 
  __out         PLUID lpLuid 
);

第一个参数是系统的名字,如果为NULL,就是本地名字(这里就填NULL)

第二个参数是特权的名字,要查看详细特权,看我的博客里翻译分类里的 包含特权 的文章。(在这里写SE_DEBUG_NAME)

第三个参数就可以通过指针返回一个LUID类型的Luid的标识了。 通过这个值就可以填入刚才的结构体里了。

----------------------------------------------------------------------------------------------------------------------------

最后就可以介绍AdjustTokenPrivilege就应该没什么问题了。

它的原型为:

1
2
3
4
5
6
7
8
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)

第五个参数是 接受原先的特权的结构体

第六个参数也是这个结构体的字节长度的指针

在这里后两个参数不用管。

详细看我的博客翻客相关说明

MSDN里说

如果第五个参数不是NULL,在OpenProcessToken加特权时除了需要指定TOKEN_ADJUST_PRIVILEGES还必须指定TOKEN_QUERY

如果第五个参数是NULL,你不接受原先的结构体(第六个当然也是NULL), 就不用再指定附加的TOKEN_QUERY的特权了。

还要注意:

就算这个函数返回为真,还要调用GetLastError()来检验是否完全成功。

如果返回ERROR_SUCCESS就代表修改非常成功 。。。其他的返回值 查我博客。

这个非常重要!!

还有就是Vista和Window7 里 一定要开管理员模式 才能获取成功

----------------------------------------------------

完整的例子

可以直接复制到VC 6.0里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <windows.h>    
#include <iostream>    
using namespace std;    
      
      
void main()    
{    
        BOOL retn;    
        HANDLE hToken;    
        retn = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);    
        if(retn != TRUE)    
        {    
                    cout<<"获取令牌句柄失败!"<<endl;    
                    return;    
        }    
        
        TOKEN_PRIVILEGES tp; //新特权结构体    
        LUID Luid;    
        retn = LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Luid);    
      
        if(retn != TRUE)    
        {    
                    cout<<"获取Luid失败"<<endl;    
                    return;    
        }    
                //给TP和TP里的LUID结构体赋值    
        tp.PrivilegeCount = 1;    
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;    
        tp.Privileges[0].Luid = Luid;    
           
        AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);    
        if(GetLastError() != ERROR_SUCCESS)    
        {    
                    cout<<"修改特权不完全或失败!"<<endl;    
        }    
       else  
       {    
                    cout<<"修改成功!"<<endl;    
       }    
}

<转载>提升程序的特权(AdjustTokenPrivileges)的更多相关文章

  1. 提升程序的特权(AdjustTokenPrivileges)

    首先列出需要的函数 1.OpenProcessToken 2.AdjustTokenPrivileges 3. LookupPrivilegeValue ----------------------- ...

  2. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

  3. 记忆用户设置-提升程序的体验VB/C#

    有时候,设计的程序有很多的控件,甚至多达近百个,尤其是一些工控软件等,程序运行所需的各种参数都是由用户通过这些控件设置而来,那么记录用户的设置就显得十分必要.如果程序出现异常,起码重新打开可以不用再一 ...

  4. EXCEL VBA——数组,使用数组提升程序效率

    数组的存在价值就是让代码提速. 数组和非数组的差异只在于数据的保存和读取方式不同,虽然操作这些数据的方法或者函数并没有不同,但是保存与读取上的差异却使VBA代码在处理数据时实现了质的飞跃.在完成相同工 ...

  5. python之提升程序性能的解决方案

    Python在性能方面不卓越,但是使用一些小技巧,可以提高Python程序的性能,避免不必要的资源浪费. 1. 使用局部变量 尽可能使用局部变量替代全局变量,可以是程序易于维护并且有助于提高性能节约成 ...

  6. Python3用多线程替代for循环提升程序运行速度

    [本文出自天外归云的博客园] 优化前后新老代码如下: from git_tools.git_tool import get_collect_projects, QQNews_Git from thre ...

  7. 实用fork/join框架提升程序效率

    实用fork/join框架提成程序效率 原文地址:https://www.jianshu.com/p/9ce243796d4a 业务场景 最近再做一个接口,我是一个中央的消息接受方,当我接受到消息后要 ...

  8. Function.apply()在提升程序性能方面的技巧

    我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所有参数中的最大值. 比如 alert(Math.max(5,8))   //8alert(Math.max(5,7 ...

  9. PHP 开启 Opcache 功能提升程序处理效率

    简介 Opcache 的前生是 Optimizer+ ,它是 Zend 开发的 PHP 优化加速组件.Optimizer+ 将 PHP 代码预编译生成的脚本文件 Opcode 缓存在共享内存中供以后反 ...

随机推荐

  1. Java学习备忘录

    1.工程名首字母可以小写,类名首字母大写 2.批量注释: Eclipse : ctrl+/  如果不行 用 ctrl+7 或者 ctrl+shift+c Notepad++ : ctrl+q 或者 c ...

  2. 【多校练习4签到题】HDU 4642—— Fliping game

    来源:点击打开链接 看上去很难,比赛的时候光看hehe了,也没有想. 但是仔细想想,是可以想出来的.一个棋盘上每个格子摆放一个硬币,硬币有正面1和反面0之分.现在两个人可以按照规则翻硬币,选择(x,y ...

  3. contiki-main.c 一 打印观察 <contiki学习之五>

    说明: 本文依赖于 contiki/platform/native/contiki-main.c 文件. 在项目工程目录下的hello-world.c 文件里面,有许多的宏,但没有最关键的main() ...

  4. 使用CKEditor编辑器进行文本编辑

    首先下载CKEditor. 下载地址:点击打开链接 将下载完的CKEditor解压而且导入到项目中. 然后在页面引入CKEditor <script type="text/javasc ...

  5. StarlingMVC Framework 原理。。。

    向starlingmvc 中添加bean后..会根据Metadata标签,分别交给不同的Processor去处理...然后会执行每个bean的postConstruct函数.相当于初始化函数...可以 ...

  6. C++:构造函数和析构函数能否为虚函数

    原文:http://blog.csdn.net/xhz1234/article/details/6510568 C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可 ...

  7. python_基本语法

    初试牛刀 假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程.那么本教程将花费十分钟的时间带你走入Python的大门.本文的内容介于教程(Toturial)和速查手册(Cheat ...

  8. 连续调用inet_ntoa打印出错的问题

    近日写程序,在打印信息的时候调用了inet_ntoa函数,出现了打印一直出错的情况.google了一下,是因为inet_ntoa这类函数没有保证线程安全,其实现原理是在静态内容中申请一块内存,每次调用 ...

  9. TCP/IP协议原理与应用笔记18:构成子网和超网

    1. 引言: (1)类别IP编址(Classful IP)的缺陷 • 固定的3种IP网络规模      C类地址:少于255台主机的网络      B类地址:介于255~65535台主机的网络     ...

  10. Debian 7 安装 Python3.4

    Debian 7 自带的python是2.7.3,要用最新的3.4版本怎么办?我们从官网下载压缩包自己编译. 一.安装编译用的包 $ sudo apt-get install build-essent ...