S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

开发UAC兼容程序和安装包

Posted on 2009-08-14 10:23 S.l.e!ep.¢% 阅读(1235) 评论(0)  编辑 收藏 引用 所属分类: UAC

大家都知道 VISTA 中的 UAC 机制。很烦,动不动就来个提示。装软件也慢慢检查,慢的要命。有的人干脆把它关掉了事,可是有人却喜欢用。所以做软件开发的要兼顾两种用户,就必须使其开发的程序能在 UAC 开启的状态下能正常的安装和运行。

言归正传,先说说程序要在 VISTA 下运行,开发时应注意的几个问题

<!--[if !supportLists]-->1.              <!--[endif]-->有注册表操作时,不要修改HKEY_LOCAL_MACHINE里面的项,而把要写入注册表的项,写到HKEY_CURRENT_USER里面。

<!--[if !supportLists]-->2.              <!--[endif]-->安装文件到Program Files下,但是不要把程序运行是要修改的文件放到该目录下,而把程序经常读写的文件放到Appdata目录下 (xp下位于\Documents and Settings\用户\Local Settings\Application Data)

 

软件安装运行,需要权限。下面总结一下提示权限的几个方法:

<!--[if !supportLists]-->1.              <!--[endif]-->这个方法最简单:把要安装或者运行的程序改名,名称中含有”setup”,”install”,”update”时,VISTA系统会自动提升其权限。

<!--[if !supportLists]-->2.              <!--[endif]-->加上manifest文件。内容是

<?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>

  存为 你的程序名.exe.manifest C/C++ 中可以把这个内容嵌入到程序里。嵌入后的程序在 VISTA 中可以看到图标的右下角有一个小盾牌。具体步骤是,在添加资源时选择 customer, 编号一定要填 24 ,然后把这个文件贴到里面,把资源的 ID 改为 1. 编译即可。注意要修改程序名和权限。三种权限 asInvoker ,highestAvailabl, requireAdministrator 这里不具体介绍,网上很多资料。

C#, J# and Visual Basic 里面好像不可以直接把该 XML 文件作为资源文件放到 exe 里面,要用 VS 里带的工具 mt ( 开始菜单中找 )

具体步骤,进入 VS 的命令提示窗口 ,输入命令

mt.exe –manifest temp.manifest –outputresource:YourApp.exe;#1 .

即可把该 manifest 加入 exe ,注意 : 该方法对安装包不起作用。安装包另有办法。一会介绍。

 

安装包的部分问题和解决办法。

如果安装包里要写注册表,或者注册 DLL 组件,有可能会权限不够。我在做的时候遇到的问题是把注册 dll 的程序(单独写的)放到 installsheild 安装包里调用,权限不够,这个程序运行的时候,注册不了组件。给这个小程序加上 manifest 后放到打包文件里面去后,它不运行,不知道为什么。给安装包改名加上 ”install”/”setup” 都不管用。郁闷了很久,终于找到解决办法:

 

用小工具 ResHacker <!--[if !vml]--><!--[endif]--> ( 一个可以修改 EXE/DLL 资源的小程序 ) ,打开打包后的文件,找到一个名为 24 的项,打开,之后有为 1 的目录,点开,右边就会出现一些脚本,找到

      <requestedPrivileges>

        <requestedExecutionLevel

          level=" asInvoker " (就是这里)

          uiAccess="false"/>

        </requestedPrivileges>

       </security>

地方,改为 level="requireAdministrator" 。点编辑脚本,然后文件 à 保存就可以了,

<!--[if !vml]--><!--[endif]-->

在你打开的那个文件目录里面多了一个文件, youAppName_original.exe是原文件,youAppName.exe是改过的文件。改过的文件放到vista下就可以看到小盾牌了。权限提升成功,这样运行后,它里面调用的exe就有权限了,可以注册文件,修改注册表。

2007年10月8号补充,做安装包时就可以更改权限了,不需要像上面说的那么麻烦。在InstallShield的打包部分,Installation Designer->Release->Required Execution Level 选择Administrator就可以了

 

有看不明白的地方,欢迎来信 wangdl5201314@163.com QQ:56320367


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理