Azure Devops 发布 > Powershell 任务 > 构建计划任务

Azure Devops Release > Powershell task > Building a scheduled task

我正在尝试构建一个 Powershell 函数,该函数将在我的 onPrem 服务器上创建一个 Windows 计划任务作为我的 Azure 发布管道的一部分,它需要 运行 使用“运行 用户是否登录”,所以我向它传递了一个 AD 服务帐户用户 ID 和密码。

如果我使用来自变量的纯文本密码,这完全没问题,但我想从我的 Azure KeyVault 导入密码。我将其称为“PasswordFromKeyVault”。

我添加了一个新的变量组,链接到 Keyvault,它正确地检索了值。

这是我在这一步中使用的 Powershell 脚本:

$TaskName = "HelloNewTaskWorld"
$Trigger= New-ScheduledTaskTrigger -At 10:02am -Daily

$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C:\PowershellScripts\Somescript.ps1"

$principal = New-ScheduledTaskPrincipal -UserId $(PlainTextUserIdVariable) -LogonType ServiceAccount
$description = "Testing AzureDevOps ability to deploy a fully configured scheduled task"

#As expected, outputs xxx to the console
Write-Host $(PasswordFromKeyVault)


Register-ScheduledTask -TaskName $TaskName -Description $description -Trigger $Trigger -Action $Action -Principal $principal –Force
Set-ScheduledTask -TaskName $TaskName -User $principal.UserID -Password $(PasswordFromKeyVault)

但是当它 运行 时,我收到错误消息“用户名或密码不正确”:

2022-04-11T16:18:23.0724016Z Set-ScheduledTask : The user name or password is incorrect.
2022-04-11T16:18:23.0724884Z At C:\vstsagent\XW14Agent1\_work\_tempf67b9e-e6f7-4f71-9be9-fe24498f535e.ps1:16 char:1
2022-04-11T16:18:23.0725477Z + Set-ScheduledTask -TaskName $TaskName -User $principal.UserID -Passwo ...
2022-04-11T16:18:23.0726111Z + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2022-04-11T16:18:23.0726638Z     + CategoryInfo          : AuthenticationError: (PS_ScheduledTask:Root/Microsoft/...S_ScheduledTask) [Set-Scheduled 
2022-04-11T16:18:23.0727110Z    Task], CimException
2022-04-11T16:18:23.0727497Z     + FullyQualifiedErrorId : HRESULT 0x8007052e,Set-ScheduledTask

我认为这是因为 Azure Keyvault 值已加密且无法解密(这正是我想要的),但有谁知道如何使用已加密的密码创建凭据?

编辑 - 2022 年 4 月 17 日


错误:The user name or password is incorrect , 可以通过检查并将检索到的密码放在双引号中以获取实际值来解决。 IE;喜欢

"$(PasswordFromKeyVault)"

14/04/2022

  1. 请确保在 Azure Key 中设置一个或多个访问策略 Azure DevOps 项目应用程序主体/服务的保险库 对 Secrets 具有 List/Get 权限的帐户,并确保 KeyVault 和 azureSubscription 的名称都是正确的。 可以参考这个blog.

  2. 配置Environment Variables,见 stack overflow Reference

    秘密变量通常是加密的。所以要将秘密传递给 脚本,我们可以利用
    的那些环境部分 脚本任务的输入变量。如果环境变量在
    管道是这样的:

    Name :password | value :$(mypassword)

    现在,尝试用 $env: password 调用你的变量 脚本。

Set-up PS 凭据

$Username = "$env:USERDOMAIN\local-admin"

NOTE: Key Vault name and Secret name should be retrieved via “normal” variables using inherited environment variable.
for example.

$Secret = (Get-AzKeyVaultSecret -VaultName "myKeyVaultName" -Name "kvTestSecret").SecretValueText
 Write-Host  "PowerShell Get-AzKeyVaultSecret: $Secret"

References:

[string]$AdminPassword = Get-AzKeyVaultSecret -VaultName "***" -Name "***" -AsPlainText
//or$ AdminPassword=$env: password
[securestring]$SecureAdminPassword = $AdminPassword | convertto-securestring -AsPlainText -Force
//or $Password = ConvertTo-SecureString "PasswordHere" -AsPlainText -Force

$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $Username, $SecurAdminPassword
//or $cred = New-Object System.Management.Automation.PSCredential($Username,$SecurAdminPassword)

//Then you can Set-up Scheduled Task parameters

勾选this.

参考文献:

  1. 在 Azure DevOps Powershell 脚本中动态获取 KeyVault 机密 - 堆栈溢出
  2. Azure Key Vault task - Azure Pipelines | Microsoft Docs
  3. about Quoting Rules - PowerShell | Microsoft Docs