使用PowerShell在OneDrive创建文件夹遇权限及路径问题求助
问题1:PnP PowerShell连接OneDrive时报403 Forbidden
无法通过PowerShell在OneDrive中创建文件/文件夹,报错:Resolve-PnPFolder : The remote server returned an error: (403) Forbidden。
已尝试用ClientID和密钥连接,收到警告提示客户端密钥属于旧认证方式、功能受限,但已给应用注册添加了几乎所有权限,仍报错。此前用同应用注册通过NuGet包可正常工作,现在必须改用PowerShell。
连接代码:
$OneDriveSiteURL = "https://XXXXtest104-my.sharepoint.com/personal/agileqa_XXXXXtest104_onmicrosoft_com" Connect-PnPOnline -Url $OneDriveSiteURL -ClientId "3ed262a0-f02e-48f4-9ede-ef90c76aXXXX" -ClientSecret "dAs8Q~XXXXkdmF4bF3UI1Hke2yxtTgXXXX"
问题2:Graph API创建文件夹到SPO而非OneDrive
使用Microsoft Graph API的PowerShell代码能创建文件夹,但文件夹出现在SharePoint Online(SPO)而非目标OneDrive,原因是什么?
相关代码:
$clientId = "XXXXXXXXXXXXXX" $tenantId = "XXXXXX.onmicrosoft.com" $clientSecret = 'XXXXXXXXXXXX' $uri = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" $body = @{ client_id = $clientId scope = "https://graph.microsoft.com/.default" client_secret = $clientSecret grant_type = "client_credentials" } $tokenRequest = Invoke-WebRequest -Method Post -Uri $uri -ContentType "application/x-www-form-urlencoded" -Body $body -UseBasicParsing $token = ($tokenRequest.Content | ConvertFrom-Json).access_token Write-Host $token $uri = "https://graph.microsoft.com/v1.0/<ID XXXXXXX>/drive/root/children" $method = 'POST' $head= @{Authorization = "Bearer $token"} $postPara= @{ name= "NewFolder" folder= {} } | ConvertTo-Json $antwort = Invoke-RestMethod -Headers $head -Uri $uri -Method $method -Body $postPara -ContentType "application/json" Write-Host $antwort
问题1的解决思路
- 权限范围未匹配OneDrive需求:即使添加了大量权限,针对OneDrive的PnP操作需要明确的SharePoint应用权限,比如
Sites.FullControl.All或Sites.Manage.All,且需确保权限覆盖到目标用户的个人OneDrive站点(全局权限可能未同步到个人站点)。 - 客户端密钥认证的局限性:PnP的客户端密钥认证属于旧版认证,对OneDrive个人站点的支持有限,即使权限配置正确,也可能无法访问特定资源路径。建议改用证书认证,或在允许的情况下使用委派权限+交互式/用户名密码认证。
- 未给OneDrive站点单独授权应用:需手动在目标OneDrive站点上给应用分配权限,执行命令:
Set-PnPTenantSite -Url $OneDriveSiteURL -AppId $ClientId -Permissions FullControl,这一步常被忽略。 - 工具间的逻辑差异:之前的NuGet包可能使用Graph API,而PnP PowerShell默认依赖SharePoint CSOM,两者权限要求和认证逻辑不同,导致同应用注册在不同工具下表现不一致。
问题2的原因及解决
你使用的Graph API端点<ID XXXXXXX>/drive/root/children中,若<ID XXXXXXX>是SharePoint站点ID,创建的文件夹自然会落在SPO站点文档库。要指定OneDrive,需用用户ID或用户UPN定位个人驱动器:
- 正确端点格式:
https://graph.microsoft.com/v1.0/users/{user-id-or-upn}/drive/root/children - 示例替换:
https://graph.microsoft.com/v1.0/users/agileqa_XXXXXtest104_onmicrosoft_com/drive/root/children
另外,客户端凭证模式下,需确保应用注册拥有Files.ReadWrite.All应用权限并完成管理员同意,否则无法访问用户OneDrive。
内容的提问来源于stack exchange,提问作者Bandit
相关产品推荐
相关产品推荐

