如何通过PowerShell登录O365 SharePoint下载指定Excel文件?
方法一:用PnP PowerShell模块(最省心)
PnP PowerShell是微软官方针对SharePoint和M365的工具,身份验证和文件操作都做了封装,比原生请求靠谱得多。
操作步骤:
- 首次使用先安装模块:
Install-Module -Name PnP.PowerShell -Force -AllowClobber
- 连接站点并下载文件:
# 替换成你的SharePoint站点根URL(不是文件直接链接) $siteUrl = "https://sharepoint.com/sites/Business" # 文件在站点内的相对路径(从文档库起始) $fileRelativePath = "Shared Documents/Matt/PowerShell/business.xlsx" # 本地保存路径 $localSavePath = "C:\Users\admin\Documents\PowerShell\business.xlsx" # 执行后弹出登录窗口,输入O365账号密码即可 Connect-PnPOnline -Url $siteUrl -Interactive # 下载文件,-Force参数会覆盖已存在的同名文件 Get-PnPFile -Url $fileRelativePath -AsFile -Path $localSavePath -Force
方法二:用Invoke-WebRequest配合OAuth令牌
如果不想安装模块,可以通过Azure AD应用获取OAuth令牌验证请求,适合自动化脚本场景。
操作步骤:
- 先在Azure AD中注册应用,分配
Files.Read.All或Sites.Read.All的应用权限(需管理员同意)。 - 用以下代码获取令牌并下载:
# 替换为你的Azure AD应用信息 $clientId = "你的客户端ID" $tenantId = "你的租户ID" $clientSecret = "你的客户端密钥" # 替换为对应文件的Graph API路径(需提前获取站点ID和GUID) $fileGraphUrl = "https://graph.microsoft.com/v1.0/sites/sharepoint.com,{站点ID},{站点GUID}/drive/root:/Shared Documents/Matt/PowerShell/business.xlsx:/content" $localSavePath = "C:\Users\admin\Documents\PowerShell\business.xlsx" # 获取访问令牌 $tokenEndpoint = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" $tokenBody = @{ client_id = $clientId scope = "https://graph.microsoft.com/.default" client_secret = $clientSecret grant_type = "client_credentials" } $tokenResponse = Invoke-RestMethod -Uri $tokenEndpoint -Method Post -Body $tokenBody $accessToken = $tokenResponse.access_token # 携带令牌下载文件 Invoke-WebRequest -Uri $fileGraphUrl -Headers @{Authorization = "Bearer $accessToken"} -OutFile $localSavePath
提示:站点ID和GUID可通过
Get-PnPSite命令或Graph API查询获取。
方法三:模拟浏览器登录(不推荐)
通过抓取登录Cookie验证请求,但O365登录页有动态参数和MFA验证,流程繁琐且易失效,仅适合临时测试:
$fileUrl = "https://sharepoint.com/sites/Business/Shared%20Documents/Matt/PowerShell/business.xlsx" $localSavePath = "C:\Users\admin\Documents\PowerShell\business.xlsx" $session = New-Object Microsoft.PowerShell.Commands.WebRequestSession $loginPage = Invoke-WebRequest -Uri $fileUrl -WebSession $session # 手动填写登录表单,实际场景还需处理密码页、MFA等,代码会非常复杂 $loginForm = $loginPage.Forms[0] $loginForm.Fields["loginfmt"] = "你的O365账号" $response = Invoke-WebRequest -Uri $loginForm.Action -Method Post -WebSession $session -Body $loginForm.Fields # 后续MFA及动态参数处理步骤省略,脚本稳定性极低
总结
优先选择方法一,PnP模块一键搞定,无需折腾身份验证细节;若需无人值守脚本,方法二的OAuth方式更稳定,但需提前配置Azure AD应用。
内容的提问来源于stack exchange,提问作者Matt_PCCI
相关产品推荐
相关产品推荐

