我有一个可执行文件,它通过InnoSetup默认安装到Program Files\FolderName中。exe有一个第三方组件,它可以在线检查新版本并下载它们,然后做一些麻烦来替换exe——简单的东西。问题是,它不能在程序文件中这样做,因为那里有必要的安全性。我在读Windows7-Can';t更新我的程序';s文件,其中David Hefferman给出了一个解决方案,但似乎说这是一个坏主意,但我不知道这个坏主意是指他的解决方案还是OP的评论!
那么,程序更新自身的首选方法是什么呢?一个将在XPSP3到Win8上工作的。我似乎找不到合适的短语来输入谷歌,给我相关的结果。为了简单起见,暂时忽略数字签名之类的东西。
(请注意,这看起来像是我把它作为一个意见问题,但它不是-一定有一些MS认可的方法,我找不到。FWIW这是一个Delphi程序,但任何Win32注释都可以)
第三方更新实用程序需要以管理权限运行,您可以通过编程实现这一点。
在程序文件中安装应用程序没有错,这是该文件夹的指定用途。但是,应用程序使用的用户数据应该存储在不同的位置。
无论你运行第三方实用程序,你都应该首先检查Windows操作系统版本,看看是否真的有必要摆弄UAC(Vista+…),然后在提升状态下运行该实用程序。
他说,篡改系统让普通用户可以在"程序文件"中写入是"极其糟糕的做法"。
如果你的程序在"程序文件"中,它是用系统管理员权限安装的。因此,更新也需要安装系统管理员权限。
您可以将InnoSetup配置为请求管理权限,这样您就可以写入"程序文件",但如果第三方组件不这样做,则最好将所有内容安装在其他目录中。
即C:\Your_Program
这样你的第三方组件就可以在那里写作了。
这里有几个选项:
- 最简单的方法是:将updater作为一个单独的带有manifest的程序,这需要管理员权限。此外,当您启动更新程序时,您可以请求管理员权限。或者,您可以将更新程序移动到进程外的COM对象中,而不是单独的exe
- 您可以在安装程序期间创建具有管理权限的隐藏用户。然后,您将使用此用户的凭据运行更新程序
- 您可以在安装程序期间安装系统服务,该服务将从系统帐户运行。因此,您的更新程序将作为一项服务来实现