Windows编程之进程令牌权限

进程的权限

在很多时候,我们想要对一些系统进程进行一些操作,例如说修改之类的,对于普通用户来说是不行的,因为这种行为比较危险,需要有对于该计算机较高权限的人才能进行这种操作。

但是有的时候,明明我们是管理员,但是还是会出现拒绝访问的提示,是怎么回事呢?原来有的权限默认是没有开通的,既然都没有开通,那么就算你是管理员也肯定不能使用呀,因此就需要我们进行开通就好了。

修改进程的权限

想要修改权限,那么首先利用OpenProcessToken函数打开进程的访问令牌

一般使用如下方式:

1
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);

这里利用GetCurrentProcess函数打开获取自己的进程句柄,然后第二个参数是想要操作的类型,第三个参数是返回的访问令牌的句柄

之后,要获取进程的本地唯一ID,也就是LUID。

说到LUID,我向大家应该都听过GUID,比如在用户组中,每个用户的GUID是唯一的,那么LUID是保证局部唯一,也就是每次进程运行的时候都有个唯一的ID,只有获取了这个LUID,才能在最后进行修改权限

一般利用LookupPrivilegeValue函数进行获取:

1
LookupPrivilegeValue(NULL, name, &luid);

这里第一个参数是系统名称,一般都是本地系统,就可以直接使用NULL就好了。第二个参数是权限的名称,第三个参数就是获取的luid。

在之后就是修改进程的权限了,利用AdjustTokenPrivilege函数

1
AdjustTokenPrivilege(hToken, 0, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);

这里第一个参数是之前返回的进程令牌的句柄,第二个参数是决定权限是修改还是禁用,第三个参数是一个指向TOKEN_PRIVILEGES结构体的指针,第四个就是这个结构体的大小,后两个可空。

当然了,在执行AdjustTokenPrivilege函数之前,需要对TOKEN_PRIVILEGES指针进行赋值,它的结构如下:

1
2
3
4
5
6
7
8
9
typedef struct _TOKEN_PRIVILEGES{
DWORD PrivilegeCount;
LUID_AND_ATTRIBUTE Privilege[];
}TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;

typedef struct LUID_AND_ATTRIBUTE{
LUID Luid;
DWORD Attributes;
}LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES

PrivilegeCount是指数组元素的个数,然后是一个数组,其中的attribute一般我们想要使用一个权限就设置为SE_PRIVILEGE_ENABLED,luid根据LookupPrivilegeValue来获取

参考

百度百科

本文标题:Windows编程之进程令牌权限

文章作者:Pino-HD

发布时间:2018年10月15日 - 15:10

最后更新:2018年10月15日 - 15:10

原始链接:https://pino-hd.github.io/2018/10/15/Windows编程之进程令牌权限/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!