В настоящее время в конвейере выполняется сценарий Powershell для сохранения URL-адреса рабочего процесса стандартного приложения логики в хранилище ключей Azure. Возникают следующие проблемы: Мой скрипт сначала вызывает en, сохраняет результат в переменной, назовем ее $result, используя: az rest --method post --uri XXXX
Я получаю URL-адрес, сохраняя его в следующей переменной:
$urlResult = ($result | ConvertFrom-Json).value
URL-адрес обычно выглядит примерно так:
https://X.appserviceenvironment.net:443/api/NameWorkFlow/triggers/When_a_HTTP_request_is_received/invoke?api-version=2022-05-01&sp=%2Ftriggers%2FWhen_a_HTTP_request_is_received%2Frun&sv=1.0&sig=SIGVALUE
Теперь, когда я пытаюсь добавить этот URL-адрес рабочего процесса в хранилище ключей:
az keyvault secret set --vault-name $keyVaultName --name "Name" --value $urlResult
Мой скрипт завершается с кодом ошибки:
Я попытался избежать urlResult, используя:
$escapedUrl = [System.Uri]::EscapeDataString($urlResult)
На этот раз сценарий запускается, но в хранилище ключей добавляется следующее значение:
https%3A%2F%2FX.appserviceenvironment.net%3A443%2Fapi%2FNameWorkFlow%2Ftriggers%2FWhen_a_HTTP_request_is_received%2Finvoke%3Fapi-version%3D2022-05-01%26sp%3D%252Ftriggers%252FWhen_a_HTTP_request_is_receive d%252Frun%26sv%3D1.0% 26сиг%3DSIGVALUE
Наконец, я также попробовал использовать '' вокруг значения, например:
az keyvault secret set --vault-name $keyVaultName --name "Name" --value '$urlResult'
Но это, конечно, только добавляет «$urlResult» в хранилище ключей.
Вариантов сейчас нет, может кто-нибудь помочь?
Упоминалось в посте выше. Пробовал 2 подхода, но оба не привели к желаемому результату.





Работа со специальными символами может быть сложной.
Попробуйте вывести значение в текстовый файл, а затем создать секрет, используя параметр --file вместо --value.
Что-то вроде этого (не проверялось):
$secretFile = "$(Agent.TempDirectory)/secret.txt"
# other commands here
($result | ConvertFrom-Json).value | Out-File $secretFile -NoNewline
az keyvault secret set --vault-name $keyVaultName --name "Name" --file $secretFile --output none
# files in $(Agent.TempDirectory) are automatically deleted after the pipeline finishes,
# but better be safe than sorry
Remove-Item $secretFile -Force
При создании текстового файла может потребоваться указать кодировку - например. utf8 или utf8NoBOM:
($result | ConvertFrom-Json).value | Out-File $secretFile -NoNewline -Encoding utf8NoBOM
И/или установка секрета:
az keyvault secret set --vault-name $keyVaultName --name "Name" --file $secretFile --encoding utf-8 --output none
Используете ли вы конвейеры Azure DevOps? $(Agent.TempDirectory) — это предопределенная переменная, не понимаю, почему она не распознается. Не забудьте использовать синтаксис $(myvariable).
Что именно вы подразумеваете под adding the secretFile as file to the key vault? Вы используете опцию --file, верно? Давайте сделаем шаг за шагом — может быть, еще раз проверим, имеет ли файл правильное значение?
@DJanssen добавил больше подробностей. Попробуйте указать кодировку.
Привет, @Rui, еще раз спасибо за ответ. Я использую конвейеры Azure DevOps. Когда я использовал $secretFile = "$(Agent.TempDirectory)/secret.txt" именно так, как вы упомянули, я получил следующий результат: snipboard.io/0RNxgf.jpg Я использовал следующую команду, чтобы сохранить его в ключе vault: az keyvault secret set --vault-name $keyVaultName --name "Name" --file $secretFile --output none Это привело к следующей ошибке на изображении. Затем я изменил его на $secretFile = [System.IO.Path]::Combine($env:AGENT_TEMPDIRECTORY, "secret.txt") и в результате получил значение u000t..
Кстати, я использую классический редактор конвейеров и шаг Azure CLI для запуска сценария Powershell после развертывания ресурсов Azure и т. д. snipboard.io/SQ9xrG.jpg
@DJanssen попробуйте указать кодировку. Смотрите мое редактирование.
Спасибо за редактирование, у нас были некоторые проблемы с конвейером, поэтому потребовалось время, чтобы его протестировать. Кажется, мы очень близки! Итак, следуя свойству -encoding utf8, мы видим правильный URL-адрес. Однако вначале мы видим эти символы:  Итак, значение, которое мы извлекаем из хранилища ключей:  X.appserviceenvironment.net:443/api/workflowname/triggers/… Если бы мы только могли избавиться из этих  персонажей нам пора идти :) Что бы вы посоветовали?
Уродливым решением было бы запустить другую команду, которая фактически вырезала бы первые три символа секрета. Не уверен, что это вообще возможно, но я думаю, это может сработать
@DJanssen при создании текстового файла попробуйте utf8NoBOM вместо utf8
это дает мне следующую ошибку в конвейере: snipboard.io/DSQLXT.jpg Вот как это выглядит в коде: snipboard.io/zKhasV.jpg
Какую версию Powershell вы используете? Начиная с версии 6, powershell поддерживает кодировку UTF8NoBOM.
См. также обходной путь stackoverflow.com/a/5596984/558486.
у нас версия 5.1.... кажется. Так что нужно найти способ обновить его до 7.0. Тогда попробую utf8NoBOM, спасибо!
@DJanssen, а пока попробуй обходной путь, о котором я упоминал.
Привет, просто хотел сообщить вам, что нам удалось обновить Powershell, и теперь значение рабочего процесса прекрасно сохраняется в хранилище ключей благодаря кодировке NoBom. Большое спасибо за вашу помощь! Ваше здоровье!
@DJanssen рад узнать, что все работает нормально. К вашему сведению, вам даже не нужно указывать параметр -Encoding в самых последних версиях Powershell — его значение по умолчанию — utf8NoBOM.
Замените имя хранилища ключей на свое собственное, на моей стороне работает приведенный ниже скрипт:
$value = "https://wbtest.appserviceenvironment.net:443/api/NameWorkFlow/triggers/When_a_HTTP_request_is_received/invoke?api-version=2022-05-01&sp=%2Ftriggers%2FWhen_a_HTTP_request_is_received%2Frun&sv=1.0&sig=sigvaluehiddenhere"
$secret = ConvertTo-SecureString -String $value -AsPlainText -Force
Set-AzKeyVaultSecret -VaultName 'wbtestkv' -Name 'wbtestSecret2' -SecretValue $secret
Get-AzKeyVaultSecret -VaultName 'wbtestkv' -Name 'wbtestSecret2' -AsPlainText
Привет, спасибо за ответ! Я протестировал ваш код, но вот мой результат: В хранилище ключей отображается значение: System.Security.SecureString. Когда мой коллега вызывает это значение в рабочем процессе приложения логики с помощью соединителя хранилища ключей, результатом также является System.Security.SecureString. . Я делаю что-то неправильно?
Я использую задачу Azure CLI для запуска сценария, и он работает нормально. URL-адрес рабочего процесса может быть установлен как секрет в Key Vault, как и ожидалось.
Ниже приведен мой образец в качестве ссылки:
# azure-pipelines.yml
# Replace the variable values with your actual values.
variables:
armConnection: 'ARM-Service-Connection-Name'
subscriptionId: 'Azure-Subscription-Id'
resourceGroupName: 'Resource-Group-Name'
logicAppName: 'BriRanLA'
workflowName: 'testWorkflow'
keyVaultName: 'BriRanKV'
secretName: 'workflowURL'
steps:
- checkout: none
- task: AzureCLI@2
displayName: 'Set Secret'
inputs:
azureSubscription: '$(armConnection)'
scriptType: 'pscore'
scriptLocation: 'inlineScript'
inlineScript: |
$reqUri = "https://management.azure.com/subscriptions/$(subscriptionId)/resourceGroups/$(resourceGroupName)/providers/Microsoft.Web/sites/$(logicAppName)/hostruntime/runtime/webhooks/workflow/api/management/workflows/$(workflowName)/triggers/When_a_HTTP_request_is_received/listCallbackUrl?api-version=2018-11-01"
$workflowDetails = az rest --method post --uri $reqUri
$urlResult = ($workflowDetails | ConvertFrom-Json).value
az keyvault secret set --vault-name $(keyVaultName) --name $(secretName) --value $urlResult
Интересный! Возможно, у него не возникнет проблем при запуске его как InlineScript вместо указания пути. Я запомню это для будущих мероприятий!
@DJanssen, вы пробовали использовать пример, приведенный выше в моем ответе? И может ли это сработать для вас?
Эй, спасибо за комментарий. Я последовал вашему совету, и мне пришлось внести следующие изменения, поскольку Agent.TempDirectory выдал нераспознанную ошибку в конвейере. Я использую: $secretFile = [System.IO.Path]::Combine($env:AGENT_TEMPDIRECTORY, "secret.txt") и добавляю secretFile как файл в хранилище ключей. Однако, когда мы пытаемся получить значение, мы получаем следующее: ÿþh\u0000t\u0000t\u0000p\u0000s\u0000:\u0000/\u0000/\u0000l\u0000a\u0000p\u0000-\u0000t\u0000- \u0000o\u0000\u0000a\u0000r\u0000.\u0000a\u0000s\u0000e\u0000-\u0000t\u0000-\u000....... Я что-то упустил?