我正在编写一个脚本,需要确定密钥库中是否存在秘密。剧本的很多逻辑都与这个事实有关。
我遇到的问题是,我的脚本无法区分不存在的秘密和用户无法读取的秘密
我用来获取秘密的代码如下:
$secret = Get-AzKeyVaultSecret -VaultName $vaultName -Name $secretName
Get-AzKeyVaultSecret
命令集:
- 如果机密存在并且可以读取,则返回机密
- 如果密钥不存在,但允许用户从密钥库中读取,则返回
$null
- 如果不允许用户从密钥库中读取,则返回
$null
并写入控制台的错误文本
问题是我(在代码中(无法区分后两者。commandlet没有抛出异常,错误文本似乎也没有写入标准流,在那里我可以使用Out-String
或类似的方法重定向它。
有人能推荐我如何区分上述条件2(和3(吗?
只需用ErrorAction
Stop 将其包裹在try-catch中
try{
$secret = Get-AzKeyVaultSecret -VaultName $vaultName -Name $secretName -ErrorAction Stop
}
catch
{
write-host "Cannot read secrets!"
}
关于条件2,我在$secret.count -eq 0
时抛出异常。条件3的状态码是"0";403〃;,所以我用$exception.Response.StatusCode.value__
来捕捉它。
$vaultName=""
$secretName=""
try{
$secret = Get-AzKeyVaultSecret -VaultName $vaultName -Name $secretName -ErrorAction Stop
if($secret.count -eq 0){
throw [Microsoft.Azure.KeyVault.Models.KeyVaultErrorException] "$secretName secret not found."
}
}
catch
{
$exception = $_.Exception
while ($exception.GetType().FullName -eq "Microsoft.Azure.KeyVault.Models.KeyVaultErrorException") {
if($exception.Response.StatusCode.value__ -eq "403") {
write-output "user is not allowed."
} else {
write-output "secret not found."
}
break
}
}