12

背景:
我有一个主应用程序,它需要能够访问网络并下载与之关联的 DLL 文件(我们编写的文件,位于我们的服务器上)。它确实需要能够将这些 DLL 文件下载到“C:\Program Files\”中的应用程序文件夹中。过去,我曾经System.Net.WebClient从网上下载我想要的任何文件。

问题
过去我在下载数据和保存到用户硬盘上的文件时遇到了很多麻烦。我收到很多用户报告说这不起作用,这通常是因为程序中的用户权限问题。

在程序用户权限存在问题的情况下,每个用户都可以转到网络上的确切文件位置,下载它,然后手动将其保存到正确的位置。

我希望它能够像我看到的所有其他下载/安装的程序一样工作(即 Firefox Pluign 更新、Flash Player、JAVA、Adobe Reader 等)。所有这些工作都顺利进行。

问题
我需要使用一些代码来授予我的下载程序对 Program Files 文件夹的特殊权限吗?我什至可以这样做吗?我应该使用更好的类或库吗?是否有不同的方法来下载我应该采用的文件,例如使用线程或其他方式来下载数据?

任何帮助在这里表示赞赏。如果可能的话,我想尽量远离第三方应用程序/库,当然,除了微软,由于许可问题,但仍然以我的方式发送任何建议。

同样,其他程序似乎也解决了版权问题和下载功能。我想要同样的能力。

4

6 回答 6

2

通常的做法是这样的:

  1. 您的应用程序检测到需要更新。
  2. 您的应用程序启动另一个(更新程序)应用程序,它将下载所需的文件并将它们安装到Program Files. 此更新程序应用程序必须以管理权限运行(即,在 Vista/Win7 中提示 UAC 提升)。确保这一点的最简单方法是将应用程序清单添加到该更新程序应用程序

如果用户是启用了 UAC 的管理员,第 2 点将导致出现必须接受的 UAC 提示(请注意,对于 Firefox/Acrobat/等更新程序也是如此)。如果用户不是管理员,则会要求他提供管理员凭据。(请注意,这是一件好事:应该只允许管理员升级为所有用户安装的应用程序。)

您的更新程序应用程序不需要以特殊方式编写:它可以System.Net.WebClient像以前一样使用。应用程序清单将确保它请求写入所需的权限Program Files

请注意,此问题(Program Files没有 UAC 提升的管理员无法写入)是操作系统功能,而不是编程语言限制,因此您不会仅通过“使用不同的库”来解决此问题。如果您希望您的应用程序在 Vista/Win7 上运行并写入Program Files,您需要 UAC 提升。

于 2011-02-13T15:19:56.930 回答
1

查看 BITS 服务:

http://msdn.microsoft.com/en-us/magazine/cc188766.aspx

于 2011-02-11T19:58:58.383 回答
0

在 Vista/Win7 上写入 Program Files 目录需要 UAC 提升(如果用户已启用)。请参阅此代码示例,了解如何提示用户获得许可:http: //msdn.microsoft.com/en-us/library/aa970890.aspx

确实,请考虑设计您的应用程序,以便将其写入更合适的位置,以免意外覆盖关键程序文件的风险。

于 2011-02-11T19:55:13.530 回答
0

试试http://netsparkle.codeplex.com/怎么样。非常成功的 Mac Sparkle 框架http://sparkle.andymatuschak.org/的移植。

于 2011-02-11T19:58:05.880 回答
0

它真的需要在程序文件中吗?我在应用程序中遇到了类似的问题,我们编写了一个类来解决未安装的程序集,首先尝试从 %usersprofile% 的子文件夹加载它们,然后尝试下载。如果您将 resolve 方法添加到当前应用程序域的 AssemblyResolve 事件,这可以是无缝的。

    AppDomain.CurrentDomain.AssemblyResolve+= AssemblyResolve;
    public Assembly AssemblyResolve(object sender, ResolveEventArgs args)
    {
         //try to get locally

         //try to download
         return assembly;
    }
于 2011-02-13T15:10:12.407 回答
-2

不要这样做。

理论上可以轻松完成。您只需午餐另一个应用程序,该应用程序以管理权限运行 - 您可以在配置中请求这些。在更新程序应用程序中,您只需连接到安全(ssl)网站,下载您需要的所有内容,您下载的文件必须经过加密签名。

这也可以使用 ClickOnce 或其他一些能够更新的 Web 安装程序轻松解决。

您不应该做的只是从未经验证的来源下载不安全的 DLL 并执行它们。

于 2011-02-11T20:06:07.557 回答