You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#递归修改Windows文件夹及子项所有者(支持网络共享)

递归修改Windows文件夹及所有内容的所有者(支持网络共享路径)

解决思路

  • 先修改根文件夹自身的所有者
  • 递归遍历所有子文件夹和文件,逐个替换所有者
  • 针对文件、目录分别处理权限控制,确保所有内容都被覆盖
  • 支持本地路径和网络共享UNC路径(如\\服务器名\共享文件夹)

完整代码实现

using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;

public static class OwnerManager
{
    public static void SetFullOwnerRecursively(string targetPath, string userName)
    {
        // 将用户名转换为Windows身份标识
        IdentityReference newOwner = new NTAccount(userName);

        // 处理根文件夹
        var rootDir = new DirectoryInfo(targetPath);
        UpdateDirectoryOwner(rootDir, newOwner);

        // 递归处理所有子文件夹
        foreach (var subDir in rootDir.GetDirectories("*", SearchOption.AllDirectories))
        {
            UpdateDirectoryOwner(subDir, newOwner);
        }

        // 递归处理所有文件
        foreach (var file in rootDir.GetFiles("*", SearchOption.AllDirectories))
        {
            UpdateFileOwner(file, newOwner);
        }
    }

    private static void UpdateDirectoryOwner(DirectoryInfo dirInfo, IdentityReference newOwner)
    {
        // 获取目录的权限控制对象,只读取所有者和权限部分
        DirectorySecurity dirSecurity = dirInfo.GetAccessControl(AccessControlSections.Owner | AccessControlSections.Access);
        // 设置新所有者
        dirSecurity.SetOwner(newOwner);
        // 应用修改后的权限
        dirInfo.SetAccessControl(dirSecurity);
    }

    private static void UpdateFileOwner(FileInfo fileInfo, IdentityReference newOwner)
    {
        // 获取文件的权限控制对象
        FileSecurity fileSecurity = fileInfo.GetAccessControl(AccessControlSections.Owner | AccessControlSections.Access);
        // 设置新所有者
        fileSecurity.SetOwner(newOwner);
        // 应用修改后的权限
        fileInfo.SetAccessControl(fileSecurity);
    }
}

使用示例

// 本地路径示例
OwnerManager.SetFullOwnerRecursively(@"D:\MyProject", Login.authUserName.ToString());

// 网络共享路径示例
OwnerManager.SetFullOwnerRecursively(@"\\FileServer\SharedDocs", Login.authUserName.ToString());

原代码问题说明

  1. 仅处理了一级子文件夹,未递归遍历所有层级的子目录和文件
  2. 未修改根文件夹自身的所有者
  3. 未处理文件夹内的文件所有者替换
  4. 覆盖范围不足,无法实现「替换子容器和对象的所有者」的完整效果

内容的提问来源于stack exchange,提问作者Sephira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 14:15:40