C# - Windows 7 - 创建文件

本文关键字:文件 创建 Windows | 更新日期: 2023-09-27 17:56:29

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

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

我想走的路是:

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

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

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


更新:是的,这适用于自动更新应用程序。我想到了 ClickOnce 之类的,但还有其他要求导致我创建自己的内部更新,主要是因为更新需要保持沉默和一点一点。有时(取决于更新的部分)应用程序需要关闭,移入文件,重新启动。其他时候,应用程序只需要将文件移入并继续运行。

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

C# - Windows 7 - 创建文件

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

更新

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

我的建议如下:不要写程序文件

将应用程序完全安装到用户配置文件或将其拆分。

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

  • 设置阴影,以便程序集不被锁定

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

  • 从那里运行应用

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

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

echo y| cacls/e/t/p 用户:F

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

    进程
  • 的权限在进程开始之前确定
  • 从另一个进程生成的每个进程都会继承其安全性,或者:
    • 要求提升

由此可以推断出第 3 步:

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

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

在某些时候,您将需要要求提升。如果是在运行应用之前或运行子进程之前,这是您的选择。

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