惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
D
DataBreaches.Net
D
Docker
云风的 BLOG
云风的 BLOG
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
罗磊的独立博客
Martin Fowler
Martin Fowler
U
Unit 42
Engineering at Meta
Engineering at Meta
IT之家
IT之家
Vercel News
Vercel News
B
Blog RSS Feed
人人都是产品经理
人人都是产品经理
博客园 - Franky
博客园 - 【当耐特】
Stack Overflow Blog
Stack Overflow Blog
G
Google Developers Blog
MongoDB | Blog
MongoDB | Blog

博客园 - Max Woods

Delphi XE8,C++ Builder XE8,RAD Studio XE8 官方 ISO 文件下载,附激活工具 PC 安装MAC InnoSetup能够实现“安装细节描述”界面吗? 在Unicode版Inno Setup中使用ISSkin Inno Setup使用技巧 用非管理员权限启动主程序,并用管理员权限启动子程序,导致WM_COPYDATA消息发送失败的问题 Inno setup 安装*.inf文件_示例 自动安装驱动程序代码 自动安装驱动程序 windows xp/7命令提示符强制结束指定进程 Delphi 如何让程序获取权限结束指定进程? Windows下如何枚举所有进程 使用MFC提供的Http类下载和上传文件 如何在安装程序中判断操作系统是否是64位 inno INNO setup安装卸载钱判断进程中是否在运行总结 innosetup安装之前关闭进程 INNO安装卸载自动结束进程插件使用 Inno Setup 卸载前关闭进程或服务 x86 x64 Windows下提升进程权限
《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提...
Max Woods · 2014-11-30 · via 博客园 - Max Woods

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