进程的权限
在很多时候,我们想要对一些系统进程进行一些操作,例如说修改之类的,对于普通用户来说是不行的,因为这种行为比较危险,需要有对于该计算机较高权限的人才能进行这种操作。
但是有的时候,明明我们是管理员,但是还是会出现拒绝访问
的提示,是怎么回事呢?原来有的权限默认是没有开通的,既然都没有开通,那么就算你是管理员也肯定不能使用呀,因此就需要我们进行开通就好了。
修改进程的权限
想要修改权限,那么首先利用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 | typedef struct _TOKEN_PRIVILEGES{ |
PrivilegeCount是指数组元素的个数,然后是一个数组,其中的attribute一般我们想要使用一个权限就设置为SE_PRIVILEGE_ENABLED,luid根据LookupPrivilegeValue
来获取
参考
百度百科