对于进程提升权限主要用到下面三个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缓存区要求的大小
);
看代码:
- HANDLE TokenHandle;
 -  if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &TokenHandle))
 -  {
 -        return ;
 -  }
 -  TOKEN_PRIVILEGES t_privileges = {0};
 -  if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &t_privileges.Privileges[0].Luid))
 -  {
 -        return ;
 -  }
 -  t_privileges.PrivilegeCount = 1;
 -  t_privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 -  if(!AdjustTokenPrivileges(TokenHandle, FALSE, &t_privileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
 -  {
 -        CloseHandle(TokenHandle);
 -        return ;
 -  }