如何以编程方式检查.NET中的EFFECTIVE删除(修改)或写入权限?

时间:2008-12-15 18:28:04

标签: c# asp.net file-permissions

很抱歉提前提出这个问题。 我真正感兴趣的是一种以编程方式检查执行的Windows标识是否具有足够的Windows权限来写入ASP.NET Web服务应用程序中的目录(或文件)的方法。但我会满足于为给定目录或文件检索用户的有效删除(修改)权限。问题是我希望能够在不编写临时文件或必须执行IO操作和处理异常的情况下执行此操作。

是的,已经有一个问题(见How can I programmatically determine if I have write privileges using C# in .Net?) 通常我同意接受的答案,最好的方法是尝试IO操作并处理任何异常 - System.IO方法会抛出System.UnauthorizedAccessException以指示由于特权拒绝而导致的失败。但是在UPLOADING文件的情况下,我真的想在浪费上传数据的时间和资源之前检查权限,因为只有在上传后我们才能尝试编写有问题的文件或文件夹。我很遗憾任何通过http上传2GB文件的用户只有在上传完成后告知他们没有权限将文件上传到目的地。

如果您不想执行实际写操作,测试写访问的常用方法是编写临时文件。另一个问题有一个答案指出这一点。这就是我们的代码目前所做的。但Windows安全性允许写入访问而没有删除权限。只有写访问但没有删除的用户最终会留下各种未删除的.tmp文件。不,我们不想使用域管理员帐户重置tmp文件上的ACL,然后删除它们。我一直采用的方法是使用System.IO.Directory.GetAccessControl(..)或System.IO.File.GetAccessControl(..)检查用户是否具有写权限,并处理各种访问规则和ACE返回...但是有了这个,我仍然有处理有效特权的问题 - 即在大多数情况下,我还必须在ACE中列出的任何对该对象具有权限的组中查找用户的成员资格。必须有一种更简单的方法......不存在吗?

3 个答案:

答案 0 :(得分:3)

赞赏用户体验并努力维护干净的程序结构。也许如果你只是上传,你可以尝试创建一个空的'占位符'文件,其名称与最终的2GB文件相同,然后只是覆盖它。不完美,因为你仍然可以得到一个空文件,但非常简单,至少有一些替代方案更优雅。

答案 1 :(得分:1)

您也可以拥有永久文件,例如'access_test.txt',您尝试使用日期戳覆盖,或者首先测试当前访问权限。

答案 2 :(得分:0)

@Paul,我真的很喜欢你的答案,我认为在普通的Web应用程序中,有一组已知且相对较小的潜在上传目标目录,你有适当的解决方案: 1 - 如果应用程序可能有没有附加数据权限的用户,则所有上载目录都应该有一个已知的测试文件,在上载之前检查附加操作以进行检查。
2 - 如果不担心附加数据权限,则应用程序可以只写出该文件的空版本并在上载时附加到该文件。我接受你的回答,以确保你得到信任。

不幸的是,在我的应用程序中,我们没有一组有限或已知的上传目标目录 - 网络中的任何共享或文件夹都可以访问。我们要实现的是以相对较小的块缓冲上传数据并在追加模式下打开目标文件但是在上传期间保持FileStream OPEN(是的,有关于处理这个长期存在的FileStreams的担忧)如果没有写入权限不依赖于附加数据权限,则会给出一个快速异常(如果第一个块写入FileStream就会发生)。但是我不会向任何人推荐这种设计 - 如果你能侥幸逃脱它,可以尝试使用@Paul提出的解决方案。如果您不必担心上传时缺少写权限的早期消息,只需处理异常并且不用担心。