8

我们有一套程序可以在启动时检查新版本,然后在需要时下载新版本以运行。这显然是 Windows 7 中的一个问题,当它被锁定为“标准用户”时,因为他们无法写入 c:\program 文件目录及以下目录。有人看过解决问题的应用程序示例吗?

我们的应用程序是用 Delphi 编写的,但任何语言的示例都会很有用。

提前致谢

更新:

我们已经有一个系统来确定是否存在新版本,唯一的问题是下载和安装(如果需要),因为这需要提升。我想不出不需要提升提示或我们的用户降低其安全设置的方​​法。

更新 2:

我问了一个后续问题,而不是在这里添加一个新问题

4

8 回答 8

7

应用程序安装有两种选择:

  1. 应用程序可供所有用户使用:安装或更新需要 Windows Vista 及更高版本的升级
  2. 该应用程序可供一位用户使用:在%LOCALAPPDATA%的用户配置文件中安装或更新应用程序,无需提升

广告 2:谷歌浏览器会这样做。它在此处安装 .exe:

%LOCALAPPDATA%\Google\Chrome\Application\chrome.exe

——杰伦

于 2010-03-06T09:53:28.173 回答
6

通常,如果应用程序需要升级权限,您会看到它执行的操作是这样的。

  1. 应用程序确定是否需要升级
  2. 应用程序启动需要“管理员”权限的“更新程序”服务
  3. 应用程序使用此更新后自行更新
  4. 应用程序重新启动

这是一个很常见的场景,尤其是因为要更新您自己的 DLL,您无论如何都需要进入辅助进程。

于 2010-03-05T15:02:55.973 回答
3

以下是一些技巧,可帮助您解决更新挑战:

  1. 如果您的文件名称为“update.exe”或“install.exe”,那么它将自动强制执行 UAC 提升提示。这是使现有软件绕过 Windows Vista/7 权限的简单方法。
  2. 从您的应用程序中管理更新检查和更新过程并不是一个好主意。问题是您的应用程序可能会锁定文件并需要自行更新。外部应用程序应管理您的更新。
  3. 最简单的更新解决方案是进行 HTTP 调用以检查当前产品版本号,然后在必要时下载安装程序二进制文件。这不会为您提供任何更新的灵活性,但它是一种快速简便的解决方案。

我们公司销售专门帮助在 Windows 7 UAC 上自动更新的软件(您可以通过单击此处访问 AutoUpdate+:链接文本)。使用第三方解决方案 - 任何解决方案 - 的最佳理由是您将拥有更大的更新灵活性,并且还避免了支持不同 Windows 版本的挑剔挑战。

于 2010-06-14T15:37:10.113 回答
1

或者您可以拥有它,以便用户运行启动器应用程序。

  1. 该应用程序使用 LOCALAPPPATH\ 文件夹来存储主应用程序的缓存。
  2. 启动器检查互联网是否有比缓存文件更新的文件版本。
  3. Launcher 在 LOCALAPPPATH 中启动缓存的应用程序
于 2010-03-05T15:31:09.940 回答
1

您的应用可以检查远程服务器上是否有新版本可用。如果是这样,那么它可以将更新文件下载到特定于用户的文件夹之一,例如用户的临时文件夹。您可以使用SHGetSpecialFolder API 函数获取此类特殊文件夹的地址。

下载完成后,您可以弹出一个对话框,告诉用户您已准备好进行更新。如果用户同意更新,那么您可以使用提升的权限(以管理员身份)运行更新程序,并且更新程序可以将安装路径中的现有文件替换为用户 Temp 文件夹中已下载的文件。要以管理员身份运行更新程序,您可以使用ShellExecute

ShellExecute(0,'runas','notepad.exe',nil,nil,SW_SHOWNORMAL);

更新完成后,您的更新程序进程可以重新启动您的应用程序。

于 2010-03-05T16:33:15.153 回答
1

您需要有一个单独的可执行文件来更新工作。更新程序需要有一个清单,将其标记为需要提升。

请参阅:http: //msdn.microsoft.com/en-us/library/bb756929.aspx

于 2010-03-05T21:42:24.370 回答
1

如果您的应用程序使用 MSI (Windows Installer) 作为其安装程序,则用户帐户控制补丁(如果配置正确)可以让您安装更新而无需提升。

于 2010-06-14T15:44:57.507 回答
0
  1. 如果您的安装程序不是在管理员下运行 - 您不需要任何额外的权限来安装更新。

  2. 如果您的安装程序是在管理员下运行的 - 那么它可以在 Task Sheduler 中创建一个任务。比如说,每周运行一次此任务,在此帐户(管理员)下并以最高权限运行。任务将是您的更新程序。简单的。

于 2010-06-15T00:35:22.367 回答