如何提升应用程序启动权限

来源:互联网 发布:免费留学国家知乎 编辑:程序博客网 时间:2024/05/17 09:25
关于提升权限,有两种方式:自动与手动。

1、手动提升权限

手动提升其实也很简单,用 ShellExecuteEx 函数就可以做到:

BOOL ShellExecuteEx(LPSHELLEXECUTEINFO pExecInfo);

typedef struct _SHELLEXECUTEINFO {
    DWORD cbSize;
    ULONG fMask;
    HWND hwnd;
    PCTSTR lpVerb;      // 必须设为runas
    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;

这样运行程序时就会弹出UAC对话框。

2、自动提升权限

    《Windows核心编程(第五版)》 4.5.1也讲到如何实现自动提升权限,但他只是提了一下,如果真要来实现,不同的环境下的具体操作可能会有所差异,它上面是这样讲的:

    如果在应用程序中可执行文件中嵌入一种特殊资源(RT_MANIFEST),其中系统会检查<trustInfo>段,下面是示例清单文件的<trustInfo>段。我们可以将清单保存到可知性文件所在目录中,名称和可执行文件相同且扩展名使用 *.manifest那么效果也是一样的。
    不过这个清单须要在注销系统后生效,可知性文件嵌入清单的优先权会比外部清单文件大。
...
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
         <requestedExecutionLevel
            level="requireAdministrator"
         />
       </requestedPrivileges>
    </security>
</trustInfo>
...

    本质上是通过加一个.manifest清单文件,里面加上requestedExecutionLevel标签。这个标签可能有三个值:
      <requestedExecutionLevel       level="asInvoker|highestAvailable|requireAdministrator"       uiAccess="true|false"/>
      asInvoker:应用程序使用与主调程序一样的权限来启动。(对于标准用户程序来说,这是推荐做法)      highestAvailable:应用误用与当前用户所能获得的最高权限来运行。(管理员就是管理员权限,标准用户就是标准用户的权限)      requireAdministrator:应用程序必须以管理员权限来启动。      这一段是从《Windows核发编程(第五版)》上面摘抄过来的。前面说过,它只是大概说了一下,不是很具体。      我在实现的过程中,参考了微软给的步骤,http://msdn.microsoft.com/en-us/library/bb756929.aspxmanifest文件的内容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">  <assemblyIdentity version="1.0.0.0"     processorArchitecture="X86"     name="IsUserAdmin"     type="win32"/>  <description>Description of your application</description>  <!-- Identify the application security requirements. -->  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">    <security>      <requestedPrivileges>        <requestedExecutionLevel          level="requireAdministrator"          uiAccess="false"/>      </requestedPrivileges>    </security>  </trustInfo></assembly>然后在资源文件中加入: #define MANIFEST_RESOURCE_ID 1MANIFEST_RESOURCE_ID RT_MANIFEST "IsUserAdmin.exe.manifest"或者在把这个.manifest文件添加到工程设置中:
  1. Open your project in Microsoft Visual Studio 2005.

  2. Under Project, select Properties.

  3. In Properties, select Manifest Tool, and then select Input and Output.

  4. Add in the name of your application manifest file under Additional manifest files.

  5. Rebuild your application.

            我几种方案都试了,但就是链接有错,什么错呢?如下:      "manifest authoring error c1010001: Values of attribute 'level' not equal in different manifest snippets."      我之前一直以为是我的.manifest文件写有有错,最好在网上查了一下,不是文件写错,而是环境的问题。      以上的做法适合在VS2005下面使用。在VS2005下面使用是没有问题的。      VS2008下面这种做法就不对,因为VS2008已经能生成一个.manifest文件。而且实现提升权限功能在VS2008下面相当简单:Properties->Configuration Properties->Linker->Manifest File[转载]如何提升应用程序启动权限      按照这样的设置就行了,所以在VS2008下面实现提升权限就不需要配置.manifest文件。经过配置后,重新编译出的程序的图标上面就会有一个小盾牌,运行时就会弹出UAC对话框。如下图所示。
[转载]如何提升应用程序启动权限
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新生儿吃了奶粉不吃奶怎么办 新生儿不吃奶也不吃奶粉怎么办 奶瓶吸奶费力不顺畅怎么办 宝宝吃奶粉太勤怎么办 香蕉和地瓜一起吃了怎么办 贝亲奶瓶泡沫多怎么办 四个多月的宝宝拉肚子怎么办 宝宝四个月了拉肚子怎么办 四个月宝宝火大怎么办 刚出生的宝宝便秘怎么办 小宝宝破腹产吸了几口羊水怎么办 换奶粉不拉屎了怎么办 婴儿吃奶粉不拉屎怎么办 1岁半突然不喝奶怎么办 6个月宝宝不吃奶粉怎么办 7个月宝宝不吃奶粉怎么办 5个月宝宝不吃奶粉怎么办 一岁两个月宝宝不长肉怎么办 7个月宝宝肚子疼怎么办 奶喝一半凉了怎么办 5个月孩子厌奶怎么办 怀孕后特别不爱吃水果怎么办 宝宝吃了无比滴怎么办 婴儿上火怎么办吃什么可以去火 肚子胀怎么办最快的方法 40天婴儿拉水怎么办 8个月宝宝坐不稳怎么办 宝宝段奶不吃奶粉怎么办 3个月宝宝头睡偏了怎么办 2个月婴儿抱着睡怎么办 两个半月的宝宝睡眠少怎么办 七个月宝宝不愿意坐怎么办 一个多月的宝宝老是哭闹怎么办 宝宝头老往后仰怎么办 8个月宝宝不会爬怎么办 孩子个头长得慢怎么办 宝宝个头长得慢怎么办 婴儿个头长得慢怎么办 11个月宝宝认生怎么办 3个月宝宝认人怎么办 3个月的宝宝认生怎么办