自动程序更新和Windows 7

时间:2010-03-05 15:00:27

标签: delphi windows-7 installation uac privileges

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

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

提前致谢

更新

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

更新2:

我问了一个subsequent question,而不是在这里添加一个新的

8 个答案:

答案 0 :(得分:7)

应用程序安装有两个选项:

  1. 应用适用于所有用户:安装或更新需要提升Windows Vista及以上版本
  2. 该应用程序适用于一个用户:在%LOCALAPPDATA%中的用户个人资料中安装或更新应用程序,不需要提升
  3. 广告2:Google Chrome这样做。它在这里安装.exe:

    %LOCALAPPDATA%\谷歌\铬\应用\的chrome.exe

    - 的Jeroen

答案 1 :(得分:6)

通常情况下,如果应用程序需要升级权限,您会看到应用程序执行的操作。

  1. 应用程序确定是否需要升级
  2. 应用程序启动需要“管理员”权限的“更新程序”服务
  3. 应用程序使用此更新
  4. 更新自身
  5. 应用程序重新启动
  6. 这是一种非常常见的情况,特别是因为要更新自己的DLL,无论如何都需要进入辅助进程。

答案 2 :(得分:3)

以下是一些有关更新挑战的提示:

  1. 如果您的文件名称为“update.exe”或“install.exe”,则会自动强制执行UAC提升。这是使现有软件绕过Windows Vista / 7权限的简便方法。
  2. 在应用程序中管理更新检查和更新过程并不是一个好主意。问题是您的应用可能会锁定文件并需要自行更新。外部应用程序应管理您的更新。
  3. 最简单的更新解决方案是进行HTTP调用以检查当前产品版本号,然后在必要时下载安装程序二进制文件。这不会给您任何更新的灵活性,但它是一种快速简便的解决方案。
  4. 我们公司销售专门帮助Windows 7 UAC自动更新的软件(您可以点击此处访问AutoUpdate +:link text)。使用第三方解决方案的最佳理由 - 任何解决方案 - 都是您可以更灵活地使用更新,并避免支持不同Windows版本的挑战。

答案 3 :(得分:1)

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

  1. 应用程序使用LOCALAPPPATH \文件夹存储主应用程序的缓存。
  2. 启动器检查互联网是否有比缓存文件更新的文件版本。
  3. Launcher在LOCALAPPPATH
  4. 中启动缓存的应用程序

答案 4 :(得分:1)

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

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

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

如果您的应用程序使用MSI(Windows Installer)作为其安装程序,那么User Account Control Patching,如果配置正确,可以让您安装更新而不提升。

答案 7 :(得分:0)

  1. 如果您的安装程序未在管理员下运行,则无需任何其他权限即可安装更新。

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