对当前进程进行提升权限

对于进程提升权限主要用到下面三个API

OpenProcessToken();打开权限令牌
LookupPrivilegeValue();检索一个唯一的本地标识符 LUID
AdjustTokenPrivileges();调整令牌特权

  BOOL OpenProcessToken(

   HANDLE ProcessHandle, //要修改访问权限的进程句柄
  DWORD DesiredAccess, //指定你要进行的操作类型
   PHANDLE TokenHandle //返回的访问令牌指针
  );
 



 BOOL LookupPrivilegevalue(

  LPCTSTR lpSystemName, // 表示所要查看的系统,本地系统直接用NULL
  LPCTSTR lpName, // 表示所要查看的特权信息的名称
  PLUID lpLuid //
接收所返回的制定特权名称的信息
  );

LUID是用来填充如下结构体的

typedef struct _TOKEN_PRIVILEGES {

DWORD PrivilegeCount; //令牌属性的个数

LUID_AND_ATTRIBUTES Privileges[]; //LUID和属性数组

} TOKEN_PRIVILEGES, *PTOKEN




BOOL AdjustTokenPrivileges(
  HANDLE
TokenHandle, //包含特权的句柄
  BOOL DisableAllPrivileges,//禁用所有权限标志
  PTOKEN_PRIVILEGESNewState,//新特权信息的指针(结构体)
  DWORD BufferLength, //缓冲数据大小,以字节为单位的PreviousState的缓存区(sizeof)
  PTOKEN_PRIVILEGES PreviousState,//接收被改变特权当前状态的Buffer
  PDWORD ReturnLength //接收PreviousState缓存区要求的大小
  
);


看代码:

  1. HANDLE TokenHandle;
  2. if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &TokenHandle))
  3. {
  4. return ;
  5. }

  6. TOKEN_PRIVILEGES t_privileges = {0};
  7. if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &t_privileges.Privileges[0].Luid))
  8. {
  9. return ;
  10. }
  11. t_privileges.PrivilegeCount = 1;
  12. t_privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  13. if(!AdjustTokenPrivileges(TokenHandle, FALSE, &t_privileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
  14. {
  15. CloseHandle(TokenHandle);
  16. return ;
  17. }

你可能感兴趣的:(权限)