【问题标题】:How to pass TFS 2018 password (Hidden) variable in a powershell script如何在 powershell 脚本中传递 TFS 2018 密码(隐藏)变量
【发布时间】:2020-02-27 05:42:49
【问题描述】:

我有一个 powershell 脚本,我想将它作为发行版的一部分运行。该脚本将创建一个 ServiceNow 更改请求。如果我在脚本中嵌入用户和密码(存​​储为变量),该脚本就可以正常工作,这非常适合测试。现在我想将用户名和密码存储在 TFS 变量中。

当 TFS 变量存储为纯文本时,我成功地提取了它们。但是,当我“锁定”变量中的密码(使其隐藏)时,ServiceNow 的身份验证失败。我确定这与我使用的方法有关,但我不是真正的程序员,我只是将代码片段拼凑在一起。这是脚本的一部分:

$user = "tfs_changerequest"
$pass = "$env:SNPWD-Hidden"  # doesn't work with hidden password


# Show SN Password #
Write-Output "SN Password #" $pass                # This looks correct
Write-Output "SN PW Hidden #" $SNPWD-Hidden       # This appears to have worked

# Build auth header
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $pass)))

# Set proper headers
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add('Authorization',('Basic {0}' -f $base64AuthInfo))
$headers.Add('Accept','application/json')
$headers.Add('Content-Type','application/json')

这只是一个 sn-p 但我得到的错误是:

##[error]Invoke-RestMethod : The remote server returned an error: (401) Unauthorized.

我认为这与 $base64AuthInfo 行有关,我猜密码变量 ($pass) 必须不隐藏,但我不知道该怎么做。

【问题讨论】:

    标签: tfs passwords environment-variables


    【解决方案1】:

    要在 powershell 脚本中使用秘密变量,您可以使用此$secret = "$(MySecretVariablet)" 示例 sn-p:

    ....
    $secret = "$(MySecretVariablet)" | ConvertTo-SecureString -AsPlainText -Force
    
    $credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $applicationId, $secret
    

    如果你正在尝试类似Write-Host "$secret" 的东西,我认为它不会起作用,好吧,保密。

    更多详情,请看以下两个链接:

    【讨论】:

    • 添加一点,您甚至可以将这些凭据保存到代理 APPDATA 中构建服务器上的 xml 文件中,然后使用它。你会这样做
    • 我尝试将脚本简化为仅提取变量,如果密码变量未隐藏,则此方法有效。如果我将密码锁定在变量中。然后它返回空。我什至在发布步骤中转换为内联 PS 脚本。 $user = "tfs_changerequest" Write-Output "SNPassword 2: " $env:SNPassword # 以明文形式工作 Write-Output "SNPassword 3: " $env:SNPASSWORD # 以明文形式工作 $secret = $env:SNPASSWORD | ConvertTo-SecureString -AsPlainText -Force Write-Output "secret:" $secret
    • @PatDelaney 正如回复中提到的,您不能使用任何格式来写入输出您的秘密变量。支持为空或 ***** 或 system.security.string。这是一个受保护的密码值,我们无法从纯文本中看到它。但是我们可以使用这个变量通过$Credential 进行身份验证。恐怕您的身份验证方法可能需要一些纯文本密码,您可以选择我或 Etienne 提到的另一种方式。
    • 嗨@Pat Delaney 关于这个问题的任何更新,你知道了吗?如果我的回复有帮助或给出了正确的方向。感谢marking it as an answer,这也将帮助社区中的其他人。
    【解决方案2】:

    您也可以使用这样的凭据文件。

    首先要求提供凭据并将其保存到构建用户配置文件中的 xml 文件中,您可以在密码更改时执行此操作。

    $Credential = Get-Credential
    $Credential | Export-CliXml -Path "${env:\userprofile}\mycreds.xml"
    

    这将创建一个看起来像这样的文件

    <Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
      <Obj RefId="0">
        <TN RefId="0">
          <T>System.Management.Automation.PSCredential</T>
          <T>System.Object</T>
        </TN>
        <ToString>System.Management.Automation.PSCredential</ToString>
        <Props>
        <S N="UserName">user</S>
        <SS N="Password">Encrypted string</SS>            
      </Props>
    </Obj>
    

    那么你就可以这样消费了

    $cred =  Import-CliXml -Path "${env:\userprofile}\mycreds.xml" 
    

    并在任何 -Credential 参数中使用 $cred。

    请注意,此文件仅在您生成它的计算机上有效。加密后的字符串只适用于那台机器,所以即使有人把它带到另一台机器上它也不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-06
      • 2018-03-06
      • 2013-04-16
      • 2016-03-29
      • 2016-03-24
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多