确定应用程序文件夹的写入权限

时间:2010-11-12 16:58:42

标签: c# file permissions uac

我有一个C#应用程序,我需要在操作期间将一些输出转储到日志文件中。我想给用户选择在哪里找到日志文件,但是通过客户端请求它需要默认为当前的应用程序位置,这通常是/ Program Files /.

但是,当我在Win7 / Vista计算机上部署应用程序时,除非我以管理员身份运行程序,否则应用程序不会写入日志文件。同时,它似乎默默地处理它无法写入文件的情况,因为我正在处理在文件创建和写入过程中抛出的所有异常。

我目前正在尝试检测两者的写入权限不足:

A)通过调用“Directory.GetAccessControl()”和

创建DirectorySecurity对象

B)使用“SecurityManager.IsGranted(permissions)”方法检查安全权限,

但是当我期望A时,A不会抛出异常,并且B每次都返回true。

我看过很多与此主题相关的帖子,但它们都提供了只写入Application.UserAppDataFolder或其中一些变体的解决方案。我的客户端特别要求默认使用当前的应用程序路径,因此在编写日志文件时,我至少需要找到一种方法来优雅地警告它们。

注意:我当前的代码可以在Windows XP上找到(因为我没有UAC,所以)。基本上我需要知道的是为什么我的所有调用都告诉我编写文件正常,当根本不创建文件时,除非我以Admin身份运行。

谢谢!

6 个答案:

答案 0 :(得分:5)

Windows Vista和7会将文件写入Program Files目录。

嗯,不是真的,但程序认为这很好。实际上,该文件被写入当前用户的VirtualStore目录;也就是说,在%userprofile%\AppData\Local\VirtualStore\Program Files

您可以include a manifest file为您的应用程序禁用此行为,以获得您期望的结果。

答案 1 :(得分:2)

您可以强制操作系统以管理员身份运行您的应用程序。

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

答案 2 :(得分:2)

您的应用有三种方式可以运行 - 提升,故意不提升(显示说asInvoker),或意外没有提升(没有清单)。提升的应用程序将能够写入Program Files。故意不提升的应用程序将被拒绝访问。意外未升级的应用程序将成功,但该文件将写入其他地方。最后一个案例就是发生在你身上的事情。它没有默默地失败。你只是不知道文件的位置。有关屏幕截图,请参阅http://www.gregcons.com/KateBlog/FindingFilesYoureSureYouWrote.aspx

因此,如果用户坚持使用当前目录,则应添加请求asInvoker的清单。然后,您将获得AccessDenied,他们将看到错误消息。我认为他们想要这个很奇怪。询问他们是否可以通过一次额外点击找到它们:如果是这样,请保持您的应用程序使用虚拟化(我真的不赞成)没有清单,然后训练他们点击兼容性文件按钮。 我的偏好:写在别处并向asInvoker显示。我的第二选择:坚持使用当前目录,没有清单,培训他们查找虚拟化文件。我的第三个选择:坚持使用当前目录,清单显示asInvoker,用户在未写入日志文件时看到错误消息,但日志丢失。

答案 3 :(得分:1)

我遇到了同样的问题。我有一个xml文件,我正在写...当我安装应用程序(C sharp)并尝试运行应用程序时由于写入权限而获得异常。当我更改文件权限(给用户读取权限)时,它正常工作..

答案 4 :(得分:0)

您是否有权撰写文件的最终测试是打开它进行写作。 即

try
{
    File.Open(path, FileMode.OpenOrCreate);
    ...
}
catch(SecurityException)
{
   ... it failed for security reasons
}
catch(Exception)
{
   ... it failed for other reasons
}

答案 5 :(得分:0)

除了Stefan P.建议将应用程序提升为以管理员身份运行之外,您还可以修改安装时的安装文件夹权限,以添加Users组以具有写入权限。然后应用程序也可以正常工作。

移动日志文件位置是最好的选择。