Powershell访问Azure DevOps秘密变量

时间:2019-06-26 21:38:30

标签: powershell azure-devops

我正在尝试从Powershell管道脚本读取Azure DevOps机密变量。变量在Azure中看起来像这样:

enter image description here

我试图同时以param的形式访问秘密变量,例如

[CmdletBinding()]
Param (
    $SecurePassword = $env:Password
)

并简单地用作环境变量,例如

$SecurePassword = $env:Password

不幸的是,使用任何一种方法,变量都继续显示为空。

enter image description here

访问非秘密变量没有问题。任何帮助将不胜感激。

---------------------------------------- 编辑 ----------------------------------------

我发现文档here指出,如果任务的环境部分中明确映射了秘密,则管道中的脚本可以使用秘密。

enter image description here

我已经更新了Powershell任务,并尝试将变量同时映射为$(Password)Password,但没有任何运气。

enter image description here

如上所述映射$(Password)会显示隐藏在星号后面的字符串。

Using $(Password) returns

2 个答案:

答案 0 :(得分:1)

我们需要在Azure DevOps中创建一个新项目,并且需要将所有管道迁移到新项目中。瞧,没人知道所有的秘密,而导出/导入并不能做到这一点。

我编写了一个脚本,将所有环境变量输出到构建摘要旁边的“扩展”选项卡中。它已经格式化,并且所有内容。

输出密码的关键是通过在密码值中插入'<-eliminate->'短语并保存到文件来更改字符串。创建文件后,我们将删除字符串'<-eliminate->'的所有实例,保存文件,然后将其作为构建摘要的扩展页放置。

我想以某种方式动态地找到所有机密,但是现在手动定义变量名可以解决问题。

我对此帖子进行了重新格式化,并删除了专有信息,如果它损坏了,请让我知道:)

function GetSecretLength ($secretVar){
     $i = 0;
     while($true){
          try { 
               $secretVar.substring(0,$i)|out-null 
          } catch { 
               break
          };
          $i++; 
     }
     if ($i -le 1) { return 1 }
     else { return $i-1 };
} 
function GetSecret($secret){
     $length = GetSecretLength($secret);
     if ($length -ge 2) {
        return $secret.substring(0,$length-1 )+"<-eliminate->"+$secret.substring($length-1,1)
    } elseif ($length -eq 1) {
        return $secret+"<-eliminate->"
    } else {
        return ""
    }
} 

$var = (gci env:*).GetEnumerator() | Sort-Object Name
$out = ""

Foreach ($v in $var) { $out = $out + "`t{0,-28} = {1,-28}`n" -f $v.Name, (GetSecret($v.Value)) }

$fileName = "$env:BUILD_ARTIFACTSTAGINGDIRECTORY\build-variables.md"
write-output "dump variables on $fileName"
set-content $fileName $out

write-output "##vso[task.addattachment type=Distributedtask.Core.Summary;name=Environment Variables;]$fileName"

((Get-Content -path $fileName -Raw) -replace '<-eliminate->', '') | Set-Content -Path $fileName

您必须将所需的秘密变量添加到Powershell任务的“环境变量”中: Environment Variables

您最终得到了一个漂亮的标签: enter image description here

答案 1 :(得分:0)

为什么不只是将密码存储在密钥库中作为秘密?然后是用于访问机密的azure命令,请避免所有这些操作。哎呀,我们生成了随机密码,将其存储在密钥库中,然后访问适当资源中的内容,而无需像在azure sql服务器数据库的ARM模板中那样,在powershell命令中公开解密的机密。

我知道这不能解决您最初的问题,但这是一种可行的解决方法。