最近换用Windows7系统了,可是在用LabVIEW发布可执行文件后出现了一个新的问题。那就是在进行一些文档的读写操作时提示权限不够。究其原因,是Win7采用了比XP更严格的权限等级。

        Win7把可执行文件的执行等级分为3级:

asInvoker:以普通用户权限运行程序,不会提示需要取得管理员权限,不能读写受保护的文档。这也是LabVIEW发布exe文件的默认等级。

highestAvailable:以能够取得的最高权限运行程序。如果当前用户只有普通用户权限,则不会提示需要取得管理员权限,也不能读写受保护的文档;如果当前用户为管理员权限,则在运行时弹出一个窗口提示需要确认使用管理员权限运行程序,确认后可以读写受保护的文档。

requireAdministrator:运行时弹出界面,要求确认已管理员权限运行程序,或者要求输入管理员密码。确认后可以读写受保护的文档。

由以上可以看出,我们需要把执行等级提高到requireAdmministrator才能正常的读取受保护的文档。而这个等级是由manifest属性来控制的,要修改它需要使用微软提供的manifest 工具即mt.exe.(在附件中提供了下载)

把mt.exe放到和要修改的exe文件相同的目录下(不是必须这样做,但这样可以省去输入长串的路径),打开命令行cmd.exe并进入该目录, 输入以下命令(假设要修改的exe文件的名称为XXX.exe):

mt.exe -inputresouce:"XXX.exe" -out:"XXX.manifest"

该目录下会生成一个XXX.manifest文件,用记事本打开,会看到它是一个XML格式的文档,大体内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

把其中的 level="asInvoker"修改为level="requireAdministrator"并保存。

然后在命令行中输入以下命令:

mt.exe -manifest "XXX.manifest" -outputresource:"XXX.exe"

如果没有报错,就修改成功了,exe文件的图标上会多一个小盾牌,也可以删除manifest文档后再次执行第一条命令来确认。

如果报错,很可能是拼写错误。

参考文献:

http://zone.ni.com/reference/en-XX/help/371361F-01/lvconcepts/uac_app_manifests_and_dgsn/

http://zone.ni.com/reference/en-XX/help/371361F-01/lvhowto/editing_app_manifests/