Powershell 脚本无法使用 Credentials() 从 Jenkins 解密密码

Powershell script unable to decrypt password from Jenkins withCredentials()

我创建了一个 powershell 脚本来 运行 Jenkins 中的 DB2 查询

withCredentials([usernamePassword(credentialsId: 'cred-id', usernameVariable: 'ID', passwordVariable: 'PASSWORD')]) {
    $cn = new-object system.data.OleDb.OleDbConnection("Server=Server; Provider=IBMDADB2;DSN=DBName;User Id=$ID;Password=$PASSWORD");
    $ds = new-object "System.Data.DataSet" "ds"
    $q = "myQuery"
    $da = new-object "System.Data.OleDb.OleDbDataAdapter" ($q, $cn)
    $da.Fill($ds) 
    $cn.close()
}

如果我 运行 脚本并对我的凭据进行硬编码,它 运行 没问题。

使用 withCredentials(),我收到以下错误:Security processing failed with reason "15" ("PROCESSING FAILURE")

根据一些研究,错误似乎是因为 DB2 无法处理加密数据。有没有办法克服这个错误?

编辑: 我试着添加

$SecurePassword = ConvertTo-SecureString $PASSWORD -AsPlainText -Force
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword)
$UnsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)

在我的 powershell 脚本的开头,但它仍然会抛出相同的错误,即使凭据在纯文本中可以正常工作

如果我正确理解 Credentials Binding Jenkins plugin 的文档,在 withCredentials() 调用中指定的变量将变为 environment 变量,以便能够使用它们跨进程边界。
请注意,这些环境变量的值加密,因此目标进程不需要额外的(解密)工作。

因此,您需要使用 $env:[1] 而不是 $ 在 PowerShell 中引用这些变量:

$cn = new-object system.data.OleDb.OleDbConnection "Server=Server; Provider=IBMDADB2;DSN=DBName;User Id=$env:ID;Password=$env:PASSWORD"

[1] 请参阅概念性 about_Environment_Variables 帮助主题。