You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Azure Automation Runbook脚本将运行输出保存为CSV文件

Azure Automation Runbook导出AD查询结果为CSV的调整方案

你可以按以下逻辑调整原有脚本,两种实现可选:直接输出CSV内容可从作业下载,或者持久化存储到Azure存储账户。

核心调整点

  • 优化原有三次调用Get-AzureADUser的逻辑,改为一次性拉取所有用户后分组,减少API请求耗时
  • 使用Export-Csv将结果导出到Runbook的临时磁盘路径($env:TEMP,作业运行期间有效)
  • 可选配置上传到Azure存储账户,永久保存生成的CSV文件

修改后完整脚本

# 原有登录逻辑保持不变
$connectionName = "AzureRunAsConnection"
$servicePrincipalConnection = Get-AutomationConnection -Name $connectionName         

"Logging in to Azure AD..."
Connect-AzureAD -TenantId $servicePrincipalConnection.TenantId `
    -ApplicationId $servicePrincipalConnection.ApplicationId `
    -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint

# 1. 导出租户详情CSV
$tenantDetails = Get-AzureADTenantDetail | Select DisplayName, Street, PostalCode, City, CountryLetterCode
$tenantCsvPath = Join-Path $env:TEMP "TenantDetails.csv"
$tenantDetails | Export-Csv -Path $tenantCsvPath -NoTypeInformation -Encoding UTF8
"Tenant details CSV generated"

# 2. 一次性拉取所有AD用户,按首字母分组
$allAdUsers = Get-AzureADUser -All $true | Select DisplayName,UserPrincipalName,Department
$userA2J = $allAdUsers | Where-Object { $_.DisplayName -cmatch '^[a-jA-J]'}
$userK2T = $allAdUsers | Where-Object { $_.DisplayName -cmatch '^[k-tK-T]'}
$userU2Z = $allAdUsers | Where-Object { $_.DisplayName -cmatch '^[u-zU-Z]'}

# 3. 导出用户分组CSV
$a2jCsvPath = Join-Path $env:TEMP "Users_A2J.csv"
$userA2J | Export-Csv -Path $a2jCsvPath -NoTypeInformation -Encoding UTF8

$k2tCsvPath = Join-Path $env:TEMP "Users_K2T.csv"
$userK2T | Export-Csv -Path $k2tCsvPath -NoTypeInformation -Encoding UTF8

$u2zCsvPath = Join-Path $env:TEMP "Users_U2Z.csv"
$userU2Z | Export-Csv -Path $u2zCsvPath -NoTypeInformation -Encoding UTF8
"All user group CSV generated"

# --------------------------
# 可选方案1:输出CSV内容到作业日志,可直接复制下载
# --------------------------
"=== TenantDetails.csv 内容开始 ==="
Get-Content $tenantCsvPath -Raw
"=== TenantDetails.csv 内容结束 ==="

"=== Users_A2J.csv 内容开始 ==="
Get-Content $a2jCsvPath -Raw
"=== Users_A2J.csv 内容结束 ==="

# 其余两个分组文件输出逻辑同上

# --------------------------
# 可选方案2:上传到Azure存储账户持久保存(推荐)
# --------------------------
# 提前在Automation账户中创建加密变量存储存储账户名和密钥,避免硬编码
$storageAccount = Get-AutomationVariable -Name "ReportStorageAccountName"
$storageKey = Get-AutomationVariable -Name "ReportStorageAccountKey"
$container = "ad-user-reports"
$context = New-AzStorageContext -StorageAccountName $storageAccount -StorageAccountKey $storageKey

# 带时间戳命名避免覆盖
$timeSuffix = Get-Date -Format "yyyyMMddHHmmss"
Set-AzStorageBlobContent -File $tenantCsvPath -Container $container -Blob "TenantDetails_$timeSuffix.csv" -Context $context -Force
Set-AzStorageBlobContent -File $a2jCsvPath -Container $container -Blob "Users_A2J_$timeSuffix.csv" -Context $context -Force
Set-AzStorageBlobContent -File $k2tCsvPath -Container $container -Blob "Users_K2T_$timeSuffix.csv" -Context $context -Force
Set-AzStorageBlobContent -File $u2zCsvPath -Container $container -Blob "Users_U2Z_$timeSuffix.csv" -Context $context -Force
"All CSV files uploaded to storage account"

注意事项

  • 如果使用存储账户上传方案,需要先为Runbook的运行身份分配存储账户的存储Blob数据写入者权限,同时提前在Automation账户的模块库中导入Az.Storage模块
  • 如果不需要拆分多个CSV,可以新增分组字段合并为单个文件,示例逻辑:
$allUsersWithGroup = $allAdUsers | ForEach-Object {
    $firstChar = $_.DisplayName.Substring(0,1).ToLower()
    $group = switch ($firstChar) {
        {$_ -ge 'a' -and $_ -le 'j'} {'A-J'}
        {$_ -ge 'k' -and $_ -le 't'} {'K-T'}
        {$_ -ge 'u' -and $_ -le 'z'} {'U-Z'}
        default {'其他'}
    }
    $_ | Add-Member -MemberType NoteProperty -Name 'NameGroup' -Value $group -PassThru
}
$allUsersWithGroup | Export-Csv -Path (Join-Path $env:TEMP "AllUsers_Grouped.csv") -NoTypeInformation -Encoding UTF8

内容的提问来源于stack exchange,提问作者Bilal Yousaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:15:03