<转载>提升程序的特权(AdjustTokenPrivileges)
首先列出需要的函数
1.OpenProcessToken
2.AdjustTokenPrivileges
3. LookupPrivilegeValue
--------------------------------------------------------------
首先需要获取进程的令牌句柄
OpenProcessToken的原型.
| 1 2 3 4 5 | BOOLWINAPI OpenProcessToken(    __in          HANDLEProcessHandle,    __in          DWORDDesiredAccess,    __out         PHANDLETokenHandle  ); | 
第一个参数 进程句柄(当前进程为GetCurrentProcess()为参数)
第二个参数 访问令牌特权
第三个参数 返回的参数 就是AdjustTokenPrivileges的第一个参数
例子:
| 1 2 3 4 5 6 7 8 9 10 11 | HANDLEhToken;      boolretn = 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 | typedefstruct_TOKEN_PRIVILEGES      {         DWORDPrivilegeCount;          LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];  }TOKEN_PRIVILEGES; | 
下面的参数是个特权数组。
上面的参数是要修改的特权数目
LUID_AND_ATTRIBUTES 结构体
| 1 2 3 4 5 | typedefstruct_LUID_AND_ATTRIBUTES   {           LUID Luid;           DWORDAttributes;  } LUID_AND_ATTRIBUTES; | 
第一个参数是Luid是一个标志,不同的Luid代表着各种不同的特权类型
第二个参数是要这个特权干嘛,如启用这个特权(SE_PRIVILEGE_ENABLED)
这里的Luid的值需要用LookupPrivilegeValue来获取。
------------------------------------------------------------------------------------------
LookupPrivilegeValue的原型
| 1 2 3 4 5 | BOOLWINAPI LookupPrivilegeValue(    __in_opt      LPCTSTRlpSystemName,    __in          LPCTSTRlpName,    __out         PLUID lpLuid  ); | 
第一个参数是系统的名字,如果为NULL,就是本地名字(这里就填NULL)
第二个参数是特权的名字,要查看详细特权,看我的博客里翻译分类里的 包含特权 的文章。(在这里写SE_DEBUG_NAME)
第三个参数就可以通过指针返回一个LUID类型的Luid的标识了。 通过这个值就可以填入刚才的结构体里了。
----------------------------------------------------------------------------------------------------------------------------
最后就可以介绍AdjustTokenPrivilege就应该没什么问题了。
它的原型为:
| 1 2 3 4 5 6 7 8 | BOOLWINAPI AdjustTokenPrivileges(    __in          HANDLETokenHandle,    __in          BOOLDisableAllPrivileges,    __in_opt      PTOKEN_PRIVILEGES NewState,    __in          DWORDBufferLength,    __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>     usingnamespacestd;               voidmain()     {             BOOLretn;             HANDLEhToken;             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)的更多相关文章
- 提升程序的特权(AdjustTokenPrivileges)
		首先列出需要的函数 1.OpenProcessToken 2.AdjustTokenPrivileges 3. LookupPrivilegeValue ----------------------- ... 
- [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能
		[.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ... 
- 记忆用户设置-提升程序的体验VB/C#
		有时候,设计的程序有很多的控件,甚至多达近百个,尤其是一些工控软件等,程序运行所需的各种参数都是由用户通过这些控件设置而来,那么记录用户的设置就显得十分必要.如果程序出现异常,起码重新打开可以不用再一 ... 
- EXCEL VBA——数组,使用数组提升程序效率
		数组的存在价值就是让代码提速. 数组和非数组的差异只在于数据的保存和读取方式不同,虽然操作这些数据的方法或者函数并没有不同,但是保存与读取上的差异却使VBA代码在处理数据时实现了质的飞跃.在完成相同工 ... 
- python之提升程序性能的解决方案
		Python在性能方面不卓越,但是使用一些小技巧,可以提高Python程序的性能,避免不必要的资源浪费. 1. 使用局部变量 尽可能使用局部变量替代全局变量,可以是程序易于维护并且有助于提高性能节约成 ... 
- Python3用多线程替代for循环提升程序运行速度
		[本文出自天外归云的博客园] 优化前后新老代码如下: from git_tools.git_tool import get_collect_projects, QQNews_Git from thre ... 
- 实用fork/join框架提升程序效率
		实用fork/join框架提成程序效率 原文地址:https://www.jianshu.com/p/9ce243796d4a 业务场景 最近再做一个接口,我是一个中央的消息接受方,当我接受到消息后要 ... 
- Function.apply()在提升程序性能方面的技巧
		我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所有参数中的最大值. 比如 alert(Math.max(5,8)) //8alert(Math.max(5,7 ... 
- PHP 开启 Opcache 功能提升程序处理效率
		简介 Opcache 的前生是 Optimizer+ ,它是 Zend 开发的 PHP 优化加速组件.Optimizer+ 将 PHP 代码预编译生成的脚本文件 Opcode 缓存在共享内存中供以后反 ... 
随机推荐
- Linux学习笔记----(2)
			闲着无事,就敲起了Linux 命令,熟悉一下.记得昨天在书上看到了 find命令的用法,觉得挺神奇的. 其中 find 能够确定文件的查找深度 于是 敲了如下命令: #mkdir father #to ... 
- cocos2d-x 手电筒效果
			转自:http://blog.csdn.net/xujiezhige/article/details/8448524# 常见的手电筒效果,可以通过CCRenderTexture来实现.主要是通过修改渲 ... 
- Codeforces Round #331 (Div. 2) B. Wilbur and Array 水题
			B. Wilbur and Array Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/596/p ... 
- JAVA static 作用
			static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ... 
- php实现网页标签补全方法(转)
			导读:PHP在生成静态文件的时候,有时候会因为一些混编问题让HTML标签不完整或混乱而导致页面混乱.作者分享下面这段小代码可以非常方便解决问题. 如果你的网页内容的html标签显示不全,有些表格标签不 ... 
- 迷途指针 new  delete
			编程中有一种很难发现的错误是迷途指针.迷途指针也叫悬浮指针.失控指针,是党对一个指针进行delete操作后——这样会释放它所指向的内存——并没有把它设置为空时产生的.而后,如果你没有重新赋值就试图再次 ... 
- MAC SVN Phonegap
			1. Windows上用VisualSVN Server Manager创建好Repository. 2. 在MAC上,用Phonegap创建好项目,比如在Project1目录里的App目录. 3. ... 
- jQuery获取表单各元素的值
			radio值获取 $("input[type='radio']:checked").val(); 2,设置指定的项为当前选中项 $("input[type='radio' ... 
- 小白日记12:kali渗透测试之服务扫描(二)-SMB扫描
			SMB扫描 Server Message Block 协议.与其他标准的TCP/IP协议不同,SMB协议是一种复杂的协议,因为随着Windows计算机的开发,越来越多的功能被加入到协议中去了,很难区分 ... 
- Asp.Net 之 WebService部署到服务器后出现" The test form is only available for requests from the local machine "
			最近由于任务需要开发了一个WebService, 部署到服务器以后,出现上述问题,网上查找到如下解决方案: 问题原因: 从 NET Framework 1.1 起定义了一个名为 HttpPostLoc ... 
