gpt4 book ai didi

c - 编写带有更新的 Windows 程序,权限问题

转载 作者:可可西里 更新时间:2023-11-01 09:29:03 24 4
gpt4 key购买 nike

我想创建一个程序 Foo.exe登录时出错 foo.log .该程序已安装(NSIS 安装程序)到 C:\Program Files (x86)\Foo\ 中.在安装过程中,NSIS 添加了一个快捷方式 ( CreateShortCut "$SMSTARTUP\Foo.lnk" "$INSTDIR\Foo.exe" ) 来启动 Foo.exe当 Windows 启动时。

  • 当 Windows 在启动后执行我的程序时,它以“非管理权限”启动我的程序。所以我的程序不能编辑C:\Program Files (x86)\Foo\foo.log .解决方法是将可编辑文件存储在另一个目录中,例如在 $APPDATA .
  • 但真正的问题来了:我在我的程序中添加了一个更新功能,其工作方式如下:
    • 下载新的二进制文件并另存为FooNew.exe .此文件没有任何权限(明确地没有执行标志)。
    • 创建具有执行权限的 self 副本: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)\...通常情况下,没有人可以在不提示用户的情况下写入该目录。

克里斯

最佳答案

Firefox 使用 NT 服务。服务通常作为 SYSTEM 运行,因此它可以将文件复制到任何地方,Mozilla 配置他们的服务,以便普通用户可以启动

在程序文件中有一个启动器而在 appdata 中有一个主应用程序是没有意义的,在这种情况下你还不如按用户安装(比如 Chrome 等)。

我假设您的应用程序不是网络浏览器,因此保持最新可能不是那么重要。我建议您的更新程序只检查更新,如果有更新,您可以使用 UAC 作为管理员再次生成自己(或主更新程序?),然后进行更新。

关于c - 编写带有更新的 Windows 程序,权限问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22240341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com