zoukankan      html  css  js  c++  java
  • 《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

  • 相关阅读:
    QT 图形视图框架
    QSting, QChar, char等的转换
    ucosii(2.89)mbox 应用要点
    ucosii(2.89)semaphore 应用要点
    ucosii(2.89)mutex 应用要点
    ucosii(2.89) 在Lpc1765移植中定时器的使用。
    c++中虚函数的需要性,虚析构函数的必要性
    转 在Qt中用QAxObject来操作Excel
    关于 QObject 类
    关于sigleton模式
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/4132290.html
Copyright © 2011-2022 走看看