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

导出Azure Policy Assignment CSV时NotScope列报System.String[]错误

Azure策略分配导出CSV时NotScope字段显示System.String[]的修复

问题原因

Export-Csv 序列化对象属性时,只支持单值属性直接写入单元格;如果属性是数组类型,cmdlet不会自动展开数组内容,只会直接输出数组的类型全名,也就是你看到的System.String[]。Azure PowerShell返回的策略分配对象中,NotScopes本身是字符串数组类型(支持给一个策略配置多个排除范围),和CSV的二维表单值格式天然不兼容。
除了这个类型兼容问题,你写的脚本还有4处明显的逻辑问题:

  • 第一行Get-AzResourceGroup | Select-Object ResourceGroupName没有和后续的ForEach-Object打通管道,$resourceGroupName变量全程没有被赋值,导出的资源组字段全部为空
  • 没有初始化$mgId结果集合,直接用+=追加自定义对象在PowerShell中效率极低,策略数量多的时候导出速度会非常慢,还容易残留之前会话的脏数据
  • 循环逻辑错误:每个资源组遍历节点都拉取一次全订阅的所有策略分配,最终导出的结果会有大量重复条目
  • Export-Csv没有指定输出路径、编码、类型头参数,会出现结果不落地到文件、中文乱码、CSV首行多余类型信息的问题

修复方法

核心处理逻辑是用-join运算符把NotScopes的多值数组拼接为带分隔符的单字符串,同时补全原脚本缺失的逻辑,完整可运行代码如下:

# 初始化泛型集合存储结果,比数组+=的追加效率高数十倍
$mgId = [System.Collections.Generic.List[PSObject]]::new()

# 拉取当前Azure登录上下文的订阅信息
$currentContext = Get-AzContext
$SubscriptionId = $currentContext.Subscription.Id
$subscriptionName = $currentContext.Subscription.Name

# 遍历订阅下所有资源组,拉取对应资源组范围的策略分配
Get-AzResourceGroup | ForEach-Object {
    $currentRg = $_
    $rgScopeAssignments = Get-AzPolicyAssignment -Scope $currentRg.ResourceId
    $rgScopeAssignments | ForEach-Object {
        $mgId.Add([PSCustomObject]@{
            SubscriptionId    = $SubscriptionId
            SubscriptionName  = $subscriptionName
            ResourceGroupName = $currentRg.ResourceGroupName
            PolicyName        = $_.Name
            DisplayName       = $_.DisplayName
            Scope             = $_.Scope
            # 核心修复:将多值排除范围用分号拼接为单字符串,适配CSV格式
            NotScope          = $_.NotScopes -join ';'
        })
    }
}

# 补全订阅范围的策略分配(原逻辑会漏掉这部分不属于任何单个资源组的全局分配)
$subLevelScope = "/subscriptions/$SubscriptionId"
Get-AzPolicyAssignment -Scope $subLevelScope | ForEach-Object {
    $mgId.Add([PSCustomObject]@{
        SubscriptionId    = $SubscriptionId
        SubscriptionName  = $subscriptionName
        ResourceGroupName = "[订阅级分配]"
        PolicyName        = $_.Name
        DisplayName       = $_.DisplayName
        Scope             = $_.Scope
        NotScope          = $_.NotScopes -join ';'
    })
}

# 导出CSV文件,指定UTF8编码避免乱码,去掉多余的类型头行
$mgId | Export-Csv -Path ".\Azure策略分配清单.csv" -Encoding UTF8 -NoTypeInformation

导出后如果需要拆分多个排除范围,直接在Excel里按分号做分列,或者后续PowerShell处理时用-split ';'还原为数组即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:39:44