Итак, у меня есть PowerShell, который я пытаюсь использовать для настройки запланированной задачи во время развертывания ADO. Чтобы получить задание «Запускать независимо от того, вошел ли пользователь в систему или нет», мне необходимо создать его с использованием имени пользователя и пароля в соответствии с приведенными ниже инструкциями:
Установить запланированное задание для запуска, когда пользователь не вошел в систему
Запланировать создание задачи с параметром «Запустить, вошел ли пользователь в систему или нет», используя powershell
https://docs.microsoft.com/en-us/powershell/module/scheduledtasks/new-scheduledtaskprincipal?view=win10-ps
и несколько других.
Таким образом, в соответствии с правилами безопасности компании все пароли от ADO должны быть в секретных переменных. Они не дешифруются при вызове в основном из скриптов, вы получите нулевые значения. В соответствии с ними, вы должны передать их в качестве переменных среды и / или параметров в сценарий:
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: передать переменные сборки / выпуска в задачу скрипта Powershell
https://github.com/microsoft/azure-pipelines-agent/issues/145
https://adamtheautomator.com/azure-devops-variables-complete-guide/
Многие из них также показывают только сторону yaml, но я использую classi c, так что это бесполезно, и я подозреваю, что не имеет значения, основываясь на следующей ссылке, которая затем противоречит им, говоря вам можно использовать параметры только в файловых сценариях, а не в строке:
https://github.com/MicrosoftDocs/vsts-docs/issues/1083
Я установил переменную среды для ссылки MS на использование переменной как часть Шаг ADO, где у меня есть имя и значение, определенное как $ (mySecret).
Я пытался получить доступ к этому с помощью различных средств, описанных в ссылках выше:
$ MYSECRET
$ env: MYSECRET
$ ($ MYSECRET)
$ ($ env: MYSECRET)
$ (MYSECRET)
$ (env: M YSECRET)
(все перечисленные ниже с Param и param)
param ([string] $ mySecret)
param ($ mySecret)
param ($ MYSECRET)
param ($ env: mySecret)
param ($ env: MYSECRET)
Все они возвращают «Param не распознанная функция» что в соответствии с этим, как правило, происходит из-за того, что param не является первым словом в сценарии, что для меня не так, я уже проверил, дважды проверил, вытащил текст в блокнот, notepad ++ (оба на всякий случай) и сравнил и проверил, что это действительно первое слово в сценарии:
PowerShell 2.0 и «Термин« Param »не распознается как имя командлета, функции, файла сценария или работоспособного программа "
Параметры PowerShell -" Термин "параметр" не распознается как имя командлета "
PowerShell не может распознать параметр
Я даже пытался скопировать и вставить некоторые решения Param Sugge выше, даже от ADO git, и все они терпят неудачу для этого. Я полагаю, что из-за проблемы git 1083, связанной выше.
Ни одно из предложений или ответов ни по одной из опубликованных мной ссылок не сработало.
На одной из других ссылок, с которыми я сталкивался, было предложение создать до трех других шагов развертывания для создания переменных, извлечения их из среды ADO, выполнения прямого дешифрования и назначения. Полностью сверх того, что я считаю, должно быть здесь. Другое предложение состояло в том, чтобы создать дополнительный шаг для создания временной функции для извлечения секрета и его синтаксического анализа с подстрокой с парой различных начальных и конечных значений, а также для их объединения, как, очевидно, функция подстроки могла видеть за пределами шифрования. Даже если это сработало, это смешно. Поэтому я не пробовал эти последние 2 предложения. Если это действительно так, то я бы хотел, чтобы кто-то указал мне на git документы с указанием как таковой, или на нем должна быть написана ошибка.
Я просто в растерянности. Мне просто нужно получить доступ к секретной переменной во встроенном скрипте PowerShell для одной задачи во время и развертывания ADO, кто-нибудь знает, как этого добиться. Обратите внимание, что приведенный ниже код создания задачи работает, когда я использую ввод простого текста для пользователя и пароля, но это противоречит политике, поэтому не вариант.
Вот мой сценарий:
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
}