如何撤销文件的写权限,使其无法在 C# 中删除

Posted

技术标签:

【中文标题】如何撤销文件的写权限,使其无法在 C# 中删除【英文标题】:How do I revoke write permission from a file so that it can't be deleted in C# 【发布时间】:2013-11-21 11:43:57 【问题描述】:

在 NUnit 测试中,我需要检查是否可以删除现有文件。 UnitUnderTest 源代码如下所示:

public static Boolean IsWritePermissionGranted(String absoluteFilePath)

    Boolean isGranted = true;
    try
    
        FileIOPermission writePermission = new FileIOPermission(
            FileIOPermissionAccess.Write, absoluteFilePath);
        writePermission.Demand();
    
    catch (SystemException)
    
        isGranted = false;
    
    return isGranted;

在测试用例中,我想撤销 TestFile 的写权限。到目前为止,我尝试过:

    https://***.com/a/7590491/1817029 AddFileSecurity(TEST_FILE_PATH, @"MyDomain\MyUser", FileSystemRights.Write, AccessControlType.Deny);

    DirectoryInfo dInfo = new DirectoryInfo(TEST_FILE_PATH); DirectorySecurity dSecurity = dInfo.GetAccessControl(); dSecurity.AddAccessRule(new FileSystemAccessRule( TEST_FILE_PATH, "MyDomain\MyUser", FileSystemRights.Write, AccessControlType.Deny)); dInfo.SetAccessControl(dSecurity);

在所有情况下,文件仍然可以被删除。我做错了什么?

【问题讨论】:

【参考方案1】:

防止意外删除的最简单快捷的方法就是将其设为只读:

File.SetAttributes(path, FileAttributes.ReadOnly);

任何希望修改或删除此文件的代码都必须首先明确删除只读属性(即再次调用SetAttributes)。

您还应该永远捕获SystemException(或Exception),无论如何您的示例代码正在处理与文件安全​​无关的CAS。

【讨论】:

谢谢! [...无论如何,您的示例代码正在处理与文件安全​​无关的 CAS。] 您是否参考writePermission.Demand(); 此外,我仍然可以使用以下命令删除文件:File.Delete(TEST_FILE_PATH); 是的。如果您查看documentation for the Demand method,您应该会发现它显然不适用于您的场景。实际上,除了实际尝试删除文件并捕获IOExceptionSecurityException(如果失败)之外,实际上没有可靠的方法来测试是否可以删除文件。您的测试正在检查一种完全不相关的权限,并且在完全信任的情况下运行时将始终返回 true。见here 我将此作为问题的解决方案(仅作为评论):***.com/q/19860927/1817029 我问了这个问题,因为SecurityManager.IsGranted 方法被标记为已过时。你能回答这个问题吗? ***.com/q/19860927/1817029 THX! 该问题已结束。有很多重复,但最好的可能是我在上一条评论中链接到的那个。

以上是关于如何撤销文件的写权限,使其无法在 C# 中删除的主要内容,如果未能解决你的问题,请参考以下文章

撤销 MySQL 数据库上所有用户的所有权限

如何在google-apps-script上恢复已撤销的权限?

如何快速删除具有现有权限的用户

如何使用 LOOP 撤销访问权限 - redshift

如何下载和运行.exe文件c#

应用程序的临时分发和撤销访问权限