我正在尝试从Powershell管道脚本读取Azure DevOps机密变量。变量在Azure中看起来像这样:
我试图同时以param
的形式访问秘密变量,例如
[CmdletBinding()]
Param (
$SecurePassword = $env:Password
)
并简单地用作环境变量,例如
$SecurePassword = $env:Password
不幸的是,使用任何一种方法,变量都继续显示为空。
访问非秘密变量没有问题。任何帮助将不胜感激。
---------------------------------------- 编辑 ----------------------------------------
我发现文档here指出,如果任务的环境部分中明确映射了秘密,则管道中的脚本可以使用秘密。
我已经更新了Powershell任务,并尝试将变量同时映射为$(Password)
和Password
,但没有任何运气。
如上所述映射$(Password)
会显示隐藏在星号后面的字符串。
答案 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
答案 1 :(得分:0)
为什么不只是将密码存储在密钥库中作为秘密?然后是用于访问机密的azure命令,请避免所有这些操作。哎呀,我们生成了随机密码,将其存储在密钥库中,然后访问适当资源中的内容,而无需像在azure sql服务器数据库的ARM模板中那样,在powershell命令中公开解密的机密。
我知道这不能解决您最初的问题,但这是一种可行的解决方法。