• 《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

  • 相关阅读:
    ElasticSearch简介(一)——基础
    .net core 3.0中动态卸载程序集
    修改VisualStudio的智能提示字体大小
    使用VisualStudio或VisualStudio Code作为代码比较工具
    编写一个爬虫类库——(二)准备
    编写一个爬虫类库——(一)想法
    linearLayout 和 relativeLayout的属性区别(转)
    如何在Root的手机上开启ViewServer,使得HierachyViewer能够连接(转)
    反编译APK文件的三种方法(转)
    Java中的锁(转)
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/4132290.html
Copyright © 2020-2023  润新知