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\n", 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\n", GetLastError() );
        return FALSE;
    } 

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)

    {
        printf("The token does not have the specified privilege. \n");
        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

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

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

 

 

关于TOKEN_PRIVILEGES结构

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

时间: 2024-11-07 20:04:01

AdjustTokenPrivileges启用权限的相关文章

程序的开机关机重启,开机启动,休眠功能delphi实现(使用AdjustTokenPrivileges提升权限)

TShutDownStatus = (sdShutDown,sdReboot,sdLogOff,sdPowerOff); procedure ShutDown(sdStatus : TShutDownStatus); var     NewState:       TTokenPrivileges;     lpLuid:         Int64;     ReturnLength:   DWord;     ToKenHandle:    Cardinal;  begin     Open

关于windows上的账号(权限)切换

这2年一直在做一个运维项目,如果你要在windwos上实现不同进程的权限切换,那么这篇文章会对你有用的! 最重要的函数CreateProcessWithLogonW 在UNIX平台上如果你要对一个进程降权有跟多办法,不管是su命令 还是python的os函数都可以很容易的达到目的. 但是在windwos上要降权就不是很容易了.基本原则就是高级权限切低级权限不需要密码,低级权限使用高级权限需要密码. 依赖模块代码如下 文件名:win_startup.py # -*- coding: utf-8 -

七:HDFS Permissions Guide 权限

1.权限模式     简单:启动HDFS的操作系统用户即为超级用户,可以通过HADOOP_USER_NAME指定 kerberos: 2.group mapping 组列表由group mapping service完成,该服务由hadoop.security.group.mapping参数决定,默认值是org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback,即由JNI. 如果没有JNI, 使用org.apache.had

MongoDB 学习笔记之 权限管理基础

权限管理基础 MongoDB有很多用户roles,这里只是简单列举下命令的使用,具体的role的含义,请查阅官方文档. https://docs.mongodb.com/manual/reference/built-in-roles/#userAdmin 在启用权限验证之前,需要重启服务,开启auth: 命令使用示例: use admin; #创建用户,这里Mongo 3和Mongo 2用的方法不同了. db.createUser({user: 'sky', pwd: 'CSL', roles:

用户权限控制之命令篇

背景:如果数据库启动没有启用权限控制,那么只要通过IP,PORT就能连上,危险性很高,所有要设置用户访问权限.一.在未设置权限状态下,增加访问用户.> use adminswitched to db admin>db.system.users.find()> db.createUser( {user:"myUserAdmin",pwd:"abc123",roles:[{role:"readWriteAnyDatabase",db

mongodb 设置权限

切换到要加密的数据库use diary 创建有 readWrite 权限的用户db.createUser({ user: "youruser", pwd: "yourpassword", roles: [{ role: "readWrite", db: "diary" }] }) 启用权限验证./mongod --auth 命令行连接./mongo -u "youruser" -p "yourpa

单体物联平台系统(Springboot整合shiro实现多realm多用户表多权限表登陆)

参考实现:http://www.qchcloud.cn/tn/article/30 一.技术框架 本项目基于Spring,整合Apache Shiro框架,实现用户管理和权限控制,主要内容如下: 1.登录(带验证码),包括"记住我"的功能: 2.加密,存储的密码不采用明文: 3.session管理:使用shiro默认的session管理替代Tomcat的HttpSession: 4.shiro拦截器:对静态文件(HTML/JS/CSS等)进行权限控制,无权限则请求不到: 5.后台接口权

Java如何访问private变量

大家都知道private变量是无法访问的,一编译就报错根本无法访问啊.本文教你如何破解这种限制. 实现的原理是利用了Java的反射机制. 首先定义一个最简单的类,只有一个私有变量和一个公开的方法.代码如下: class Foo { private String message = "This is a Foo."; public void show() { System.out.println(message); } } 正常情况下调用show函数会输出“This is a Foo.”

一步一步学Vue(九)

接上篇,这次是真的接上篇,针对上篇未完成的部分,增加鉴权功能,开始之前,我们先要介绍一个新的知识,路由元数据. 在vue-router中,定义元数据的方式: const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, children: [ { path: 'bar', component: Bar, // a meta field meta: { requiresAuth: true } } ] } ] })