PowerShell:如何判断用户是否有权从 Azure Key Vault 读取机密?

PowerShell: how can I tell if the user has access to read a secret from Azure Key Vault?

我正在编写一个脚本,需要确定 Key Vault 中是否存在机密。脚本的很多逻辑都与这个事实挂钩。

我遇到的问题是我的脚本无法区分秘密不存在与用户无权阅读它之间的区别。

我用来获取秘密的代码如下:

$secret = Get-AzKeyVaultSecret -VaultName $vaultName -Name $secretName

Get-AzKeyVaultSecret 命令行开关:

  1. 如果秘密存在并且可以读取,returns秘密
  2. 如果机密不存在但允许用户从密钥保管库中读取,returns$null
  3. 如果不允许用户从密钥保管库读取,returns $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的状态码是“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
   }  
}