2

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

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

我想走的路是:

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

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

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


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

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

4

3 回答 3

1

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

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

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

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

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

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

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

  • 从那里运行应用程序

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

于 2011-05-16T17:09:01.910 回答
0

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

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

于 2011-05-16T15:51:51.797 回答
0

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

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

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

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

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

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

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

于 2011-05-16T15:53:10.870 回答