因此,我有一些Powershell尝试用于在ADO部署期间设置计划任务。为了将任务设置为“无论用户是否登录都运行”,我需要根据以下内容使用“用户”和“密码”创建该任务:

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

https://docs.microsoft.com/en-us/powershell/module/scheduledtasks/new-scheduledtaskprincipal?view=win10-ps

还有其他几个。

因此,根据公司的安全规则,ADO的所有密码都必须包含在 secret 变量中。当基本上从脚本内部调用它们时,它们不会解密,您将获得空值。根据这些,您必须将它们作为环境变量和/或参数传递给脚本:

https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=classic%2Cbatch

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

我已经在ADO变量步骤中为每个MS链接在变量用法上设置了一个环境变量,其中我有一个名字和一个定义为$(mySecret)的值。

我尝试通过上面的链接中描述的各种方法来访问此文件:

$ MYSECRET

$ env:MYSECRET

$($ MYSECRET)

$($ env:MYSECRET)

$(MYSECRET)

$(env:MYSECRET)

(以下所有同时包含参数和参数)

param([string] $ mySecret)

param($ mySecret)

参数($ MYSECRET)

param($ env:mySecret)

参数($ env:MYSECRET)

所有这些都返回一个“Param不是公认的函数”,根据这些,通常是由于param不是脚本中的第一个单词,这对我来说不是这种情况,我已经检查,仔细检查,退出将文本添加到记事本,notepad ++(以防万一)并进行比较,并验证它确实是脚本中的第一个单词:

PowerShell 2.0 and "The term 'Param' is not recognized as the name of a cmdlet, function, script file, or operable program"

PowerShell parameters - "The term 'param' is not recognized as the name of a cmdlet"

powershell unable to recognize parameter

我什至尝试复制并粘贴上面建议的某些Param解决方案,甚至是从ADO git,也都为此失败。我相信由于上面链接的git问题1083。

我发布的任何链接中的任何建议或答案都没有起作用。

我遇到的其他链接之一建议创建另外三个部署步骤来创建变量,将它们从ADO环境中拉出,执行直接解密和赋值。我认为应该在此处完全超出顶部。另一个建议是创建一个额外的步骤来创建一个temp函数,以提取 secret 并将其与带有几个不同起始值和结束值的子字符串进行解析,并将它们组合在一起,因为子字符串函数显然可以看到超出加密的范围。即使这样做确实可行,这也是荒谬的。因此,我没有尝试过最后2条建议。如果真的是这样,我希望有人指出我的git文档,或者在上面写一个错误。

我简直茫然。在ADO部署期间,我只需要在嵌入式Powershell脚本中访问一个任务的 secret 变量即可执行单个任务,没有人知道如何实现这一目标。请注意,当我为用户名和密码使用纯文本输入时,下面的任务创建代码确实可以工作,但这违反了政策,因此不是一种选择。

这是我的脚本:

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
}

最佳答案

好的,所以我终于解决了。我使用YAML查看器比较了经典界面和MS链接的内容。这涉及将环境变量设置为$(mySecret)格式的值(没有$ env:这里只是变量名)。然后在脚本中使用$ env:MYSECRET格式。但也没有duffney.io网站上的所有凭据/密码操作。只需将新任务的-Password参数直接设置为$ env:MYSECRET变量即可。无需参数。按预期将任务创建为“即使用户未登录也运行”。最终代码:

$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:URL"),
 (New-ScheduledTaskAction -Execute "powershell Invoke-Sqlcmd -ServerInstance $env:Server -Database 'MyDB' -Query 'EXEC NightlyCache'")

     $Task = New-ScheduledTask -Action $Actions -Trigger $Trigger
     $Task | Register-ScheduledTask -TaskName $taskName -User $env:ScheduledTaskUser -Password  $env:TASKPASS
}

确保将环境变量设置为以下值:

注意:名称上的CAPS在这里不是必需的,似乎只是一个标准。我已经成功使用CAPS版本和“TaskPass”进行了部署。我之所以这样说,是因为我在上面发布的几个链接看起来像它们。

名称:TASKPASS

值(value)$(ScheduledTaskPass)

还要注意,MS最好向您隐藏此值。即使您将其设置为本地脚本变量并尝试输出该值(如我出于确认目的而尝试执行的操作),您仍然只会得到星号。但是,我/他们保证确实在那里。

关于powershell - 如何将 secret 变量与内联Powershell脚本一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60312461/

10-09 19:58