背景资料:
我有一个主要的应用程序,需要能够去web和下载与它相关联的DLL文件(那些我们写的,位于我们的服务器上)。它确实需要能够将这些DLL文件下载到"C:\Program 文件\"。过去我用过 System.Net.WebClient 从网上下载我想要的任何文件。

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

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

我希望这个工作就像我见过的所有其他程序一样下载/安装在这个fastion(即Firefox Pluign更新,Flash Player,JAVA,Adobe Reader等)。所有这些工作都顺利进行。

这个问题
是否有一些代码我需要使用给我的下载程序对Program Files文件夹的特殊权限?我能做到吗?有没有更好的类或库,我应该使用?是否有不同的方法来下载我应该采取的文件,例如使用线程或其他东西下载数据?

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

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

有帮助吗?

解决方案

通常的方法是这样的:

  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高程。

其他提示

写入Program Files目录需要Vista/Win7上的UAC提升(如果用户已启用该提升)。有关如何提示用户输入权限,请参阅此代码示例: http://msdn.microsoft.com/en-us/library/aa970890.aspx

真的,请考虑设计你的应用程序,以便它写入一个更合适的地方,这样就不会有意外复盖关键程序文件的风险。

试试怎么样? http://netsparkle.codeplex.com/.非常成功的Mac Sparkle框架的一个端口 http://sparkle.andymatuschak.org/.

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

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

         //try to download
         return assembly;
    }

别这么做。

理论上它可以很容易地完成。您只需使用另一个应用程序,它以管理权限运行-您可以在配置中请求这些。在更新程序应用程序中,您只需连接到安全(ssl)网站,下载所需的所有内容,下载的文件 必须 用密码签名。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top