求助:适配SharePoint Online的PowerShell脚本(含ADFS认证)
原本地SharePoint使用New-WebServiceProxy调用Lists.asmx的方式,在SharePoint Online中兼容性差,且ADFS认证场景下适配难度高。以下提供两种官方推荐的替代方案:
方案一:PnP PowerShell(推荐,ADFS友好)
PnP PowerShell是微软官方针对SharePoint Online的管理工具,内置ADFS认证处理逻辑,无需手动处理复杂的认证流程。
1. 安装PnP模块
Install-Module -Name PnP.PowerShell -Force -AllowClobber
2. 列表数据拉取脚本
# 配置参数 $siteUrl = "https://你的租户域名.sharepoint.com/sites/目标站点" $listName = "Apps" $maxItems = 10000 # 连接站点(ADFS环境下用交互式登录自动处理认证跳转) Connect-PnPOnline -Url $siteUrl -UseWebLogin # 拉取列表数据(自动处理分页,支持超过5000条数据) $listItems = Get-PnPListItem -List $listName -PageSize $maxItems # 示例:遍历输出数据 foreach ($item in $listItems) { Write-Host "项目标题: $($item.FieldValues.Title)" }
ADFS非交互式执行说明
若需自动化无交互执行,需确保ADFS账户允许非交互式登录,可使用凭证对象连接:
$username = "你的ADFS账户@域名.com" $password = ConvertTo-SecureString "你的密码" -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential($username, $password) Connect-PnPOnline -Url $siteUrl -Credential $cred
方案二:REST API(无模块依赖)
如果无法安装第三方模块,可直接调用SP Online REST API,需借助PnP获取ADFS认证后的令牌。
$siteUrl = "https://你的租户域名.sharepoint.com/sites/目标站点" $listName = "Apps" $maxItems = 10000 # 获取ADFS认证令牌(交互式登录) $conn = Connect-PnPOnline -Url $siteUrl -UseWebLogin -ReturnConnection $accessToken = $conn.Context.Credentials.GetAuthenticationCookie($siteUrl, $true).Split('=')[1] # 构造REST请求 $restUri = "$siteUrl/_api/web/lists/getbytitle('$listName')/items`?$top=$maxItems" $headers = @{ "Authorization" = "Bearer $accessToken" "Accept" = "application/json;odata=verbose" } # 调用API获取数据 $response = Invoke-RestMethod -Uri $restUri -Headers $headers -Method Get # 处理返回结果 foreach ($item in $response.d.results) { Write-Host "项目标题: $($item.Title)" }
与原脚本的核心差异
- 原脚本依赖旧版SOAP服务(Lists.asmx),SP Online对该服务的支持有限,且ADFS认证下无法直接通过
-Credential传递凭证。 - 新方案采用现代接口(PnP/REST),符合SP Online的设计规范,原生支持ADFS认证流程,稳定性和兼容性更强。
内容的提问来源于stack exchange,提问作者Ushrael
相关产品推荐
相关产品推荐

