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

Posted

技术标签:

【中文标题】如何以编程方式检查 .NET 中的有效删除(修改)或写入权限?【英文标题】:How do I programmatically check EFFECTIVE delete (modify) or write permissions in .NET? 【发布时间】:2010-09-27 00:35:00 【问题描述】:

抱歉,问题太长了。 我真正感兴趣的是一种以编程方式检查正在执行的 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 以指示由于特权拒绝而导致的失败。但是在上传文件的情况下,我真的很想在浪费上传数据的时间和资源之前检查权限,因为只有在上传之后我们才能尝试写入有问题的文件或文件夹。我很遗憾任何通过 http 上传 2GB 文件的用户在上传完成后才被告知他们无权将文件上传到目的地。

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

【问题讨论】:

【参考方案1】:

您还可以拥有永久文件,例如“access_test.txt”,您尝试使用日期戳或其他内容覆盖该文件以首先测试当前访问权限。

【讨论】:

【参考方案2】:

非常感谢您在用户体验方面付出了更多努力并尝试保持干净的程序结构。也许如果你只上传你可以尝试创建一个与最终 2GB 文件同名的空“占位符”文件,然后覆盖它。不完美,因为你仍然可以得到一个空文件,但很容易,至少比一些替代品更优雅。

【讨论】:

以上是关于如何以编程方式检查 .NET 中的有效删除(修改)或写入权限?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式从 .NET 中的注册表中删除 Windows 产品密钥?

在 C# 中以编程方式检查字符串是不是包含有效的 C# 代码

如何以编程方式创建有效的自签名 X509Certificate2,而不是从 .NET Core 中的文件加载

以编程方式创建/删除/擦除磁盘分区?

如何以编程方式将证书添加为当前JVM实例的受信任

以编程方式加密 .NET 中的配置文件