由于具有特殊字符的秘密密码,Azure DevOps Pipeline失败

时间:2019-09-20 09:59:16

标签: azure-devops azure-pipelines

我正在使用azure devops构建项目服务器解决方案。

在发布管道中,我有多个Powershell脚本,它们需要用户凭据作为参数。密码保存在DevOps的秘密变量中,并且包含单引号。

Password: abcd'efgh

这导致管道抛出错误:“字符串缺少终止符:'。”

当我用双引号将密码硬编码到管道中时,脚本会完美执行。

Argument: -password "abcd'efgh"

当我将DevOps机密变量放在双引号中时,脚本将执行,但是尝试在服务器上进行身份验证时出现错误,可能是因为传递的密码是“ ***”。

Argument: -password "$(passwordVariable)"

这是管道正在执行的脚本的相关部分。任何帮助将不胜感激。

param(
  $siteUrl,
  $username,
  $password
)
$encpassword = convertto-securestring -String $password -Force
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
Connect-PnPOnline -Url $siteUrl -Credentials $cred

如何将密码输入脚本?

1 个答案:

答案 0 :(得分:1)

您面临的问题是 $(passwordVariable) 变量引用在脚本主体中展开,之前它由 Powershell 执行。这意味着 Powershell 会看到变量值并解释其中的特殊字符。 您可以在所有特殊字符前加上 Powershell 转义字符 (`),但这不是很优雅。

访问脚本中变量的一种更安全的方法是通过环境变量 - 您在管道中设置的每个变量 creates an environment variable(名称为大写,. 被替换为 {{1 }}).

对于常规(非加密)变量,您将:

_

对于秘密(加密)变量,您必须 explicitly map them 到脚本的 env 变量。在经典管道中,使用 Do-Something -password "$($env:PASSWORDVARIABLE)" 部分。在 yaml 中,它看起来像这样:

Environment

一个警告:不要使用 - pwsh: | Do-Something -Password $($env:MAPPED_PASSWORD) env: MAPPED_PASSWORD: $(passwordVariable) 作为映射变量的前缀 - 它不起作用,因为 DevOps 在内部使用此前缀。