如何在Azure PowerShell中跨订阅引用存储账户至SQL数据库漏洞评估设置
解决跨Azure订阅引用存储账户的问题
当存储账户与SQL数据库处于不同Azure订阅时,直接传入-StorageAccountName会导致脚本在当前订阅内查找,无法定位目标存储账户。可以通过以下两种方式解决:
方法1:使用存储账户密钥
先切换到存储账户所在的订阅获取密钥,再切回SQL数据库所在订阅执行脚本:
# 切换到存储账户所在的订阅 Set-AzContext -SubscriptionId "<存储账户订阅ID>" # 获取目标存储账户的密钥 $storageAccountKey = (Get-AzStorageAccount -ResourceGroupName "<存储账户资源组名>" -Name $StorageAccountName).Keys[0].Value # 切回SQL数据库所在的订阅 Set-AzContext -SubscriptionId "<SQL数据库订阅ID>" # 执行原脚本,添加-StorageAccountKey参数 Get-AzSqlDatabase -ResourceGroupName $ResourceGroupName -ServerName $SQLServer ` | Where-Object {$_.DatabaseName -ne "master"} ` | Update-AzSqlDatabaseVulnerabilityAssessmentSetting ` -StorageAccountName $StorageAccountName ` -StorageAccountKey $storageAccountKey ` -ScanResultsContainerName "containerlogs" ` -RecurringScansInterval Weekly ` -EmailAdmins $true ` -NotificationEmail @("xxx@mail.com" , "yyy@mail.com")
方法2:使用存储账户容器的SAS URI
生成目标容器的SAS URI(需包含写入权限),直接在脚本中使用该URI,无需切换订阅:
# 切换到存储账户所在的订阅 Set-AzContext -SubscriptionId "<存储账户订阅ID>" # 获取存储账户上下文并生成容器的SAS URI(有效期可按需调整) $storageContext = New-AzStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey (Get-AzStorageAccount -ResourceGroupName "<存储账户资源组名>" -Name $StorageAccountName).Keys[0].Value $sasUri = New-AzStorageContainerSASToken -Name "containerlogs" -Context $storageContext -Permission wl -ExpiryTime (Get-Date).AddYears(1) -FullUri # 切回SQL数据库所在的订阅 Set-AzContext -SubscriptionId "<SQL数据库订阅ID>" # 执行脚本,使用-StorageSasUri参数替代存储账户名称和密钥 Get-AzSqlDatabase -ResourceGroupName $ResourceGroupName -ServerName $SQLServer ` | Where-Object {$_.DatabaseName -ne "master"} ` | Update-AzSqlDatabaseVulnerabilityAssessmentSetting ` -StorageSasUri $sasUri ` -RecurringScansInterval Weekly ` -EmailAdmins $true ` -NotificationEmail @("xxx@mail.com" , "yyy@mail.com")
关键说明
- 两种方法都需要先获取存储账户的访问凭证(密钥或SAS URI),因为仅通过名称无法跨订阅定位存储资源。
- 使用SAS URI时,确保授予的权限包含写入(
w)和列出(l),以支持漏洞评估扫描结果的写入和访问。 - 若需要长期使用,建议将SAS URI的有效期设置得足够长,或定期更新。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

