如何使用rest端点获取Sharepoint中文件/文件夹/文档的权限级别?

如何使用rest端点获取Sharepoint中文件/文件夹/文档的权限级别?,rest,sharepoint,permissions,Rest,Sharepoint,Permissions,在尝试获取特定文件/文档的权限级别时,我使用了以下rest端点 https://<web url>/_api/Web/GetFileByServerRelativeUrl('<path to the file>')/getlimitedwebpartmanager(scope=1 or 0) https:///_api/Web/GetFileByServerRelativeUrl(“”)/getlimitedwebpartmanager(范围=1或0) 我能够成功地获

在尝试获取特定文件/文档的权限级别时,我使用了以下rest端点

https://<web url>/_api/Web/GetFileByServerRelativeUrl('<path to the file>')/getlimitedwebpartmanager(scope=1 or 0)
https:///_api/Web/GetFileByServerRelativeUrl(“”)/getlimitedwebpartmanager(范围=1或0)

我能够成功地获得该文件。但是我现在应该如何获得权限级别呢?

要获得权限级别,我要做的是使用“$expand”查询参数,该参数等于“ListItemAllFields/RoleAssignments/XXXX”,其中XXXX是成员,RoleDefinitionBindings,等等,将链扩展到我需要的用户和权限级别信息。比如说,

.../GetFileByServerRelativeUrl('')?$expand=ListItemAllFields/RoleAssignments/Member,ListItemAllFields/RoleAssignments/RoleDefinitionBindings,ListItemAllFields/RoleAssignments/Member/Users
花了大量的web搜索才发现“$expand”查询参数甚至存在,但在一次get中获取所需的所有信息非常有用。随后,我向查询中添加了一个“$select”参数,以筛选出我的应用程序使用的部分

编辑: 另外,请看下面Radu的问题和我的后续回答。这个问题的答案取决于你想完成什么。引用我的部分答案:

如果您正在挖掘所有用户拥有的所有权限,请使用我的方法。但是,您需要足够的权限来获取该信息。如果您想知道用于发出请求的用户的基本权限,请使用他的方法。我的工作中有两个用例,所以事实上,我两个都做


被接受的解决方案对我不起作用。用户似乎在默认情况下没有查看角色分配的权限。但这就是我最后做的

我获得了来自的响应,从而获得了有效的基本权限 /_api/web/getFileByServerRelativeUrl('my/relative/path')/ListItemAllFields/effectiveBasePermissions

我认为这适用于sharepoint中的任何项目/文件夹(通过将/ListItemAllFields/effectiveBasePermissions附加到url)

因此,这将返回当前用户对该文件/项目的权限。权限“对象”是由35个标志组成的一组,这些标志以64位编码(并非所有64位都使用,仅35位)。这些位由端点提供为两个整数(每个32位),命名为:

  • 低-表示前32位
  • 高-序列中的下一个32位,最多64位
现在,为了查看用户是否拥有(例如)对该文件的编辑权限,我们需要查看这个高低顺序中的相应位。您可以在下面找到序列中每个位的含义:

    ViewListItems = 1,
    AddListItems = 2,
    EditListItems = 3,
    DeleteListItems = 4,
    ApproveItems = 5,
    OpenItems = 6,
    ViewVersions = 7,
    DeleteVersions = 8,
    CancelCheckout = 9,
    ManagePersonalViews = 10,
    ManageLists = 12,
    ViewFormPages = 13,
    AnonymousSearchAccessList = 14,
    Open = 17,
    ViewPages = 18,
    AddAndCustomizePages = 19,
    ApplyThemeAndBorder = 20,
    ApplyStyleSheets = 21,
    ViewUsageData = 22,
    CreateSSCSite = 23,
    ManageSubwebs = 24,
    CreateGroups = 25,
    ManagePermissions = 26,
    BrowseDirectories = 27,
    BrowseUserInfo = 28,
    AddDelPrivateWebParts = 29,
    UpdatePersonalWebParts = 30,
    ManageWeb = 31,
    AnonymousSearchAccessWebLists = 32,
    UseClientIntegration = 37,
    UseRemoteAPIs = 38,
    ManageAlerts = 39,
    CreateAlerts = 40,
    EditMyUserInfo = 41,
    EnumeratePermissions = 63
正如您所看到的,有些位没有任何意义(如位11、33、34等) 因此,我们需要查看前32位中的第3位(用于编辑),以确定用户是否可以编辑此文件/项目/文件夹。我们可以忽略高位。我们必须与二进制格式的整数进行逐位比较,该整数只有第3位设置为1(其余为0)。在本例中,这是100(这是4的二进制表示)。实际上,这有一个公式:binaryNr=2^(bitIndex-1)。对于我们的示例,bitIndex是3。 现在我们有了binaryNr,我们将其用作掩码,以确定低位序列中的第三位是0还是1:

hasEditingPermission=(binaryNr | LowSequence)=LowSequence

下面是一个方便的伪代码函数(^是幂运算符):


拉杜在他的回答中提出了一个与我在回答中给出的不同的用例。如果您正在挖掘所有用户拥有的所有权限,请使用我的方法。但是,您需要足够的权限来获取该信息。如果您想知道用于发出请求的用户的基本权限,请使用他的方法。我的工作中有两个用例,所以事实上,我两个都做

然而,正如我在Radu的回答中所说,我在使用他的
hasPermission()
函数时遇到了一些问题。我在这里添加了一个新的答案,以提供一个为什么它对我不起作用的例子:

我肯定不是一个专家级的玩弄者,但至少在Java中,
1
$.ajax({
url:_spPageContextInfo.webAbsoluteUrl+“/_api/web/getFileByServerRelativeUrl(“”)/ListItemAllFields/effectiveBasePermissions”,
键入:“获取”,
标题:{Accept:“application/json;odata=verbose”},
成功:功能(数据){
var permissions=new SP.BasePermissions();
permissions.initPropertiesFromJson(data.d.EffectiveBasePermissions);

var hasppermissions=permissions.has(SP.PermissionKind.

当我添加$expand参数时,我得到“2147024891,System.UnauthorizedAccessException”。url不起作用,但它只是下载文件…第二次检查时,不带extend参数的url实际上返回文件元数据,但这还不够。我们如何在sharepoint 2010中实现这一点,因为我们无法在几年后直接使用rest api。这对于sharepoint Online仍然是功能性的和有用的。确实,您是rect.在我给出的示例中,我正在以具有足够凭据的用户身份挖掘所有用户的权限信息。如您所示,我还使用各种
/effectiveBasePermissions
组合(web、列表、文件、文件夹)用于为其凭据被用于进行REST调用的用户获取该信息。我的一个区别在于
hasPermission()
。我使用与上面显示的代码完全相同的代码,但我使用:
return(sequence&(1我不明白…1 Radu,我在下面添加了一个额外的答案来讨论
hasPermission()
@ThomasDoman误解是运算符^。我指的是power运算符。我编辑了答案以澄清这一点。^在JAVA中代表XOR…当然不起作用。谢谢Radu!只是好奇,作为power运算符,^使用的是什么语言?我觉得你的代码看起来像JavaScript,但在JavaScript中它也是XOR。或者,base在你的编辑中,它只是纯粹的伪代码吗?
function hasPermission (low, high, bitIndex){
  var sequence = low;
  if (bitIndex >= 32){
    sequence = high;
    bit -= 32;
  }
  return ((2^(bitIndex - 1)) | sequence) == sequence
}
$.ajax({ 
    url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/getFileByServerRelativeUrl('<your file or folder url>')/ListItemAllFields/effectiveBasePermissions",
    type: "GET",
    headers: { Accept: "application/json;odata=verbose" },
    success: function(data){
        var permissions = new SP.BasePermissions();
        permissions.initPropertiesFromJson(data.d.EffectiveBasePermissions);
        var hasPermissions = permissions.has(SP.PermissionKind.<any level to check>);
        //for example: var bool_has_editListItems =  permissions.has(SP.PermissionKind.editListItems);
    }
});