如何用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());
原代码问题说明
- 仅处理了一级子文件夹,未递归遍历所有层级的子目录和文件
- 未修改根文件夹自身的所有者
- 未处理文件夹内的文件所有者替换
- 覆盖范围不足,无法实现「替换子容器和对象的所有者」的完整效果
内容的提问来源于stack exchange,提问作者Sephira
相关产品推荐
相关产品推荐

