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

  • 相关阅读:
    四、jdk工具之jstat命令2(Java Virtual Machine Statistics Monitoring Tool)详解
    Blob、InputStream、byte[]、String互转
    从 iBatis 到 MyBatis
    MySQL类型之(字符串列类型区分、数据类型区分)
    实体机与虚拟机linux文件互拷贝
    高并发高负载的大型网站系统架构
    JDK的动态代理深入解析(Proxy,InvocationHandler)(转)
    mysql索引之九:重复索引和冗余索引,索引和锁
    linux时间同步,ntpd、ntpdate
    mysql函数之十:mysql 字符串类型及二进制字符串类型大小写比较
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/4132290.html
Copyright © 2011-2022 走看看