如何在内嵌powershell脚本中使用秘密变量

如何在内嵌powershell脚本中使用秘密变量,powershell,ado,azure-deployment,Powershell,Ado,Azure Deployment,因此,我有一些powershell,我正试图在ADO部署期间使用它来设置计划任务。为了将任务设置为“无论用户是否登录都运行”,我需要根据以下内容使用用户和密码创建任务: 还有其他几个 因此,根据公司的安全规则,ADO的所有密码都必须在秘密变量中。当基本上从脚本中调用时,这些不会解密,您将得到空值。根据这些,您必须将它们作为环境变量和/或参数传递给脚本: 其中许多也只显示了yaml的一面,但我使用的是classic,因此没有任何用处,我怀疑这与下一个链接无关,而下一个链接反驳了他们

因此,我有一些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脚本中的一个秘密变量,有人知道如何实现这一点吗。请注意,下面的任务创建代码在我为用户和密码使用纯文本输入时确实有效,但这违反了策略,因此不是一个选项

这是我的剧本:

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的脚本时,我可以复制您的错误