如何通过Graph API在SharePoint Online列表根目录创建文件夹并共享给外部用户
需求说明
- 在具备独立权限的文件夹内创建列表项
- 将该父文件夹共享给外部用户
问题分析
无法直接通过Graph API在SharePoint Online列表根目录创建文件夹并完成外部用户共享;已知SharePoint REST API可实现此操作,但客户端应用无法调用(例如通过PowerShell结合应用注册/OAuth获取的令牌,在SPO环境中无效,但在Graph环境中可正常使用)。
解决方案:Graph API + PnP PowerShell 结合方案
1. 通过Graph API将外部用户添加到租户
使用客户端凭证流获取Graph API令牌,调用邀请接口添加外部用户:
cls $SiteURL="https://your_domain.sharepoint.com/sites/your_site/" $ClientID = "00000000-0000-0000-0000-000000000000" $tenantdomain="your_domain.onmicrosoft.com" $ClientSecret = "base64 string" $tenantid="12345678-1234-1234-1234-123456789999" $thumbprint="06D3488F67CC8F90B2CA2C0DE48AB354E0E4259A" #API info $loginURL = "https://login.microsoftonline.com/" $resource = "https://graph.microsoft.com" # 获取Oauth 2访问令牌 $body = @{grant_type="client_credentials";resource=$resource;client_id=$ClientID;client_secret=$ClientSecret} $oauth = Invoke-RestMethod -Method Post -Uri $loginURL/$tenantdomain/oauth2/token?api-version=1.0 -Body $body # 设置请求头 $headerParams = @{'Authorization'="$($oauth.token_type) $($oauth.access_token)"} # 调用Graph邀请接口 $uri ="https://graph.microsoft.com/v1.0/invitations" $body = @{ invitedUserDisplayName="test";invitedUserEmailAddress="user_email@gmail.com";sendInvitationMessage=$false;inviteRedirectUrls="https://myapp.com" } $jsonBody = $body | ConvertTo-Json $tenantInfo = (Invoke-RestMethod -Uri $uri –Headers $headerParams –Method Post –Verbose -Body $jsonBody)
2. 通过PnP PowerShell为外部用户授予列表文件夹权限
通过证书或客户端密钥连接到SharePoint站点,为已添加的外部用户分配文件夹权限:
cls $SiteURL="https://your_domain.sharepoint.com/sites/your_site/" $ClientID = "00000000-0000-0000-0000-000000000000" $tenant="your_domain.onmicrosoft.com" $ClientSecret = "base_64 string here" # 连接到SharePoint站点(使用证书方式) $conn=Connect-PnPOnline -Url $SiteURL -ClientId $ClientID -Thumbprint $thumbprint -Tenant $tenant -ReturnConnection $folder="List folder name" $externalUser="user_email@gmail.com" # 若需创建文件夹,可取消注释以下行 #Add-PnPFolder -Name $folder -Folder "Lists/YourList" # 获取目标文件夹并分配权限 $spFolder = Get-PnPFolder -URL ("/sites/extranet/Lists/YourList/"+$folder) Set-PnPFolderPermission -List "Outprocessing" -Identity $spFolder -User $externalUser -AddRole "Contribute"
注意:原尝试使用
Add-PnPUserToGroup时遇到错误"Entra db error: no inviteEmail for invitation",因此直接使用Set-PnPFolderPermission分配权限。
内容的提问来源于stack exchange,提问作者Adrian Ganea
相关产品推荐
相关产品推荐

