对目录附加和写入访问权限 — FileIOPermission 给出不好的结果?

Posted

技术标签:

【中文标题】对目录附加和写入访问权限 — FileIOPermission 给出不好的结果?【英文标题】:Append and write access to a Directory — FileIOPermission give not good result? 【发布时间】:2014-03-04 14:30:57 【问题描述】:

我有一个问题实际上已经解决了,但我完全不明白为什么会这样。

所以我有一个网络共享,我只想验证我是否有权在该共享中创建新文件和目录。我使用了两种方法来解决这个问题,但在这两种方法中我得到了不同的结果。我的测试用例是我无法在该共享上创建文件和目录:

试图创建一个新的目录——不是一个好方法

try

    var testPath = Path.Combine(path, testDirectory)
    Directory.CreateDirectory(testPath)

catch

    // No access

这是我完全不喜欢的一种方式,但它确实有效......我这里有一个例外,所以它正确地表示我没有特定路径的权限。

使用 FileIOPermission — 更好的方式

try

    var writePermission = new FileIOPermission(FileIOPermissionAccess.Write, path)
    var appendPermission = new FileIOPermission(FileIOPermissionAccess.Append, path)
    writePermission.Demand()
    appendPermission.Demand()

catch

    // No access

使用这种方法我没有任何例外,所以它告诉我我有权创建新文件 - 这实际上是不正确的。

有人知道第二种方法有什么问题吗?

【问题讨论】:

【参考方案1】:

如果您想要简单、易于维护和易于理解的代码,除了尝试做您想做的事情并处理您期望的异常(例如 UnauthorizedAccessException)之外,没有其他安全的替代方法。

通过显式处理 UnauthorizedAccessException 并忽略其余部分,您可以在发生这种情况时执行您的回退逻辑,并且异常会冒泡并且可能未经处理而导致应用程序停止(您的示例 1)。您的示例 2 似乎打破了关于如何处理运行时错误的 .NET 运行时联系。

.NET 和托管运行时期望您相应地使用和处理异常。见http://msdn.microsoft.com/en-us/library/8ey5ey87%28v=vs.91%29.aspx

我希望这至少对您有所帮助。

【讨论】:

【参考方案2】:

FileIOPermission 不检查文件/目录的实际权限。它更像是“如果我不必担心 ACL,我可以访问它吗?”检查。

查看this post 以了解 FileIOPermission 到底在做什么。

然后,查看this post 以了解如何询问实际的文件系统 ACL 以查看您是否可以读取/写入文件。

【讨论】:

以上是关于对目录附加和写入访问权限 — FileIOPermission 给出不好的结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何授予 PHP 对目录的写入权限?

配置文档的访问权限

linux rwx 权限说明

如何设置IIS网站目录的访问权限

Windows文件服务器共享的时候分配权限对于目录深文件量大的情况下,权限写入非常慢,有啥办法可以解决

Linux学习阶段性总结2