在 OneDrive 用户界面中,可以更新驱动器项目,以便权限不再从父项继承(停止继承权限)。是否可以通过 Graph API 执行相同的操作?我似乎可以找到任何允许这样做的电话。在删除权限的文档中,它说: “只能删除非继承的共享权限。inheritedFrom属性必须为null。”
我们需要能够以编程方式设置驱动器文件夹和项目的权限,我们要做的事情之一就是停止从父级继承。
问候, LT
我知道这是一个很长的问题,但你可以做什么:
“继承”只是允许用户/组的列表...如果您将其全部删除,您的文件夹将变成“只有您”权限的文件夹(无继承)
我在我的应用程序中使用它,它不是最简单的,但它有效
我也在 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);
}
}