《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提升一个进程的运行权限

win7或者vista默认运行程序是在受限制的环境下运行的,以减轻病毒对于系统的破坏。那么我们怎样才能提升一个进程的权限以至让它在

管理员模式下运行。当然CreateProcess函数没有提供这个功能。相反我们需要调用的是ShellExecuteEx函数: 

 

BOOL ShellExecuteEx(LPSHELLEXECUTEINFO pExecInfo);

 

typedef struct _SHELLEXECUTEINFO {

  DWORD cbSize;

  ULONG fMask;

  HWND hwnd;

  PCTSTR lpVerb;

  PCTSTR lpFile;

  PCTSTR lpParameters;

  PCTSTR lpDirectory;

  int nShow;

  HINSTANCE hInstApp;

  PVOID lpIDList;

  PCTSTR lpClass;

  HKEY hkeyClass;

  DWORD dwHotKey;

  union {

     HANDLE hIcon;

     HANDLE hMonitor;

   } DUMMYUNIONNAME;

  HANDLE hProcess;

} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

 

SHELLEXECUTEINFO结构中惟一有趣的字段是lpVerblpFile。前者必须被设为“runas”,

后者必须包含使用提升后的权限来启动的一个执行体文件的路径,如以下代码段所示:

 

 

#include <Windows.h>

 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)

{

SHELLEXECUTEINFO lpExecInfo;

lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);

lpExecInfo.lpVerb = TEXT("runas");

lpExecInfo.lpFile = TEXT("calc.exe");

lpExecInfo.nShow = SW_SHOWNORMAL;

if (!ShellExecuteEx(&lpExecInfo))

{

if (GetLastError() == ERROR_CANCELLED)

{

MessageBox(NULL, "用户拒绝提升权限!", "提示", MB_OK | MB_ICONINFORMATION);

return 0;

}

else if (GetLastError() == ERROR_FILE_NOT_FOUND)

{

MessageBox(NULL, "文件没有找到!", "提示", MB_OK | MB_ICONINFORMATION);

return 0;

}

}

return 0;

}

 

 

此段代码在win7系统下运行的时候会提示计算器程序要求提升为管理员权限运行,类似的窗口为:

《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提升一个进程的运行权限 - fly - 飞晴编程小屋

 

 

如果用户拒绝提升权限,ShellExecuteEx 将返回FALSE GetLastError 通过使用一个

ERROR_CANCELLED值来指出这个情况。

 

注意,当一个进程使用提升后的权限启动时,它每次用CreateProcess来生成另一个进程时,子进程都会获得和它的父进程一样的提升后的权限,在这种情况下,不需要调用ShellExecuteEx

假如一个应用程序是用一个筛选后的令牌来运行的,那么一旦试图调用CreateProcess来生成一个要求提升权限的执行体,这个调用就会失败,GetLastError会返回 ERROR_ELEVATION_REQUIRED

 

 

posted @   Max Woods  阅读(572)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2013-11-30 DevExpress VCL for Delphi 各版本收集下载
2010-11-30 C#绘制条码CODE39和CODE39全码模式
点击右上角即可分享
微信分享提示