自动程序更新和 Windows 7
Posted
技术标签:
【中文标题】自动程序更新和 Windows 7【英文标题】:Automatic program update and Windows 7 【发布时间】:2011-01-24 03:53:59 【问题描述】:我们有一套程序可以在启动时检查新版本,然后在需要时下载新版本以运行。这显然是 Windows 7 中的一个问题,当它被锁定为“标准用户”时,因为他们无法写入 c:\program 文件目录及以下目录。有人看过解决问题的应用程序示例吗?
我们的应用程序是用 Delphi 编写的,但任何语言的示例都会很有用。
提前致谢
更新:
我们已经有一个系统来确定是否存在新版本,唯一的问题是下载和安装(如果需要),因为这需要提升。我想不出不需要提升提示或我们的用户降低其安全设置的方法。
更新 2:
我已经问了subsequent question,而不是在这里添加一个新的
【问题讨论】:
【参考方案1】:应用安装有两种选择:
-
应用程序可供所有用户使用:安装或更新需要 Windows Vista 及更高版本的升级
该应用程序可供一位用户使用:在 %LOCALAPPDATA% 的用户配置文件中安装或更新该应用程序,无需提升
广告 2:Google Chrome 执行此操作。它在此处安装 .exe:
%LOCALAPPDATA%\Google\Chrome\Application\chrome.exe
--杰罗恩
【讨论】:
Jeroen,这看起来几乎是正确的答案。我也可以在本地(为一个用户)注册类型库吗? 您可以,如果您维护自己的注册机制。如果您使用默认(系统范围)注册机制,则不能。你想注册什么样的功能? 我们正在注册类型库。 Delphi 未发布的每个用户似乎都有一个 win api 调用来执行此操作。然后,我们使用这些类型库来提供允许将我们单独的功能聚合到一个“应用程序”中的功能。我们目前正在这样做,但在 xp 中我们可以摆脱它,而在 Windows 7 中我们不能。【参考方案2】:通常情况下,如果应用程序需要升级权限,您会看到它执行的操作是这样的。
-
应用程序确定是否需要升级
应用程序启动需要“管理员”权限的“更新程序”服务
应用程序会使用此更新自行更新
应用程序重新启动
这是一种很常见的情况,尤其是因为要更新您自己的 DLL,无论如何您都需要转到辅助进程。
【讨论】:
【参考方案3】:这里有一些技巧可以帮助您解决更新挑战:
-
如果您的文件名称为“update.exe”或“install.exe”,那么它将自动强制执行 UAC 提升提示。这是一种让现有软件绕过 Windows Vista/7 权限的简单方法。
从应用程序内部管理更新检查和更新过程不是一个好主意。问题是您的应用程序可能会锁定文件并需要自行更新。外部应用应管理您的更新。
最简单的更新解决方案是进行 HTTP 调用以检查当前产品版本号,然后在必要时下载安装程序二进制文件。这不会为您提供任何更新灵活性,但它是一种快速简便的解决方案。
我们公司销售专门帮助在 Windows 7 UAC 上自动更新的软件(您可以通过单击此处访问 AutoUpdate+:link text)。使用第三方解决方案(任何解决方案)的最佳理由是,您将拥有更大的更新灵活性,并避免支持不同 Windows 版本的挑剔挑战。
【讨论】:
【参考方案4】:或者您可以让用户运行启动器应用程序。
-
应用程序使用 LOCALAPPPATH\ 文件夹来存储主应用程序的缓存。
启动器检查互联网是否有比缓存文件更新的文件版本。
Launcher 在 LOCALAPPPATH 中启动缓存的应用程序
【讨论】:
如果您启动的应用程序包含“setup”或“install”作为其名称的一部分,它会自动提升(当然是在提示之后),这允许它写入那些受保护的位。跨度> @skamradt - 完美,是的 - 只要记住它需要使用 setup 或 install 作为名称的一部分进行编译,之后不能重命名!【参考方案5】:您的应用可以检查远程服务器上是否有新版本可用。如果是这样,那么它可以将更新文件下载到用户特定文件夹之一中,例如用户的临时文件夹。您可以使用SHGetSpecialFolder API 函数获取此类特殊文件夹的地址。
下载完成后,您可以弹出一个对话框,告诉用户您已准备好进行更新。如果用户同意更新,那么您可以使用提升的权限(以管理员身份)运行更新程序,并且更新程序可以将安装路径中的现有文件替换为用户 Temp 文件夹中已下载的文件。要以管理员身份运行更新程序,您可以使用ShellExecute:
ShellExecute(0,'runas','notepad.exe',nil,nil,SW_SHOWNORMAL);
更新完成后,您的更新程序进程可以重新启动您的应用。
【讨论】:
你不能提升一个已经在运行的进程,但是你可以启动一个提升到管理员权限的新进程,上面的代码就是这样做的。【参考方案6】:您需要有一个单独的可执行文件来更新工作。更新程序需要有一个清单,将其标记为需要提升。
见:http://msdn.microsoft.com/en-us/library/bb756929.aspx
【讨论】:
【参考方案7】:如果您的应用程序使用 MSI (Windows Installer) 作为其安装程序,那么 User Account Control Patching(如果配置正确)可以让您安装更新而无需提升。
【讨论】:
【参考方案8】:如果您的安装程序不是在管理员下运行 - 您不需要任何额外的权限来安装更新。
如果您的安装程序在 admin 下运行 - 那么它可以在 Task Sheduler 中创建一个任务。比如说,每周运行一次此任务,在此帐户(管理员)下并以最高权限运行。任务将是您的更新程序。很简单。
【讨论】:
另见:blogs.msdn.com/b/larryosterman/archive/2007/08/20/…以上是关于自动程序更新和 Windows 7的主要内容,如果未能解决你的问题,请参考以下文章
Windows 7Windows XP SP3关闭DEP堆栈执行保护
组件局域网中的无集线器Windows XPWindows 7Windows 8的对等网
windows 7Windows10 系统目录迁移,修改安装的默认路径:Users,Program Files,ProgramData