找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3933|回复: 0

《Windows核心编程》学习笔记(9)– 在win7或者vista系统

[复制链接]
发表于 2012-3-17 22:48:02 | 显示全部楼层 |阅读模式
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结构中惟一有趣的字段是lpVerb和lpFile。前者必须被设为“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系统下运行的时候会提示计算器程序要求提升为管理员权限运行,类似的窗口为:



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

ERROR_CANCELLED值来指出这个情况。


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

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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?用户注册

×
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-29 13:29 , Processed in 0.012891 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表