gpt4 book ai didi

powershell - 如何将 secret 变量与内联 powershell 脚本一起使用

转载 作者:行者123 更新时间:2023-12-03 16:32:05 28 4
gpt4 key购买 nike

所以我有一些 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

我已经根据变量使用的 MS 链接设置了一个环境变量,作为 ADO 步骤的一部分,其中我有一个名称和一个定义为 $(mySecret) 的值。

我尝试通过上述链接中描述的各种方式访问​​它:

$我的 secret

$env:我的 secret

$($我的 secret )

$($env:MYSECRET)

$(我的 secret )

$(环境:我的 secret )

(以下所有参数都包含参数和参数)

参数([字符串]$mySecret)

参数($mySecret)

参数($MYSECRET)

参数($env:mySecret)

参数($env:MYSECRET)

所有这些都返回一个“Param is not a识别函数”,根据这些,通常是由于 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 环境中提取它们,执行直接解密和分配。完全超出了我认为这里应该需要的内容。另一个建议是创建一个额外的步骤来创建一个临时函数来提取 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 版本和“TaskPass”。我这么说是因为我上面发布的几个链接看起来像是这样。

名称: 任务通行证

值 $(ScheduledTaskPass)

另请注意,MS 最好对您隐藏此值。即使您将其设置为本地脚本变量并尝试输出该值,正如我为确认目的所做的那样,您仍然只会得到星号。但它真的就在那里,我/他们保证。

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com