我有一个C#应用程序,我需要在操作期间将一些输出转储到日志文件中。我想给用户选择在哪里找到日志文件,但是通过客户端请求它需要默认为当前的应用程序位置,这通常是/ Program Files /.
但是,当我在Win7 / Vista计算机上部署应用程序时,除非我以管理员身份运行程序,否则应用程序不会写入日志文件。同时,它似乎默默地处理它无法写入文件的情况,因为我正在处理在文件创建和写入过程中抛出的所有异常。
我目前正在尝试检测两者的写入权限不足:
A)通过调用“Directory.GetAccessControl()”和
创建DirectorySecurity对象B)使用“SecurityManager.IsGranted(permissions)”方法检查安全权限,
但是当我期望A时,A不会抛出异常,并且B每次都返回true。
我看过很多与此主题相关的帖子,但它们都提供了只写入Application.UserAppDataFolder或其中一些变体的解决方案。我的客户端特别要求默认使用当前的应用程序路径,因此在编写日志文件时,我至少需要找到一种方法来优雅地警告它们。
注意:我当前的代码可以在Windows XP上找到(因为我没有UAC,所以)。基本上我需要知道的是为什么我的所有调用都告诉我编写文件正常,当根本不创建文件时,除非我以Admin身份运行。
谢谢!
答案 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组以具有写入权限。然后应用程序也可以正常工作。
移动日志文件位置是最好的选择。