【问题标题】:C# folder permissionsC# 文件夹权限
【发布时间】:2018-09-19 19:18:15
【问题描述】:

我需要拥有该文件夹及其子文件夹的所有权才能将其删除。手动过程对我来说很好:

  1. 打开文件夹属性。
  2. 安全选项卡 -> 高级 -> 所有者更改 -> 选中“替换子容器和对象的所有者”
  3. 出现消息框:您无权读取目录 C:\a4f31eae62bde1cb4d49834897\Sandbox 的内容。您想用授予您完全控制权的权限替换目录权限吗? 如果您按是,所有权限都将被替换。
  4. 按是
  5. 然后我就可以删除文件夹了。

但我有大约数百个这样的文件夹 (reason),所以我想以编程方式删除它们。

我的代码拥有文件夹而不是子文件夹的所有权。

var identity = WindowsIdentity.GetCurrent().User;
var dirInfo = new DirectoryInfo(dirPath);
var dirSecurity = dirInfo.GetAccessControl();

dirSecurity.SetOwner(identity);

var fullControlRule = new FileSystemAccessRule(identity, 
    FileSystemRights.FullControl,
    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
    PropagationFlags.None, 
    AccessControlType.Allow);

dirSecurity.AddAccessRule(fullControlRule);
dirInfo.SetAccessControl(dirSecurity);

之后尝试删除文件夹时,我得到 System.UnauthorizedAccessException: Access to the path 'C:\a4f31eae62bde1cb4d49834897\Sandbox' is denied.

任何帮助将不胜感激!谢谢。

【问题讨论】:

  • 尝试以管理员身份运行与运行?
  • 对于子文件夹,您是否考虑过制作递归函数?
  • 是的,VS 以管理员身份运行。尝试递归设置权限时,我得到 System.UnauthorizedAccessException: 'Attempted to perform an unauthorized operation.'Sanbox 上调用 dirInfo.GetAccessControl() 时i> 子文件夹。我什至没有读取这些子文件夹的权限。

标签: c# permissions


【解决方案1】:

对我有用的最终解决方案是使用命令行 (PowerShell) 中的 takeover。虽然我仍然对 C# 解决方案很感兴趣...

感谢后来删除他的建议的用户。

清除上述文件夹的最终 PowerShell 代码:

$dirNames = Get-ChildItem "C:\" | Select-String -Pattern "[a-f0-9]{18,30}"

foreach ($dirName in $dirNames) {
    TakeOver("C:\$dirName")
}

function TakeOver($dirPath) {
    takeown /f $dirPath /r /d Y
    #icacls $dirPath /reset /T
}
  • takeown 按预期工作(递归地用于子文件夹)。
  • icacls 在我的情况下不需要,之后可以删除文件夹。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2022-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多