Microsoft Graph API 可停止继承 One Drive 项目中的权限

问题描述 投票:0回答:2

在 OneDrive 用户界面中,可以更新驱动器项目,以便权限不再从父项继承(停止继承权限)。是否可以通过 Graph API 执行相同的操作?我似乎可以找到任何允许这样做的电话。在删除权限的文档中,它说: “只能删除非继承的共享权限。inheritedFrom属性必须为null。”

我们需要能够以编程方式设置驱动器文件夹和项目的权限,我们要做的事情之一就是停止从父级继承。

问候, LT

microsoft-graph-api onedrive
2个回答
2
投票

我知道这是一个很长的问题,但你可以做什么:

“继承”只是允许用户/组的列表...如果您将其全部删除,您的文件夹将变成“只有您”权限的文件夹(无继承)

我在我的应用程序中使用它,它不是最简单的,但它有效


1
投票

我也在 Graph Api 邀请端点上苦苦挣扎 https://learn.microsoft.com/en-us/graph/api/driveitem-invite?view=graph-rest-1.0&tabs=http

我还没有找到比@Dadv更好的解决方案。

我的工作是将 Sharepoint 文件夹复制到另一个文件夹,包括所有子文件夹。 然后确保子文件夹获得与源子文件夹完全相同的权限。

不幸的是,这必须是 2 个单独的任务,当使用 Graph Api 时,使用 /copy 端点来复制子文件夹,对于权限,我使用删除/更新/添加的组合来同步权限。

对于如此简单的工作来说,API 的往返次数很多,相当复杂。

现在我希望听到有人知道更简单的方法来完成许可部分。

这里有一些伪代码来显示权限同步的可视化。

// Now the targetFolders exists --> syncronize permissions

var targetFolderGraphUr = "https://graph.microsoft.com/v1.0/drives/<id>/items/<item-id>";


// Then apply permissions from template: Update (Patch) or Add (using /invite)
foreach (var sourcePermission in sourceFolderPermissions)
{
    var pcPerm = targetFolderPermissions.FirstOrDefault(p => p.GrantedTo?.User?.DisplayName == sourcePermission.GrantedTo?.User?.DisplayName);

    // Update
    if (pcPerm != null)
    {
        bool isUpdateNeeded = CheckIfUpdateNeeded(...);

        if (isUpdateNeeded)
        {
            var updateUrl = $"{targetFolderGraphUr}/permissions/{sourcePermission.Id}";
            var updateResult = await myHttpClient.PatchAsync(updateUrl, sourcePermission);
        }
    }
    else
    {
        // Add 
        var userId = sourcePermission.GrantedTo?.User?.Id;
        var invitePermission = new InvitePermission()
        {
            Recepients = GetRecepientArray( userId ),  // returns a list of recipients, setting objectId = userId
            ObjectId = userId,
            Roles = sourcePermission.Roles,
            RequireSignIn = true,
            SendInvitation = false,
            retainInheritedPermissions = false
        };

        var inviteUrl = $"{targetFolderGraphUr}/invite";

        var inviteResult = await myHttpClient.PostAsync(inviteUrl, invitePermission);

        // response is 200 OK, but no permissions are added.
        // Using Dadv's workarround, deleting all permissions on targetfolder first, then it works.
        // (not shown in this example) 
    }
}


// Finally remove all permissions not existing in the sourcefolder
foreach (var targetPermission in targetFolderPermissions)
{
    if (!sourceFolderPermissions.FirstOrDefault(p => p.GrantedTo?.User?.DisplayName == targetPermission.GrantedTo?.User?.DisplayName))
    {
        var deleteUrl = $"{targetFolderGraphUr}/permissions/{targetPermission.Id}";
        var deleteResult = await myHttpClient.DeleteAsync(deleteUrl);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.