如何通过API获取SharePoint 2010指定文件的ACL权限?
当然可以!在SharePoint 2010中,你可以通过几种不同的API来获取特定文件的ACL(访问控制列表),下面我会针对常用的几种方式详细说明:
1. Server Object Model(服务器端代码适用)
这是SharePoint服务器端开发最直接的选择,适合编写WebPart、控制台应用等运行在服务器上的代码。
可用方法&参数:
- 通过FileId获取:用
SPWeb.GetFileById(fileId)拿到目标文件对象,再通过SPFile.Item.RoleAssignments获取完整ACL信息。- 必填参数:
fileId(文件对应的唯一整数ID)
- 必填参数:
- 通过列表名+文件名获取:先通过列表名称定位文档库,再找到对应文件的列表项,最后提取权限数据。
- 必填参数:
listName(文档库/列表的名称)、fileName(目标文件的名称,建议忽略大小写匹配)
- 必填参数:
示例代码(C#):
using (SPSite site = new SPSite("http://你的SharePoint站点URL")) { using (SPWeb web = site.OpenWeb()) { // 方式1:通过FileId获取文件ACL int targetFileId = 123; SPFile targetFile = web.GetFileById(targetFileId); SPRoleAssignmentCollection fileAcl = targetFile.Item.RoleAssignments; // 方式2:通过列表名+文件名获取 string targetListName = "公司文档库"; string targetFileName = "项目计划书.docx"; SPList targetList = web.Lists[targetListName]; // 查找对应文件的列表项 SPListItem fileItem = targetList.Items.Cast<SPListItem>() .FirstOrDefault(i => i.File.Name.Equals(targetFileName, StringComparison.OrdinalIgnoreCase)); if (fileItem != null) { SPRoleAssignmentCollection itemAcl = fileItem.RoleAssignments; // 遍历权限信息,查看用户/组对应的权限 foreach (SPRoleAssignment assignment in itemAcl) { string principalName = assignment.Member.Name; foreach (SPRoleDefinition role in assignment.RoleDefinitionBindings) { Console.WriteLine($"{principalName} 拥有权限:{role.Name}"); } } } } }
2. Client Object Model(CSOM,客户端代码适用)
如果你需要在SharePoint服务器外部编写代码(比如桌面应用、PowerShell脚本),CSOM是更合适的选择,它支持远程调用SharePoint对象。
可用方法&参数:
- 通过FileId获取:用
ClientContext.Web.GetFileById(fileId)获取文件,再通过File.ListItemAllFields.RoleAssignments获取ACL。- 必填参数:
fileId(文件唯一整数ID)
- 必填参数:
- 通过列表名+文件名获取:先获取目标列表,再通过CAML查询定位到对应文件的列表项,最后提取权限。
- 必填参数:
listName(列表名称)、fileName(文件名)
- 必填参数:
示例代码(C# CSOM):
using Microsoft.SharePoint.Client; // 初始化客户端上下文 ClientContext ctx = new ClientContext("http://你的SharePoint站点URL"); // 若需要身份验证,添加凭据(比如域账号) // ctx.Credentials = new NetworkCredential("用户名", "密码", "域名"); // 方式1:通过FileId获取 int targetFileId = 123; File targetFile = ctx.Web.GetFileById(targetFileId); ListItem fileItem = targetFile.ListItemAllFields; // 加载权限集合 ctx.Load(fileItem, i => i.RoleAssignments); ctx.ExecuteQuery(); // 遍历权限 foreach (RoleAssignment assignment in fileItem.RoleAssignments) { ctx.Load(assignment.Member); ctx.Load(assignment.RoleDefinitionBindings); ctx.ExecuteQuery(); Console.WriteLine($"主体:{assignment.Member.Title}"); foreach (RoleDefinition role in assignment.RoleDefinitionBindings) { Console.WriteLine($"权限:{role.Name}"); } } // 方式2:通过列表名+文件名获取 string targetListName = "公司文档库"; string targetFileName = "项目计划书.docx"; List targetList = ctx.Web.Lists.GetByTitle(targetListName); // 构建CAML查询查找文件 CamlQuery query = new CamlQuery(); query.ViewXml = $@"<View><Query><Where><Eq><FieldRef Name='FileLeafRef'/><Value Type='Text'>{targetFileName}</Value></Eq></Where></Query></View>"; ListItemCollection items = targetList.GetItems(query); ctx.Load(items); ctx.ExecuteQuery(); if (items.Count > 0) { ListItem targetItem = items[0]; ctx.Load(targetItem.RoleAssignments); ctx.ExecuteQuery(); // 处理权限逻辑... }
3. SharePoint Lists Web Service(跨语言/平台适用)
如果你的场景无法使用.NET相关的对象模型,也可以通过SharePoint的SOAP Web服务来获取权限,核心是调用Lists.asmx中的GetPermissionCollection方法。
可用方法&参数:
- 步骤:先通过
GetListItems方法根据列表名+文件名获取文件对应的列表项ID,再调用GetPermissionCollection获取ACL。GetPermissionCollection必填参数:objectName(列表名称)、objectType(固定为ListItem)、objectId(文件对应的列表项ID)
简化的SOAP请求示例:
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetPermissionCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/"> <objectName>公司文档库</objectName> <objectType>ListItem</objectType> <objectId>456</objectId> <!-- 文件对应的列表项ID --> </GetPermissionCollection> </soap:Body> </soap:Envelope>
内容的提问来源于stack exchange,提问作者vkc
相关产品推荐
相关产品推荐

