如何用PowerShell遍历所有Azure订阅导出带NetworkRuleSet的存储账户到CSV
Azure跨订阅存储账户网络规则批量查询方案
前置操作
- 安装Az PowerShell模块:
Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force - 登录Azure账号:
Connect-AzAccount,如果需要指定租户可使用Connect-AzAccount -Tenant <你的租户ID>
完整可执行脚本
# 初始化结果数组 $report = @() # 获取所有有权限访问的订阅 $subscriptions = Get-AzSubscription foreach ($sub in $subscriptions) { # 切换当前上下文到目标订阅 Set-AzContext -Subscription $sub.Id | Out-Null Write-Host "正在处理订阅:$($sub.Name)" # 拉取当前订阅下所有存储账户,无权限时自动跳过 $storageAccounts = Get-AzStorageAccount -ErrorAction SilentlyContinue if (-not $storageAccounts) { continue } foreach ($sa in $storageAccounts) { # 获取存储账户网络规则集 $ruleSet = Get-AzStorageAccountNetworkRuleSet -ResourceGroupName $sa.ResourceGroupName -AccountName $sa.StorageAccountName # 将数组类型的规则转为分号分隔的可读字符串,适配CSV导出格式 $ipRulesStr = $ruleSet.IpRules | ForEach-Object { $_.IPAddressOrRange } -join ";" $vnetRulesStr = $ruleSet.VirtualNetworkRules | ForEach-Object { $_.VirtualNetworkResourceId } -join ";" $resourceRulesStr = $ruleSet.ResourceAccessRules | ForEach-Object { $_.ResourceId } -join ";" # 构造输出对象 $report += [PSCustomObject]@{ 订阅ID = $sub.Id 订阅名称 = $sub.Name 存储账户名称 = $sa.StorageAccountName 资源组名称 = $sa.ResourceGroupName 位置 = $sa.Location 跳过的服务类型 = $ruleSet.Bypass -join ";" 默认访问策略 = $ruleSet.DefaultAction 允许的IP段 = $ipRulesStr 允许的虚拟网络 = $vnetRulesStr 允许的资源访问规则 = $resourceRulesStr 是否允许所有网络访问 = if ($ruleSet.DefaultAction -eq 'Allow') { '是' } else { '否' } } } } # 导出结果到当前目录的CSV文件 $outputPath = Join-Path -Path $PWD.Path -ChildPath "StorageAccount_NetworkRule_Report.csv" $report | Export-Csv -Path $outputPath -Encoding UTF8 -NoTypeInformation Write-Host "报告已生成,路径:$outputPath"
结果说明
- 默认访问策略为
Allow即代表该存储账户开启了允许所有网络访问的选项,对应是否允许所有网络访问字段为是 - 若默认策略为
Deny,可直接在对应规则字段查看已放行的IP、虚拟网络、资源规则 - 导出的CSV可直接用Excel打开查看和筛选
内容的提问来源于stack exchange,提问作者Jim82
相关产品推荐
相关产品推荐

