如何在内嵌powershell脚本中使用秘密变量
因此,我有一些powershell,我正试图在ADO部署期间使用它来设置计划任务。为了将任务设置为“无论用户是否登录都运行”,我需要根据以下内容使用用户和密码创建任务: 还有其他几个 因此,根据公司的安全规则,ADO的所有密码都必须在秘密变量中。当基本上从脚本中调用时,这些不会解密,您将得到空值。根据这些,您必须将它们作为环境变量和/或参数传递给脚本: 其中许多也只显示了yaml的一面,但我使用的是classic,因此没有任何用处,我怀疑这与下一个链接无关,而下一个链接反驳了他们的说法,即您只能在基于文件的脚本上使用参数,而不能内联使用: 作为ADO步骤的一部分,我已经在变量使用的MS链接上设置了一个环境变量,其中我有一个名称和一个定义为$(mySecret)的值 我已尝试通过上述链接中所述的各种方式访问: $MYSECRET $env:MYSECRET $($MYSECRET) $($env:MYSECRET) $(我的秘密) $(环境:MYSECRET) (以下所有参数均为Param和Param) 参数([string]$mySecret) 参数($mySecret) 参数($MYSECRET) 参数($env:mySecret) 参数($env:MYSECRET) 所有这些都返回一个“Param不是一个可识别的函数”,根据这些,通常是由于Param不是脚本中的第一个单词,这对我来说不是这样,我已经检查,再次检查,将文本拉到记事本,记事本++(两者都只是以防万一)并进行比较,并验证了它确实是脚本中的第一个单词: 我甚至尝试复制和粘贴上面建议的一些Param解决方案,甚至是从adogit复制和粘贴,但都失败了。我相信是因为上面链接的git发行1083 我发布的任何链接中的建议或答案都不起作用。 我遇到的另一个链接建议创建多达三个其他部署步骤,用于创建变量、从ADO环境中提取变量、执行直接解密和赋值。完全超出了我认为这里需要的范围。另一个建议是创建一个额外的步骤,创建一个临时函数来提取秘密,并使用具有两个不同起始值和结束值的子字符串对其进行解析,然后将它们重新组合在一起,因为显然子字符串函数可以看到加密之外的内容。即使这真的管用,那也是荒谬的。因此,我没有尝试过最后两个建议。如果真的是这样的话,我希望有人能告诉我git文档中是否有这样的说明,或者需要在上面写一个bug 我简直不知所措。我只需要在部署和ADO期间为单个任务访问内嵌powershell脚本中的一个秘密变量,有人知道如何实现这一点吗。请注意,下面的任务创建代码在我为用户和密码使用纯文本输入时确实有效,但这违反了策略,因此不是一个选项 这是我的剧本:如何在内嵌powershell脚本中使用秘密变量,powershell,ado,azure-deployment,Powershell,Ado,Azure Deployment,因此,我有一些powershell,我正试图在ADO部署期间使用它来设置计划任务。为了将任务设置为“无论用户是否登录都运行”,我需要根据以下内容使用用户和密码创建任务: 还有其他几个 因此,根据公司的安全规则,ADO的所有密码都必须在秘密变量中。当基本上从脚本中调用时,这些不会解密,您将得到空值。根据这些,您必须将它们作为环境变量和/或参数传递给脚本: 其中许多也只显示了yaml的一面,但我使用的是classic,因此没有任何用处,我怀疑这与下一个链接无关,而下一个链接反驳了他们
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 link所说的内容。这涉及到将环境变量设置为$(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”。我之所以这么说,是因为我在上面发布的几个链接让人觉得它们是
姓名:TASKPASS
值$(ScheduledTaskPass)
还需要注意的是,MS最好对您隐藏此值。即使您将其设置为一个本地脚本变量并尝试输出该值,就像我为了确认而尝试做的那样,您仍然只会得到星号。但它真的在那里,我/他们保证。在经典类型中,
为了访问内嵌powershell脚本中的秘密变量
步骤1:定义一个变量并将其设置为秘密变量(使用锁定图标)(例如名称:密码值:********)
步骤2:添加/设置一个环境变量(在内联脚本下面作为选项提供)以重新映射您的秘密变量[因为您不能在脚本中直接访问秘密变量(参考:)]例如ex-Name:PASSWORD值:$(PASSWORD)
步骤3:在脚本访问中使用此变量时,例如$env:PASSWORD非常有兴趣了解如何解决此变量。@Jawad是的,这是Azure上管道的一个版本。我在本版本的其他几个地方使用了secret变量,包括SQL脚本的执行方向以及它所服务的ASP应用程序的配置选项。正如您在引用的“使它们可用于管道中的任务”部分中所述,这是管道中的任务。至于第二部分,我知道。正如我在链接了5个站点的部分所说的,它们需要在脚本的参数中分配,或者在“设置秘密变量”部分的微软链接中分配给环境变量。@贾瓦德不在脚本的中间,它是脚本的第一个字。如上面的代码所示。这听起来像是一个文件编码问题。当我在没有BO的情况下保存类似于PC UTF-16或UTF-16BE的脚本时,我可以复制您的错误