Как использовать секретные переменные со встроенными скриптами PowerShell - PullRequest
3 голосов
/ 20 февраля 2020

Итак, у меня есть 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
} 

1 Ответ

0 голосов
/ 20 февраля 2020

Хорошо, так что я наконец-то решил это. Я использовал средство просмотра YAML, чтобы получить сравнение того, что создавал интерфейс classi c, и того, что 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 в имени не нужны, кажется, просто стандартом. Я успешно развернул обе версии: CAPS и TaskPass. Я говорю это потому, что некоторые ссылки, которые я разместил выше, создают видимость.

Имя: TASKPASS

Значение $ (ScheduledTaskPass)

Также следует отметить, что MS делает Лучше скрыть это значение от вас. Даже если вы установите локальную переменную сценария и попытаетесь вывести значение, как я пытался сделать для целей подтверждения, вы все равно получите только звездочки. Но это действительно там, я / они обещают.

...