【问题标题】:C# - Windows 7 - Create file inC# - Windows 7 - 在中创建文件
【发布时间】:2011-05-16 15:38:29
【问题描述】:

基本上,我有一个安装在用户计算机上的应用程序。

用户使用的是 Windows 7。 用户没有被授予管理员权限。 但是,应用程序需要能够将文件保存到它自己的 Program Files 目录中。

我想走的路是:

  1. 下载各种二进制文件(网络服务)。
  2. 将二进制文件写入临时文件夹中的文件。
  3. 启动控制台应用程序。 (控制台应用等待主应用关闭)
  4. Console App 将临时文件复制到 Program Files 目录。
  5. Console App 重新启动主应用程序。
  6. 控制台应用程序关闭。

问题是我知道 Windows 7 不允许未以管理员身份运行的应用程序写入 Program Files 目录,并且我理解原因(出于安全考虑),但由于我自己编写此应用程序,因此将其安装在机器自己,有没有办法让我的应用程序能够写入它所在的任何目录(独立于平台,因为它使用相对路径)而没有弹出框要求以管理员身份运行应用程序?不能将应用程序签名为始终以管理员身份运行吗?

事实上,我什至不需要主应用程序以管理访问权限运行。我需要控制台应用程序(复制临时文件的应用程序)才能将这些临时文件复制为永久文件。


更新:是的,这是针对自动更新应用程序的。我考虑过 ClickOnce 之类的东西,但还有一些额外的要求导致我创建自己的内部更新,主要是因为更新需要保持静默和逐个更新。有时(取决于更新的部分)应用程序需要关闭、移入文件、重新启动。其他时候,应用程序只需将文件移入并继续运行。

ClickOnce 不适合我的情况,我们的组织正在内部寻找一些东西,以便可以对其进行定制以满足我们未来的需求。

【问题讨论】:

  • 为什么不能从用户/程序数据文件夹或其他允许程序写入的位置加载文件?二进制文件中有什么?数据?还是代码('插件')?
  • 他正在尝试为他的应用程序进行自动更新并在更新后重新启动它,或者看起来......
  • 如果您想要自动更新,那么这可能会有所帮助:codeproject.com/KB/install/DDayUpdate_Part1.aspx
  • 您绝对必须拥有执行此操作的管理权限。这意味着您必须要求用户提升负责的流程。当然,这并不是什么新鲜事,它只是由 UAC 更好地执行。
  • 如果说“我不会做坏事”这么简单,那么这些安全措施的意义何在?

标签: c# windows-7 file-access


【解决方案1】:

正如 cmets 已经指出的那样:如果您有较新版本的 Windows (Vista+)、启用 UAC(默认)和非管理员用户,则无法访问 ProgramFiles。

您更新后的问题表明您需要更新(至少部分)您的应用程序,并且可能需要重新启动。您创建了自己的方式来更新模块。

我的建议如下:不要写入 ProgramFiles

要么将您的应用程序完全安装到用户配置文件中,要么将其拆分。

我会尝试创建一个非常简单的可执行文件:

  • 设置shadowing,使程序集不被锁定

  • 在可写位置(ProgramData 或用户配置文件)查找程序集并加载它

  • 从那里运行应用程序

如果发生更新,您可以覆盖您的程序集(因为它们被隐藏并存储在合理的位置),并且在必要时停止程序/要求用户重新启动/实施重启机制。您不需要管理权限。

【讨论】:

    【解决方案2】:

    一种解决方案是在安装过程中更改已安装文件夹的权限。

    回声 y| cacls /E /T /P 用户:F

    【讨论】:

      【解决方案3】:

      要了解 UAC 的工作原理,首先尝试使用术语 PROCESS 而不是应用程序并阅读以下内容:

      • 进程的权利在进程开始之前确定
      • 从另一个进程派生的每个进程都继承其安全性,或者:
        • 要求海拔高度

      由此您可以推断出第 3 步:

      3. Launch a console app. (Console App waits for the main app to shutdown)
      

      将继承运行的第一个进程(您的应用)的权限。

      在某些时候,您需要请求海拔高度。如果这是在您的应用程序运行之前或在运行子进程之前,您可以选择。

      最用户友好的方法是在首次启动或安装时修改文件夹权限。这是一种不会每次都打扰用户的方法。但是某些 UAC 肯定会在某个时候弹出给用户。

      【讨论】: