【发布时间】:2014-03-07 02:33:17
【问题描述】:
我想创建一个程序Foo.exe,但错误登录到foo.log。该程序已安装(NSIS 安装程序)到C:\Program Files (x86)\Foo\。在安装过程中,NSIS 添加了一个快捷方式 (CreateShortCut "$SMSTARTUP\Foo.lnk" "$INSTDIR\Foo.exe") 以在 windows 启动时启动 Foo.exe。
- 当 Windows 在启动后执行我的程序时,它会以“非管理权限”启动我的程序。所以我的程序不能编辑
C:\Program Files (x86)\Foo\foo.log。解决方法是将可编辑文件存储在另一个目录中,例如在$APPDATA。 - 但是真正的问题来了:我在我的程序中添加了一个更新功能,它的工作方式如下:
- 下载新的二进制文件并保存为
FooNew.exe。此文件没有任何权限(明确没有执行标志)。 - 创建具有执行权限的自我副本:
FooCopy.exe - 启动后
FooCopy.exe打开FooNew.exe并将其内容写入Foo.exe。现在,Foo.exe已更新并具有执行权限。 -
FooCopy.exe将被删除。
- 下载新的二进制文件并保存为
所以我没有测试更新,但很可能它不会工作。我假设Foo.exe 无法在C:\Program Files (x86)\Foo\ 中创建文件,因此更新在第 1 点失败。
一个想法是将Foo.exe 保存在C:\Program Files (x86)\ 中而不是$APPDATA 中。所以该程序具有所有需要的权利。问题是启动该程序:它是为 32 位编译的。是否有可能有一个“启动器”C:\Program Files (x86)\Foo\launcher.exe 在$APPDATA 中启动真正的应用程序?
这很混乱,不是吗?我怎样才能更改自动更新程序,以便 UAC 不会踢我?
作为一个例子,我看到了firefox.exe。它如何更新,因此,当通常没有人可以在不提示用户的情况下写入该目录时直接写入C:\Program Files (x86)\...。
克里斯
【问题讨论】:
-
软件初次安装时,需要安装一个服务来负责自动更新。不要将服务配置为自动启动,而是将其配置为无需管理员权限即可启动。确保服务在安装之前正确验证更新是真实的(例如,通过验证它是否使用您的证书签名)。
-
您的意思是服务
FooUpdater.exe将在没有管理员权限的情况下执行?但是该服务如何修改 ProgramFiles 目录中的Foo.exe之类的文件?我对代码签名不太了解,所以我必须为此签名吗?请给我更详细的信息…… -
不,我的意思是以管理员权限运行的服务。