使用PowerShell导出含自定义属性的Azure AD B2C用户表格
批量导出数百万Azure AD用户指定字段到文件
针对数百万量级的Azure AD用户导出需求,直接一次性拉取所有用户会导致内存溢出或API超时,以下是优化后的分页导出方案:
核心脚本
# 配置导出参数 $exportFilePath = "C:\Your\Path\AzureAD_Users_Export.csv" # 替换为实际的扩展属性名 $targetExtensionProp = "extension_<largenumber>_customerId" # 初始化分页链路 $nextPageLink = $null do { # 分页拉取用户,仅加载必要属性减少数据传输 $batchUsers = Get-AzureADUser -All $false -Top 999 -NextPageLink $nextPageLink -Select ObjectId, UserPrincipalName, ExtensionProperty # 提取目标字段并格式化输出 $exportData = $batchUsers | ForEach-Object { [PSCustomObject]@{ ObjectId = $_.ObjectId Email = $_.UserPrincipalName CustomerId = $_.ExtensionProperty[$targetExtensionProp] ?? $null } } # 增量追加到CSV文件(首次创建,后续追加) $exportData | Export-Csv -Path $exportFilePath -Append -NoTypeInformation -Encoding UTF8 # 更新下一页链路 $nextPageLink = $batchUsers.NextPageLink } while ($nextPageLink -ne $null) Write-Host "导出完成,文件路径:$exportFilePath"
关键优化说明
- 分页处理:使用
-Top 999(AzureAD模块单次请求最大返回量)结合-NextPageLink循环拉取,避免一次性加载数百万用户占用大量内存。 - 属性筛选:通过
-Select指定仅获取ObjectId、UserPrincipalName和ExtensionProperty,减少API传输的数据量,提升执行效率。 - 扩展属性兼容:用
?? $null处理部分用户缺失目标扩展属性的情况,避免脚本报错中断。 - 增量写入:
-Append参数确保每次分页结果直接写入文件,无需在内存中存储全量数据。
注意事项
- 替换脚本中的
<largenumber>为实际的扩展属性ID前缀,可通过查询单个用户的ExtensionProperty确认具体名称。 - 确保导出路径所在磁盘有足够存储空间(数百万用户的CSV文件通常占几十到上百GB)。
- 建议在业务非高峰时段执行,避免对Azure AD服务造成额外负载。
- 若遇到API速率限制,可在循环中添加
Start-Sleep -Seconds 1做短暂延迟,或调整-Top参数减小单次请求量。
内容的提问来源于stack exchange,提问作者onkami
相关产品推荐
相关产品推荐

