0

I'm deploying a .NET application with VS2010. My application creates .txt file in the logs folder in the same directory with .exe:

app.exe
add.exe.config
logs (folder)

I used setup project to create a MSI installer. When I installed in the client machine C: drive or any drives I have no problem to create the .txt file, but when I installed in C:\Program File\myAppFolder or C:\Program File(x86)\myAppFolder I cannot to create the .txt file.

4

3 回答 3

1

编写应用程序的安装位置是一个糟糕的设计。最好写到ApplicationDataFolder. 位于ApplicationDataFolder用户配置文件下,当以该用户身份运行时,应用程序将有权在此处写入。@Ken White 提供了一个非常好的指针,指向关于 this 的现有 StackOverflow 答案

如果这是必须写入该文件夹的旧版应用程序,则您需要修改该log文件夹的权限,以便所有用户都可以写入该文件夹。这可能与 Windows Installer(又名:MSI)有关,但我不确定 Visual Studio 安装项目是否会公开它。WiX 工具集绝对支持执行此类操作

于 2013-04-24T05:01:45.613 回答
0

一个旧帖子,但我最近需要做类似的事情,所以我想它仍然有效!虽然我不提倡糟糕的设计,但在现实世界中,有时我们不得不屈服于需求。

写入应用程序文件夹可能在 Win7 下,可以通过 VS2010 创建的 MSI 中的安装程序类进行设置。您只需要提供一个相关组(建议“用户”组,或者如果您想更多地控制谁获得什么,请提供一个选择屏幕)写入数据访问权限。

然后在路径上使用 DirectoryInfo,您可以从 GetAccessControl 获取安全数据。当您知道您的组时,获取组的 SID,并且 AddAccessRule 也提供所需的 ControlType 值。

然后使用安全数据对象对 DirectoryInfo 对象 (SetAccessControl) 设置访问控制。

如果使用 PrincipalSearcher 进行搜索,则可以从 Groups 主体对象获取 SID。

希望这可以帮助

保罗

于 2015-05-06T13:21:23.160 回答
0

这通常取决于:

  1. 您的应用程序是否因其他原因需要以管理员身份运行以及..

  2. 您的应用程序是否提供给受限用户。

如果应用程序出于一系列其他原因需要提升(而不仅仅是在受限位置更新文件),那么通常的方法是在您的应用程序中嵌入提升清单。从安全的角度来看,这不是一件好事,但是如果您绝对需要管理员权限,那么这就是这样做的方法。

如果唯一需要提升的操作是在 Program Files 文件夹中更新/创建数据,则不要将文件放在那里。我见过的每个案例都是惰性编程,其中代码仅引用文件名,因此它位于 Program Files 文件夹中(更准确地说是在应用程序运行所在的同一文件夹中)。解决此问题的方法是将数据文件放在正确的位置(例如用户的应用程序数据文件夹)。正如 Rob Mensching 所说,只有当这是您无法更改的旧版应用程序时,您才应该更改安装文件夹的权限。

于 2015-05-06T18:16:48.837 回答