.NET中如何获取共享服务器文件的作者名称?
解决共享服务器文件作者/最后更新用户获取问题
问题原因
你当前使用的File.GetAccessControl获取的是文件的安全权限所有者,这个值并非总是文件的创建者或最后更新用户:
- 在共享场景下,如果文件被服务器进程(如IIS、文件服务)修改过,所有者可能会变为服务器的计算机账户或系统账户
- 该API仅返回NTFS权限体系中的所有者,而非文件属性里记录的创建/修改用户
解决方案
方案1:读取文件系统的创建/修改用户(通过WMI)
通过WMI查询Win32_File类,可以获取文件的创建者和最后修改者信息,适合普通文件:
using System.Management; string filePath = @"\\server\share\folder\file.txt"; // 共享服务器的UNC路径 string query = $"SELECT * FROM Win32_File WHERE Name = '{filePath.Replace("\\", "\\\\")}'"; using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) { foreach (ManagementObject file in searcher.Get()) { Console.WriteLine("创建者: " + file["CreatedBy"]); Console.WriteLine("最后修改者: " + file["LastModifiedBy"]); } }
方案2:读取文件扩展属性(适用于Office文档等带元数据的文件)
对于Office文档、图片等带有元数据的文件,可以直接读取其扩展属性中的"Author"字段:
using System.IO; using Shell32; // 需要引用Shell32.dll string filePath = @"\\server\share\folder\document.docx"; FileInfo fileInfo = new FileInfo(filePath); Shell32.Shell shell = new Shell32.Shell(); Shell32.Folder folder = shell.NameSpace(fileInfo.DirectoryName); Shell32.FolderItem item = folder.ParseName(fileInfo.Name); // 索引10对应Author属性,不同系统可能有差异,可自行调整 string author = folder.GetDetailsOf(item, 10); Console.WriteLine("文件作者: " + author);
方案3:修正权限所有者的读取逻辑(针对确实需要所有者的场景)
如果你确认需要的是NTFS权限所有者,需确保:
- 使用共享服务器的UNC路径(而非本地路径)
- 当前运行代码的账户有足够权限读取远程文件的安全设置
- 若文件所有者是域用户,需确保本地能正确解析SID对应的账户
string filePath = @"\\server\share\folder\file.txt"; var fs = File.GetAccessControl(filePath); var sid = fs.GetOwner(typeof(System.Security.Principal.SecurityIdentifier)); var ntAccount = sid.Translate(typeof(System.Security.Principal.NTAccount)); Console.WriteLine("权限所有者: " + ntAccount.Value);
注意事项
- 共享服务器路径必须使用UNC格式(
\\服务器名\共享名\文件路径),不能用本地盘符映射 - 运行代码的账户需要有远程文件的读取权限,包括读取安全属性和元数据的权限
- 不同类型文件的元数据存储位置不同,普通文本文件可能没有"Author"扩展属性,需依赖WMI或安全所有者信息
内容的提问来源于stack exchange,提问作者iftekharus
相关产品推荐
相关产品推荐

