C#-Windows 7-在中创建文件

C#-Windows 7-在中创建文件,c#,windows-7,file-access,C#,Windows 7,File Access,基本上,我有一个安装在用户计算机上的应用程序 用户在Windows7上。 用户没有管理员权限。 但是,应用程序需要能够将文件保存到自己的程序文件目录中 我想走的道路是: 下载各种二进制文件(web服务) 将二进制文件写入临时文件夹中的文件 启动一个控制台应用程序。(控制台应用程序等待主应用程序关闭) 控制台应用程序将临时文件复制到程序文件目录 控制台应用程序重新启动主应用程序 控制台应用程序关闭 问题是,我知道Windows 7不允许以管理员身份运行的应用程序写入Program Files目录,

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

用户在Windows7上。 用户没有管理员权限。 但是,应用程序需要能够将文件保存到自己的程序文件目录中

我想走的道路是:

  • 下载各种二进制文件(web服务)
  • 将二进制文件写入临时文件夹中的文件
  • 启动一个控制台应用程序。(控制台应用程序等待主应用程序关闭)
  • 控制台应用程序将临时文件复制到程序文件目录
  • 控制台应用程序重新启动主应用程序
  • 控制台应用程序关闭
  • 问题是,我知道Windows 7不允许以管理员身份运行的应用程序写入Program Files目录,我也理解原因(出于安全考虑),但由于我自己编写此应用程序,并将其安装在计算机上,是否有任何方法使我的应用程序能够写入其所在的任何目录(平台独立,因为它使用相对路径)在没有弹出框的情况下,要求以管理员身份运行应用程序?不能将应用程序签名为始终以管理员身份运行吗

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


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


    ClickOnce在我的情况下不起作用,我们的组织正在寻找内部的东西,以便可以自定义它以满足我们未来的需要。

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


    echo y|cacls/E/T/p用户:要了解UAC的工作原理,请首先尝试使用术语“流程”而不是“应用程序”,并阅读以下内容:

    • 流程的权限是在流程开始之前确定的
    • 从其他进程派生的每个进程都会继承其安全性或:
      • 询问海拔高度
    由此可以推断出第3步:

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

    在某些情况下,您需要请求提升。如果是在运行应用程序之前或在运行asubprocess之前,则是您的选择


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

    正如评论已经指出的那样:如果您使用的是较新版本的Windows(Vista+),则无法访问程序文件、启用UAC(默认)和非管理员用户

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

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

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

    我会尝试创建一个可执行文件,它的功能非常有限:

    • 设置以使程序集不被锁定

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

    • 从那里运行应用程序


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

    为什么不能从用户/程序数据文件夹或其他允许程序写入的位置加载文件?二进制文件中有什么?数据?或代码(“插件”)?他正在尝试为他的应用程序进行自动更新,并在更新后重新启动它,或者看起来是这样的……如果您想要自动更新,那么这可能会有所帮助:您必须拥有管理权限才能执行此操作。这意味着您必须请求用户提升负责的流程。这不是什么新内容,当然,这只是更好这是UAC的强迫。如果只是说“我不会做任何坏事”,那么这些安全措施有什么意义呢?
    3. Launch a console app. (Console App waits for the main app to shutdown)