如何修改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
相关产品推荐
相关产品推荐

