【发布时间】:2020-02-20 03:24:19
【问题描述】:
所以我有一些我试图在 ADO 部署期间用来设置计划任务的 powershell。为了将任务设置为“无论用户是否登录都运行”,我需要根据这些使用用户和密码来创建它:
Set a Scheduled Task to run when user isn't logged in
Schedule task creation with option ""Run whether user is logged in or not"" using powershell
还有其他几个。
因此,根据公司的安全规则,来自 ADO 的所有密码都必须位于秘密变量中。当基本上从脚本中调用时,这些不会解密,您将获得空值。根据这些,您必须将它们作为环境变量和/或参数传递给脚本:
https://github.com/Microsoft/azure-pipelines-tasks/issues/8345
VSTS: Pass build/release variables into Powershell script task
https://github.com/microsoft/azure-pipelines-agent/issues/145
https://adamtheautomator.com/azure-devops-variables-complete-guide/
其中许多也只显示 yaml 方面,但我使用的是经典,所以这没有用,我怀疑根据下一个链接不相关,然后与他们说你只能在文件基础脚本上使用参数而不是内联:
https://github.com/MicrosoftDocs/vsts-docs/issues/1083
我已经为变量使用的 MS 链接设置了一个环境变量,作为 ADO 步骤的一部分,其中我有一个名称和一个定义为 $(mySecret) 的值。
我已经尝试通过上面链接中描述的各种方式访问它:
$我的秘密
$env:我的秘密
$($MYSECRET)
$($env:MYSECRET)
$(我的秘密)
$(env:MYSECRET)
(以下所有参数都带有Param和param)
param([string]$mySecret)
参数($mySecret)
参数($MYSECRET)
参数($env:mySecret)
参数($env:MYSECRET)
所有这些都返回一个“参数不是一个可识别的函数”,根据这些,通常是由于参数不是脚本中的第一个单词,这对我来说不是这样,我已经检查过,仔细检查过,把文字拉到记事本,notepad++(都是为了以防万一)比较,验证确实是脚本中的第一个字:
PowerShell parameters - "The term 'param' is not recognized as the name of a cmdlet"
powershell unable to recognize parameter
我什至尝试复制和粘贴上面建议的一些 Param 解决方案,甚至从 ADO git 中复制和粘贴,但它们都失败了。我相信是因为上面链接的 git issue 1083。
我发布的任何链接中的建议或答案均无效。
我遇到的其他链接之一建议创建最多三个其他部署步骤来创建变量、从 ADO 环境中提取变量、执行直接解密和赋值。我认为这里应该需要的东西完全超出了顶部。另一个建议是创建一个额外的步骤来创建一个临时函数来提取秘密并使用具有几个不同开始和结束值的子字符串解析它,并将它们重新组合在一起,因为显然子字符串函数可以看到加密之外的内容。即使这确实有效,那也是荒谬的。因此,我没有尝试过最后两个建议。如果真的是这样的话,我希望有人指出我的 git 文档这样说明,或者需要在上面写一个错误。
我简直不知所措。我只需要在 ADO 部署期间为单个任务访问内联 powershell 脚本中的秘密变量,有谁知道如何实现这一点。请注意,当我为用户和密码使用纯文本输入时,下面的任务创建代码确实有效,但这违反了政策,因此不是一个选项。
这是我的脚本:
param($taskPass)
$taskName = $env:ScheduledTaskName
$taskExists = Get-ScheduledTask | Where-Object {$_.TaskName -like $taskName }
if(!$taskExists) {
$Trigger = New-ScheduledTaskTrigger -Daily -At 3am
$Actions = (New-ScheduledTaskAction -Execute "powershell curl -Method POST -Uri $env:VarURL"),
(New-ScheduledTaskAction -Execute "powershell Invoke-Sqlcmd -ServerInstance $env:Server -Database 'MyDB' -Query 'EXEC NightlyProc'")
#The following was suggested from here http://duffney.io/Create-ScheduledTasks-SecurePassword
$SecurePassword = "$taskPass"
Write-Host "Pass: $SecurePassword"
$Credentials = New-Object System.Management.Automation.PSCredential -ArgumentList $env:ScheduledTaskUser, $SecurePassword
$Password = $Credentials.GetNetworkCredential().Password
$Task = New-ScheduledTask -Action $Actions -Trigger $Trigger
$Task | Register-ScheduledTask -TaskName $taskName -User $env:ScheduledTaskUser -Password $Password
}
【问题讨论】:
-
非常有兴趣看看如何解决这个问题。
-
@Jawad 是的,这是 Azure 上的管道版本。我在此版本的其他几个地方使用了秘密变量,无论是在 SQL 脚本执行的方向上,还是在所服务的 ASP 应用程序的配置选项中。正如您在引用“使它们可用于管道中的任务”部分中所述。这是管道中的一项任务。我知道的第二部分。正如我链接 5 个站点的部分所述,它们需要在脚本的参数中或根据“设置秘密变量”部分下的 microsoft 链接分配给环境变量。
-
@Jawad 它不在脚本的中间,它是脚本的第一个单词。如上代码所示。
-
这听起来像是文件编码问题。当我将类似的脚本保存为没有 BOM 标头的 PC UTF-16 或 UTF-16BE(使用 TextPad)时,我可以复制您的错误。如果我包含 BOM 标头,或者使用 DOS、ANSI 或 UTF-8 编码保存文件,它似乎可以在没有 param() 错误的情况下工作。希望这会有所帮助。
标签: powershell ado azure-deployment