我想创建一个函数来获取没有任何虚拟网络的 Key Vault 列表
I want to create a function that will get a list of Key Vaults that don't have any virtual networks
脚本部分单独工作,但是当 运行 一起生成错误输出(即显示具有虚拟网络的 KeyVaults。我该如何解决这个问题?
function Get-KeyVault {
[CmdletBinding()]
param (
#Enter the path you would like to save the excel output
[Parameter(Mandatory)]
[string]
$Path
)
$KeyVaults= Get-AzKeyVault
$result=@()
foreach($keyvault in $KeyVaults)
{
$NetworkAcls=(Get-AzKeyVault -VaultName $keyvault).NetworkAcls
$VirtualNetworkResourceIds= $NetworkAcls.VirtualNetworkResourceIds
if ($VirtualNetworkResourceIds -eq $null)
{
$obj = [PSCustomObject]@{
Name= $keyvault.VaultName
ResourceGroup= $keyvault.ResourceGroupName
Location= $keyvault.Location
}
$result += $obj
}
}
$result | Export-Csv -Path $Path -NoTypeInformation
}
你的代码似乎没问题,除了以下部分:
$NetworkAcls=(Get-AzKeyVault -VaultName $keyvault).NetworkAcls
在 -VaultName
中,您声明 $keyvault 即 来自 keyvaults 列表的对象不是 keyvault name , $NetworkACLs
和 $VirtualNetworkResourceIds
不提供任何输出和 if 语句都无效,导致将所有 keyvault 名称、它们的资源组名称和位置存储在自定义对象中.
要解决这个问题,您必须使用以下内容,以便将正确的输出存储在 NetworkAcls
变量中,然后执行以下步骤:
$NetworkAcls=(Get-AzKeyVault -VaultName $keyvault.VaultName).NetworkAcls
完整代码:
function Get-KeyVault {
[CmdletBinding()]
param (
#Enter the path you would like to save the excel output
[Parameter(Mandatory)]
[string] $Path
)
$KeyVaults= Get-AzKeyVault
$result=@()
foreach($keyvault in $KeyVaults)
{
$NetworkAcls=(Get-AzKeyVault -VaultName $keyvault.VaultName).NetworkAcls
$VirtualNetworkResourceIds= $NetworkAcls.VirtualNetworkResourceIds
if ($VirtualNetworkResourceIds -eq $Null)
{
$obj = [PSCustomObject]@{
Name= $keyvault.VaultName
ResourceGroup= $keyvault.ResourceGroupName
Location= $keyvault.Location
}
$result += $obj
}
}
$result | Export-Csv -Path $Path -NoTypeInformation
}
我在我的环境以及以下环境中进行了同样的测试:
具有网络策略的 KV:
问题输出:
应用修复后:
脚本部分单独工作,但是当 运行 一起生成错误输出(即显示具有虚拟网络的 KeyVaults。我该如何解决这个问题?
function Get-KeyVault {
[CmdletBinding()]
param (
#Enter the path you would like to save the excel output
[Parameter(Mandatory)]
[string]
$Path
)
$KeyVaults= Get-AzKeyVault
$result=@()
foreach($keyvault in $KeyVaults)
{
$NetworkAcls=(Get-AzKeyVault -VaultName $keyvault).NetworkAcls
$VirtualNetworkResourceIds= $NetworkAcls.VirtualNetworkResourceIds
if ($VirtualNetworkResourceIds -eq $null)
{
$obj = [PSCustomObject]@{
Name= $keyvault.VaultName
ResourceGroup= $keyvault.ResourceGroupName
Location= $keyvault.Location
}
$result += $obj
}
}
$result | Export-Csv -Path $Path -NoTypeInformation
}
你的代码似乎没问题,除了以下部分:
$NetworkAcls=(Get-AzKeyVault -VaultName $keyvault).NetworkAcls
在 -VaultName
中,您声明 $keyvault 即 来自 keyvaults 列表的对象不是 keyvault name , $NetworkACLs
和 $VirtualNetworkResourceIds
不提供任何输出和 if 语句都无效,导致将所有 keyvault 名称、它们的资源组名称和位置存储在自定义对象中.
要解决这个问题,您必须使用以下内容,以便将正确的输出存储在 NetworkAcls
变量中,然后执行以下步骤:
$NetworkAcls=(Get-AzKeyVault -VaultName $keyvault.VaultName).NetworkAcls
完整代码:
function Get-KeyVault {
[CmdletBinding()]
param (
#Enter the path you would like to save the excel output
[Parameter(Mandatory)]
[string] $Path
)
$KeyVaults= Get-AzKeyVault
$result=@()
foreach($keyvault in $KeyVaults)
{
$NetworkAcls=(Get-AzKeyVault -VaultName $keyvault.VaultName).NetworkAcls
$VirtualNetworkResourceIds= $NetworkAcls.VirtualNetworkResourceIds
if ($VirtualNetworkResourceIds -eq $Null)
{
$obj = [PSCustomObject]@{
Name= $keyvault.VaultName
ResourceGroup= $keyvault.ResourceGroupName
Location= $keyvault.Location
}
$result += $obj
}
}
$result | Export-Csv -Path $Path -NoTypeInformation
}
我在我的环境以及以下环境中进行了同样的测试:
具有网络策略的 KV:
问题输出:
应用修复后: