From 898b2cdba69d9a3ad5e70146975e24a5074a9cec Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Mon, 11 May 2026 13:52:34 +0200 Subject: [PATCH 01/25] AzurePowerShellV2: sanitize ScriptArguments via Common/Sanitizer MSRC 115118 / ICM 31000000596029. Mirrors the PowerShellV2 retrofit from PR #18744 / #19183. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/AzurePowerShellV2/AzurePowerShell.ps1 | 33 +++++++++++++++++++ .../resources.resjson/de-DE/resources.resjson | 3 +- .../resources.resjson/en-US/resources.resjson | 3 +- .../resources.resjson/es-ES/resources.resjson | 3 +- .../resources.resjson/fr-FR/resources.resjson | 3 +- .../resources.resjson/it-IT/resources.resjson | 3 +- .../resources.resjson/ja-JP/resources.resjson | 3 +- .../resources.resjson/ko-KR/resources.resjson | 3 +- .../resources.resjson/ru-RU/resources.resjson | 3 +- .../resources.resjson/zh-CN/resources.resjson | 3 +- .../resources.resjson/zh-TW/resources.resjson | 3 +- Tasks/AzurePowerShellV2/make.json | 4 +++ Tasks/AzurePowerShellV2/task.json | 2 +- Tasks/AzurePowerShellV2/task.loc.json | 7 ++-- 14 files changed, 62 insertions(+), 14 deletions(-) diff --git a/Tasks/AzurePowerShellV2/AzurePowerShell.ps1 b/Tasks/AzurePowerShellV2/AzurePowerShell.ps1 index 87f453145c53..1cc2996ee9da 100644 --- a/Tasks/AzurePowerShellV2/AzurePowerShell.ps1 +++ b/Tasks/AzurePowerShellV2/AzurePowerShell.ps1 @@ -1,6 +1,15 @@ Trace-VstsEnteringInvocation $MyInvocation Import-VstsLocStrings "$PSScriptRoot\Task.json" +Import-Module $PSScriptRoot\ps_modules\Sanitizer + +function Publish-Telemetry($telemetry) { + $area = 'TaskHub' + $feature = 'AzurePowerShellV2' + $telemetryJson = $telemetry | ConvertTo-Json -Compress + Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" +} + # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -21,6 +30,30 @@ if ($scriptArguments -match '[\r\n]') { throw (Get-VstsLocString -Key InvalidScriptArguments0 -ArgumentList $scriptArguments) } +# Sanitize script arguments to prevent PowerShell command injection. +# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all +# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so +# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the +# matching pattern in Tasks/PowerShellV2/powershell.ps1. +if ($scriptType -ne "InlineScript") { + try { + $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV2" + } + catch { + $message = $_.Exception.Message + + if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { + throw $message; + } + + $telemetry = @{ + 'UnexpectedError' = $message + 'ErrorStackTrace' = $_.Exception.StackTrace + } + Publish-Telemetry $telemetry + } +} + # string constants $otherVersion = "OtherVersion" $latestVersion = "LatestVersion" diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/de-DE/resources.resjson index a29bb239b45e..83f6bb8fd895 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/de-DE/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/de-DE/resources.resjson @@ -23,5 +23,6 @@ "loc.messages.InvalidScriptArguments0": "Ungültige Skriptargumente \"{0}\". Zeilenumbrüche sind unzulässig.", "loc.messages.InvalidScriptPath0": "Ungültiger Skriptpfad \"{0}\". Es wurden ungültige Pfadzeichen angegeben.", "loc.messages.InvalidAzurePsVersion": "Die angegebene Azure PowerShell-Version \"{0}\" weist nicht das richtige Format auf. Überprüfen Sie das Format. Ein Beispiel für das richtige Format ist etwa 1.0.1.", - "loc.messages.OverrideAzurePowerShellVersion": "Die Azure PowerShell-Version {0} wird für den gehosteten Agent nicht unterstützt. Überschreiben Sie die Version mit Version {1}. Erwägen Sie eine Änderung der ausgewählten Version." + "loc.messages.OverrideAzurePowerShellVersion": "Die Azure PowerShell-Version {0} wird für den gehosteten Agent nicht unterstützt. Überschreiben Sie die Version mit Version {1}. Erwägen Sie eine Änderung der ausgewählten Version.", + "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/en-US/resources.resjson index 3b35b215561a..65522609e5a1 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/en-US/resources.resjson @@ -23,5 +23,6 @@ "loc.messages.InvalidScriptArguments0": "Invalid script arguments '{0}'. Line breaks are not allowed.", "loc.messages.InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified.", "loc.messages.InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected." + "loc.messages.OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected.", + "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/es-ES/resources.resjson index e1f00725aa04..335870d8753f 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/es-ES/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/es-ES/resources.resjson @@ -23,5 +23,6 @@ "loc.messages.InvalidScriptArguments0": "Argumentos de script '{0}' no válidos. No se permiten los saltos de línea.", "loc.messages.InvalidScriptPath0": "Ruta del script '{0}' no válida. Los caracteres de ruta de acceso especificados no son válidos.", "loc.messages.InvalidAzurePsVersion": "La versión de Azure PowerShell \"{0}\" especificada no tiene el formato correcto. Compruebe el formato. Ejemplo de formato correcto: 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "La versión \"{0}\" de Azure PowerShell no se admite para el agente hospedado. Reemplácela por la versión \"{1}\". Considere la posibilidad de cambiar la versión seleccionada." + "loc.messages.OverrideAzurePowerShellVersion": "La versión \"{0}\" de Azure PowerShell no se admite para el agente hospedado. Reemplácela por la versión \"{1}\". Considere la posibilidad de cambiar la versión seleccionada.", + "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/fr-FR/resources.resjson index 84c994440a71..6df1cb0502bf 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/fr-FR/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/fr-FR/resources.resjson @@ -23,5 +23,6 @@ "loc.messages.InvalidScriptArguments0": "Arguments de script '{0}' non valides. Les sauts de ligne ne sont pas autorisés.", "loc.messages.InvalidScriptPath0": "Chemin de script '{0}' non valide. Caractères non valides spécifiés dans le chemin.", "loc.messages.InvalidAzurePsVersion": "La version '{0}' spécifiée pour Azure PowerShell n'est pas au format approprié. Vérifiez le format. Exemple de format correct : 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell '{0}' n'est pas une version prise en charge pour l'agent hébergé. Remplacement par la version '{1}'. Changez la version sélectionnée." + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell '{0}' n'est pas une version prise en charge pour l'agent hébergé. Remplacement par la version '{1}'. Changez la version sélectionnée.", + "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/it-IT/resources.resjson index b161f3acc527..4a620097983a 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/it-IT/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/it-IT/resources.resjson @@ -23,5 +23,6 @@ "loc.messages.InvalidScriptArguments0": "Gli argomenti '{0}' dello script non sono validi. Le interruzioni di riga non sono consentite.", "loc.messages.InvalidScriptPath0": "Il percorso '{0}' dello script non è valido. Sono stati specificati caratteri non validi.", "loc.messages.InvalidAzurePsVersion": "Il formato della versione di Azure PowerShell '{0}' specificata non è corretto. Controllare il formato. Un esempio di formato corretto è 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "La versione '{0}' di Azure PowerShell non è supportata per l'agente ospitato e verrà sostituita con la versione '{1}'. Provare a cambiare la versione selezionata." + "loc.messages.OverrideAzurePowerShellVersion": "La versione '{0}' di Azure PowerShell non è supportata per l'agente ospitato e verrà sostituita con la versione '{1}'. Provare a cambiare la versione selezionata.", + "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/ja-JP/resources.resjson index f10cda098934..600e531a6e1a 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/ja-JP/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/ja-JP/resources.resjson @@ -23,5 +23,6 @@ "loc.messages.InvalidScriptArguments0": "スクリプトの引数 '{0}' が無効です。改行は使用できません。", "loc.messages.InvalidScriptPath0": "スクリプト パス '{0}' が無効です。無効なパス文字が指定されました。", "loc.messages.InvalidAzurePsVersion": "指定した Azure PowerShell バージョン '{0}' は、形式が正しくありません。形式をご確認ください。正しい形式の例は、1.0.1 です", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell バージョン '{0}' はホストされたエージェントではサポートされていません。バージョン '{1}' でオーバーライドされます。選択したバージョンを変更することをご検討ください。" + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell バージョン '{0}' はホストされたエージェントではサポートされていません。バージョン '{1}' でオーバーライドされます。選択したバージョンを変更することをご検討ください。", + "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/ko-KR/resources.resjson index 01d53629918f..5f1400e1978f 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/ko-KR/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/ko-KR/resources.resjson @@ -23,5 +23,6 @@ "loc.messages.InvalidScriptArguments0": "스크립트 인수 '{0}'이(가) 잘못되었습니다. 줄 바꿈은 허용되지 않습니다.", "loc.messages.InvalidScriptPath0": "스크립트 경로 '{0}'이(가) 잘못되었습니다. 잘못된 경로 문자를 지정했습니다.", "loc.messages.InvalidAzurePsVersion": "지정한 Azure PowerShell 버전 '{0}'의 형식이 잘못되었습니다. 형식을 확인하세요. 올바른 형식의 예는 1.0.1입니다.", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 버전 '{0}'은(는) 호스트된 에이전트에 사용할 수 없습니다. '{1}' 버전으로 재정의하세요. 선택한 버전을 변경하는 것이 좋습니다." + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 버전 '{0}'은(는) 호스트된 에이전트에 사용할 수 없습니다. '{1}' 버전으로 재정의하세요. 선택한 버전을 변경하는 것이 좋습니다.", + "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/ru-RU/resources.resjson index 281a68db04ea..c34e07e63400 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/ru-RU/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/ru-RU/resources.resjson @@ -23,5 +23,6 @@ "loc.messages.InvalidScriptArguments0": "Недопустимые аргументы скрипта \"{0}\". Разрывы строк запрещены.", "loc.messages.InvalidScriptPath0": "Недопустимый путь к скрипту \"{0}\". Указаны символы, недопустимые в пути.", "loc.messages.InvalidAzurePsVersion": "Указанная версия Azure PowerShell \"{0}\" имеет неправильный формат. Проверьте формат. Пример правильного формата: 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "Версия Azure PowerShell \"{0}\" не поддерживается для размещенного агента. Она будет заменена на версию \"{1}\". Попробуйте изменить выбранную версию." + "loc.messages.OverrideAzurePowerShellVersion": "Версия Azure PowerShell \"{0}\" не поддерживается для размещенного агента. Она будет заменена на версию \"{1}\". Попробуйте изменить выбранную версию.", + "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-CN/resources.resjson index 9e6012aca2e8..fbf99d055880 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-CN/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-CN/resources.resjson @@ -23,5 +23,6 @@ "loc.messages.InvalidScriptArguments0": "脚本参数“{0}”无效。不允许换行。", "loc.messages.InvalidScriptPath0": "脚本路径“{0}”无效。指定的路径字符无效。", "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本“{0}”格式不正确。请检查格式。正确格式的示例为 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 版本“{0}”不受托管代理支持。将其替代为版本“{1}”。请考虑更改选定的版本。" + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 版本“{0}”不受托管代理支持。将其替代为版本“{1}”。请考虑更改选定的版本。", + "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-TW/resources.resjson index a99b0642e6b9..28b329ed5240 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-TW/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-TW/resources.resjson @@ -23,5 +23,6 @@ "loc.messages.InvalidScriptArguments0": "指令碼引數 '{0}' 無效。不允許分行符號。", "loc.messages.InvalidScriptPath0": "指令碼路徑 '{0}' 無效。指定的路徑字元無效。", "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本 '{0}' 格式不正確。請檢查格式。正確格式的範例為 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "裝載的代理程式不支援 Azure PowerShell '{0}' 版。正在以 '{1}' 版予以覆寫。請考慮變更選取的版本。" + "loc.messages.OverrideAzurePowerShellVersion": "裝載的代理程式不支援 Azure PowerShell '{0}' 版。正在以 '{1}' 版予以覆寫。請考慮變更選取的版本。", + "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/make.json b/Tasks/AzurePowerShellV2/make.json index 5daffb0e0dbd..dc9edfeec8c9 100644 --- a/Tasks/AzurePowerShellV2/make.json +++ b/Tasks/AzurePowerShellV2/make.json @@ -7,6 +7,10 @@ { "module": "../Common/TlsHelper_", "type": "ps" + }, + { + "module": "../Common/Sanitizer", + "type": "ps" } ], "externals": { diff --git a/Tasks/AzurePowerShellV2/task.json b/Tasks/AzurePowerShellV2/task.json index 7d358fa4764d..00bfda70aacf 100644 --- a/Tasks/AzurePowerShellV2/task.json +++ b/Tasks/AzurePowerShellV2/task.json @@ -18,7 +18,7 @@ "version": { "Major": 2, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "demands": [ "azureps" diff --git a/Tasks/AzurePowerShellV2/task.loc.json b/Tasks/AzurePowerShellV2/task.loc.json index 80a3c0aaea65..4dc2a0b8a0fc 100644 --- a/Tasks/AzurePowerShellV2/task.loc.json +++ b/Tasks/AzurePowerShellV2/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 2, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "demands": [ "azureps" @@ -150,6 +150,7 @@ "InvalidScriptArguments0": "ms-resource:loc.messages.InvalidScriptArguments0", "InvalidScriptPath0": "ms-resource:loc.messages.InvalidScriptPath0", "InvalidAzurePsVersion": "ms-resource:loc.messages.InvalidAzurePsVersion", - "OverrideAzurePowerShellVersion": "ms-resource:loc.messages.OverrideAzurePowerShellVersion" + "OverrideAzurePowerShellVersion": "ms-resource:loc.messages.OverrideAzurePowerShellVersion", + "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" } -} \ No newline at end of file +} From 08eee433664dfe5e0a137aee172ca3822584e50b Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Mon, 11 May 2026 13:52:34 +0200 Subject: [PATCH 02/25] AzurePowerShellV3: sanitize ScriptArguments via Common/Sanitizer MSRC 115118 / ICM 31000000596029. Mirrors the PowerShellV2 retrofit from PR #18744 / #19183. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/AzurePowerShellV3/AzurePowerShell.ps1 | 33 +++++++++++++++++++ .../resources.resjson/de-DE/resources.resjson | 3 +- .../resources.resjson/en-US/resources.resjson | 3 +- .../resources.resjson/es-ES/resources.resjson | 3 +- .../resources.resjson/fr-FR/resources.resjson | 3 +- .../resources.resjson/it-IT/resources.resjson | 3 +- .../resources.resjson/ja-JP/resources.resjson | 3 +- .../resources.resjson/ko-KR/resources.resjson | 3 +- .../resources.resjson/ru-RU/resources.resjson | 3 +- .../resources.resjson/zh-CN/resources.resjson | 3 +- .../resources.resjson/zh-TW/resources.resjson | 3 +- Tasks/AzurePowerShellV3/make.json | 4 +++ Tasks/AzurePowerShellV3/task.json | 2 +- Tasks/AzurePowerShellV3/task.loc.json | 7 ++-- 14 files changed, 62 insertions(+), 14 deletions(-) diff --git a/Tasks/AzurePowerShellV3/AzurePowerShell.ps1 b/Tasks/AzurePowerShellV3/AzurePowerShell.ps1 index c2bd71c867aa..95b3c69173a1 100644 --- a/Tasks/AzurePowerShellV3/AzurePowerShell.ps1 +++ b/Tasks/AzurePowerShellV3/AzurePowerShell.ps1 @@ -1,6 +1,15 @@ Trace-VstsEnteringInvocation $MyInvocation Import-VstsLocStrings "$PSScriptRoot\Task.json" +Import-Module $PSScriptRoot\ps_modules\Sanitizer + +function Publish-Telemetry($telemetry) { + $area = 'TaskHub' + $feature = 'AzurePowerShellV3' + $telemetryJson = $telemetry | ConvertTo-Json -Compress + Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" +} + # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -25,6 +34,30 @@ if ($scriptArguments -match '[\r\n]') { throw (Get-VstsLocString -Key InvalidScriptArguments0 -ArgumentList $scriptArguments) } +# Sanitize script arguments to prevent PowerShell command injection. +# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all +# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so +# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the +# matching pattern in Tasks/PowerShellV2/powershell.ps1. +if ($scriptType -ne "InlineScript") { + try { + $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV3" + } + catch { + $message = $_.Exception.Message + + if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { + throw $message; + } + + $telemetry = @{ + 'UnexpectedError' = $message + 'ErrorStackTrace' = $_.Exception.StackTrace + } + Publish-Telemetry $telemetry + } +} + # string constants $otherVersion = "OtherVersion" $latestVersion = "LatestVersion" diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/de-DE/resources.resjson index a6ae7e3f5d6f..7fb732466642 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/de-DE/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/de-DE/resources.resjson @@ -32,5 +32,6 @@ "loc.messages.InvalidScriptArguments0": "Ungültige Skriptargumente \"{0}\". Zeilenumbrüche sind unzulässig.", "loc.messages.InvalidScriptPath0": "Ungültiger Skriptpfad \"{0}\". Es wurden ungültige Pfadzeichen angegeben.", "loc.messages.InvalidAzurePsVersion": "Die angegebene Azure PowerShell-Version \"{0}\" weist nicht das richtige Format auf. Überprüfen Sie das Format. Ein Beispiel für das richtige Format ist etwa 1.0.1.", - "loc.messages.OverrideAzurePowerShellVersion": "Die Azure PowerShell-Version {0} wird für den gehosteten Agent nicht unterstützt. Überschreiben Sie die Version mit Version {1}. Erwägen Sie eine Änderung der ausgewählten Version." + "loc.messages.OverrideAzurePowerShellVersion": "Die Azure PowerShell-Version {0} wird für den gehosteten Agent nicht unterstützt. Überschreiben Sie die Version mit Version {1}. Erwägen Sie eine Änderung der ausgewählten Version.", + "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/en-US/resources.resjson index 882f573851e3..39997dbe971e 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/en-US/resources.resjson @@ -32,5 +32,6 @@ "loc.messages.InvalidScriptArguments0": "Invalid script arguments '{0}'. Line breaks are not allowed.", "loc.messages.InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified.", "loc.messages.InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected." + "loc.messages.OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected.", + "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/es-ES/resources.resjson index b650a45b02ae..93e056ef9ce7 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/es-ES/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/es-ES/resources.resjson @@ -32,5 +32,6 @@ "loc.messages.InvalidScriptArguments0": "Argumentos de script '{0}' no válidos. No se permiten los saltos de línea.", "loc.messages.InvalidScriptPath0": "Ruta del script '{0}' no válida. Los caracteres de ruta de acceso especificados no son válidos.", "loc.messages.InvalidAzurePsVersion": "La versión de Azure PowerShell \"{0}\" especificada no tiene el formato correcto. Compruebe el formato. Ejemplo de formato correcto: 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "La versión \"{0}\" de Azure PowerShell no se admite para el agente hospedado. Reemplácela por la versión \"{1}\". Considere la posibilidad de cambiar la versión seleccionada." + "loc.messages.OverrideAzurePowerShellVersion": "La versión \"{0}\" de Azure PowerShell no se admite para el agente hospedado. Reemplácela por la versión \"{1}\". Considere la posibilidad de cambiar la versión seleccionada.", + "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/fr-FR/resources.resjson index caa770170c8b..6fb17b5d88c4 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/fr-FR/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/fr-FR/resources.resjson @@ -32,5 +32,6 @@ "loc.messages.InvalidScriptArguments0": "Arguments de script '{0}' non valides. Les sauts de ligne ne sont pas autorisés.", "loc.messages.InvalidScriptPath0": "Chemin de script '{0}' non valide. Caractères non valides spécifiés dans le chemin.", "loc.messages.InvalidAzurePsVersion": "La version '{0}' spécifiée pour Azure PowerShell n'est pas au format approprié. Vérifiez le format. Exemple de format correct : 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell '{0}' n'est pas une version prise en charge pour l'agent hébergé. Remplacement par la version '{1}'. Changez la version sélectionnée." + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell '{0}' n'est pas une version prise en charge pour l'agent hébergé. Remplacement par la version '{1}'. Changez la version sélectionnée.", + "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/it-IT/resources.resjson index 9cdf8d5daecc..44cd7e9be06f 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/it-IT/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/it-IT/resources.resjson @@ -32,5 +32,6 @@ "loc.messages.InvalidScriptArguments0": "Gli argomenti '{0}' dello script non sono validi. Le interruzioni di riga non sono consentite.", "loc.messages.InvalidScriptPath0": "Il percorso '{0}' dello script non è valido. Sono stati specificati caratteri non validi.", "loc.messages.InvalidAzurePsVersion": "Il formato della versione di Azure PowerShell '{0}' specificata non è corretto. Controllare il formato. Un esempio di formato corretto è 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "La versione '{0}' di Azure PowerShell non è supportata per l'agente ospitato e verrà sostituita con la versione '{1}'. Provare a cambiare la versione selezionata." + "loc.messages.OverrideAzurePowerShellVersion": "La versione '{0}' di Azure PowerShell non è supportata per l'agente ospitato e verrà sostituita con la versione '{1}'. Provare a cambiare la versione selezionata.", + "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/ja-JP/resources.resjson index 734ec125b739..ce811de15f69 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/ja-JP/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/ja-JP/resources.resjson @@ -32,5 +32,6 @@ "loc.messages.InvalidScriptArguments0": "スクリプトの引数 '{0}' が無効です。改行は使用できません。", "loc.messages.InvalidScriptPath0": "スクリプト パス '{0}' が無効です。無効なパス文字が指定されました。", "loc.messages.InvalidAzurePsVersion": "指定した Azure PowerShell バージョン '{0}' は、形式が正しくありません。形式をご確認ください。正しい形式の例は、1.0.1 です", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell バージョン '{0}' はホストされたエージェントではサポートされていません。バージョン '{1}' でオーバーライドされます。選択したバージョンを変更することをご検討ください。" + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell バージョン '{0}' はホストされたエージェントではサポートされていません。バージョン '{1}' でオーバーライドされます。選択したバージョンを変更することをご検討ください。", + "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/ko-KR/resources.resjson index 85352bb58972..9a945c9e8147 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/ko-KR/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/ko-KR/resources.resjson @@ -32,5 +32,6 @@ "loc.messages.InvalidScriptArguments0": "스크립트 인수 '{0}'이(가) 잘못되었습니다. 줄 바꿈은 허용되지 않습니다.", "loc.messages.InvalidScriptPath0": "스크립트 경로 '{0}'이(가) 잘못되었습니다. 잘못된 경로 문자를 지정했습니다.", "loc.messages.InvalidAzurePsVersion": "지정한 Azure PowerShell 버전 '{0}'의 형식이 잘못되었습니다. 형식을 확인하세요. 올바른 형식의 예는 1.0.1입니다.", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 버전 '{0}'은(는) 호스트된 에이전트에 사용할 수 없습니다. '{1}' 버전으로 재정의하세요. 선택한 버전을 변경하는 것이 좋습니다." + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 버전 '{0}'은(는) 호스트된 에이전트에 사용할 수 없습니다. '{1}' 버전으로 재정의하세요. 선택한 버전을 변경하는 것이 좋습니다.", + "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/ru-RU/resources.resjson index 2d440b3058fd..35970ecea2c4 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/ru-RU/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/ru-RU/resources.resjson @@ -32,5 +32,6 @@ "loc.messages.InvalidScriptArguments0": "Недопустимые аргументы скрипта \"{0}\". Разрывы строк запрещены.", "loc.messages.InvalidScriptPath0": "Недопустимый путь к скрипту \"{0}\". Указаны символы, недопустимые в пути.", "loc.messages.InvalidAzurePsVersion": "Указанная версия Azure PowerShell \"{0}\" имеет неправильный формат. Проверьте формат. Пример правильного формата: 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "Версия Azure PowerShell \"{0}\" не поддерживается для размещенного агента. Она будет заменена на версию \"{1}\". Попробуйте изменить выбранную версию." + "loc.messages.OverrideAzurePowerShellVersion": "Версия Azure PowerShell \"{0}\" не поддерживается для размещенного агента. Она будет заменена на версию \"{1}\". Попробуйте изменить выбранную версию.", + "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-CN/resources.resjson index 89766a0a4118..63f12a4270e2 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-CN/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-CN/resources.resjson @@ -32,5 +32,6 @@ "loc.messages.InvalidScriptArguments0": "脚本参数“{0}”无效。不允许换行。", "loc.messages.InvalidScriptPath0": "脚本路径“{0}”无效。指定的路径字符无效。", "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本“{0}”格式不正确。请检查格式。正确格式的示例为 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 版本“{0}”不受托管代理支持。将其替代为版本“{1}”。请考虑更改选定的版本。" + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 版本“{0}”不受托管代理支持。将其替代为版本“{1}”。请考虑更改选定的版本。", + "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-TW/resources.resjson index fd1f026f6997..ef5a2b1cce8e 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-TW/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-TW/resources.resjson @@ -32,5 +32,6 @@ "loc.messages.InvalidScriptArguments0": "指令碼引數 '{0}' 無效。不允許分行符號。", "loc.messages.InvalidScriptPath0": "指令碼路徑 '{0}' 無效。指定的路徑字元無效。", "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本 '{0}' 格式不正確。請檢查格式。正確格式的範例為 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "裝載的代理程式不支援 Azure PowerShell '{0}' 版。正在以 '{1}' 版予以覆寫。請考慮變更選取的版本。" + "loc.messages.OverrideAzurePowerShellVersion": "裝載的代理程式不支援 Azure PowerShell '{0}' 版。正在以 '{1}' 版予以覆寫。請考慮變更選取的版本。", + "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/make.json b/Tasks/AzurePowerShellV3/make.json index 5daffb0e0dbd..dc9edfeec8c9 100644 --- a/Tasks/AzurePowerShellV3/make.json +++ b/Tasks/AzurePowerShellV3/make.json @@ -7,6 +7,10 @@ { "module": "../Common/TlsHelper_", "type": "ps" + }, + { + "module": "../Common/Sanitizer", + "type": "ps" } ], "externals": { diff --git a/Tasks/AzurePowerShellV3/task.json b/Tasks/AzurePowerShellV3/task.json index ab1742b4966e..ba60dd21668a 100644 --- a/Tasks/AzurePowerShellV3/task.json +++ b/Tasks/AzurePowerShellV3/task.json @@ -18,7 +18,7 @@ "version": { "Major": 3, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "releaseNotes": "Added support for Fail on standard error and ErrorActionPreference", "demands": [ diff --git a/Tasks/AzurePowerShellV3/task.loc.json b/Tasks/AzurePowerShellV3/task.loc.json index c243156f13cc..7a721259b53c 100644 --- a/Tasks/AzurePowerShellV3/task.loc.json +++ b/Tasks/AzurePowerShellV3/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 3, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "releaseNotes": "ms-resource:loc.releaseNotes", "demands": [ @@ -200,6 +200,7 @@ "InvalidScriptArguments0": "ms-resource:loc.messages.InvalidScriptArguments0", "InvalidScriptPath0": "ms-resource:loc.messages.InvalidScriptPath0", "InvalidAzurePsVersion": "ms-resource:loc.messages.InvalidAzurePsVersion", - "OverrideAzurePowerShellVersion": "ms-resource:loc.messages.OverrideAzurePowerShellVersion" + "OverrideAzurePowerShellVersion": "ms-resource:loc.messages.OverrideAzurePowerShellVersion", + "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" } -} \ No newline at end of file +} From ee12bf3bbe2e2d6de112ef600eec4285ded3fca1 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Mon, 11 May 2026 13:52:34 +0200 Subject: [PATCH 03/25] AzurePowerShellV4: sanitize ScriptArguments via Common/Sanitizer MSRC 115118 / ICM 31000000596029. Mirrors the PowerShellV2 retrofit from PR #18744 / #19183. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/AzurePowerShellV4/AzurePowerShell.ps1 | 33 +++++++++++++++++++ .../resources.resjson/de-DE/resources.resjson | 3 +- .../resources.resjson/en-US/resources.resjson | 3 +- .../resources.resjson/es-ES/resources.resjson | 3 +- .../resources.resjson/fr-FR/resources.resjson | 3 +- .../resources.resjson/it-IT/resources.resjson | 3 +- .../resources.resjson/ja-JP/resources.resjson | 3 +- .../resources.resjson/ko-KR/resources.resjson | 3 +- .../resources.resjson/ru-RU/resources.resjson | 3 +- .../resources.resjson/zh-CN/resources.resjson | 3 +- .../resources.resjson/zh-TW/resources.resjson | 3 +- Tasks/AzurePowerShellV4/make.json | 4 +++ Tasks/AzurePowerShellV4/task.json | 2 +- Tasks/AzurePowerShellV4/task.loc.json | 7 ++-- _generated/AzurePowerShellV4.versionmap.txt | 4 +-- .../AzurePowerShellV4/AzurePowerShell.ps1 | 33 +++++++++++++++++++ .../resources.resjson/de-DE/resources.resjson | 3 +- .../resources.resjson/en-US/resources.resjson | 3 +- .../resources.resjson/es-ES/resources.resjson | 3 +- .../resources.resjson/fr-FR/resources.resjson | 3 +- .../resources.resjson/it-IT/resources.resjson | 3 +- .../resources.resjson/ja-JP/resources.resjson | 3 +- .../resources.resjson/ko-KR/resources.resjson | 3 +- .../resources.resjson/ru-RU/resources.resjson | 3 +- .../resources.resjson/zh-CN/resources.resjson | 3 +- .../resources.resjson/zh-TW/resources.resjson | 3 +- _generated/AzurePowerShellV4/make.json | 4 +++ _generated/AzurePowerShellV4/task.json | 11 ++++--- _generated/AzurePowerShellV4/task.loc.json | 11 ++++--- .../AzurePowerShell.ps1 | 33 +++++++++++++++++++ .../resources.resjson/de-DE/resources.resjson | 3 +- .../resources.resjson/en-US/resources.resjson | 3 +- .../resources.resjson/es-ES/resources.resjson | 3 +- .../resources.resjson/fr-FR/resources.resjson | 3 +- .../resources.resjson/it-IT/resources.resjson | 3 +- .../resources.resjson/ja-JP/resources.resjson | 3 +- .../resources.resjson/ko-KR/resources.resjson | 3 +- .../resources.resjson/ru-RU/resources.resjson | 3 +- .../resources.resjson/zh-CN/resources.resjson | 3 +- .../resources.resjson/zh-TW/resources.resjson | 3 +- _generated/AzurePowerShellV4_Node24/make.json | 4 +++ _generated/AzurePowerShellV4_Node24/task.json | 11 ++++--- .../AzurePowerShellV4_Node24/task.loc.json | 11 ++++--- 43 files changed, 202 insertions(+), 56 deletions(-) diff --git a/Tasks/AzurePowerShellV4/AzurePowerShell.ps1 b/Tasks/AzurePowerShellV4/AzurePowerShell.ps1 index ea3d73c33c1b..992a95b35633 100644 --- a/Tasks/AzurePowerShellV4/AzurePowerShell.ps1 +++ b/Tasks/AzurePowerShellV4/AzurePowerShell.ps1 @@ -1,6 +1,15 @@ Trace-VstsEnteringInvocation $MyInvocation Import-VstsLocStrings "$PSScriptRoot\Task.json" +Import-Module $PSScriptRoot\ps_modules\Sanitizer + +function Publish-Telemetry($telemetry) { + $area = 'TaskHub' + $feature = 'AzurePowerShellV4' + $telemetryJson = $telemetry | ConvertTo-Json -Compress + Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" +} + # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -28,6 +37,30 @@ if ($scriptArguments -match '[\r\n]') { throw (Get-VstsLocString -Key InvalidScriptArguments0 -ArgumentList $scriptArguments) } +# Sanitize script arguments to prevent PowerShell command injection. +# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all +# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so +# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the +# matching pattern in Tasks/PowerShellV2/powershell.ps1. +if ($scriptType -ne "InlineScript") { + try { + $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV4" + } + catch { + $message = $_.Exception.Message + + if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { + throw $message; + } + + $telemetry = @{ + 'UnexpectedError' = $message + 'ErrorStackTrace' = $_.Exception.StackTrace + } + Publish-Telemetry $telemetry + } +} + # string constants $otherVersion = "OtherVersion" $latestVersion = "LatestVersion" diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson index 44d372e42cb4..259af9c5a85d 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "Die angegebene Azure PowerShell-Version \"{0}\" weist nicht das richtige Format auf. Überprüfen Sie das Format. Ein Beispiel für das richtige Format ist etwa 1.0.1.", "loc.messages.JS_ExitCode": "PowerShell wurde beendet mit dem Code \"%s\".", "loc.messages.JS_Stderr": "PowerShell hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", - "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist." + "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", + "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson index 5357601c22f5..f7d72639dfbe 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "loc.messages.JS_ExitCode": "PowerShell exited with code '%s'.", "loc.messages.JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." + "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson index 9f596d3fdf27..4598cf9b0f58 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "La versión de Azure PowerShell \"{0}\" especificada no tiene el formato correcto. Compruebe el formato. Ejemplo de formato correcto: 1.0.1", "loc.messages.JS_ExitCode": "PowerShell se cerró con el código \"%s\".", "loc.messages.JS_Stderr": "PowerShell escribió una o varias líneas en la secuencia de error estándar.", - "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado." + "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", + "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson index 85ffdca03de8..67ebbc0a8c81 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "La version '{0}' spécifiée pour Azure PowerShell n'est pas au format approprié. Vérifiez le format. Exemple de format correct : 1.0.1", "loc.messages.JS_ExitCode": "Arrêt de PowerShell. Code de sortie : '%s'.", "loc.messages.JS_Stderr": "PowerShell a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", - "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré." + "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", + "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson index de03075839b5..08667373fad7 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "Il formato della versione di Azure PowerShell '{0}' specificata non è corretto. Controllare il formato. Un esempio di formato corretto è 1.0.1", "loc.messages.JS_ExitCode": "PowerShell terminato con codice '%s'.", "loc.messages.JS_Stderr": "PowerShell ha scritto una o più righe nel flusso di errore standard.", - "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta." + "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", + "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson index 5f60ce4b7a81..85e75c29d6d6 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "指定した Azure PowerShell バージョン '{0}' は、形式が正しくありません。形式をご確認ください。正しい形式の例は、1.0.1 です", "loc.messages.JS_ExitCode": "PowerShell がコード '%s' で終了しました。", "loc.messages.JS_Stderr": "PowerShell が標準エラー ストリームに 1 行以上を書き込みました。", - "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。" + "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", + "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson index b00a1a1619c4..03505c625ad8 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "지정한 Azure PowerShell 버전 '{0}'의 형식이 잘못되었습니다. 형식을 확인하세요. 올바른 형식의 예는 1.0.1입니다.", "loc.messages.JS_ExitCode": "PowerShell이 코드 '%s'(으)로 종료되었습니다.", "loc.messages.JS_Stderr": "PowerShell이 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", - "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요." + "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", + "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson index c20a9b0fce5f..cd64f05a2457 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "Указанная версия Azure PowerShell \"{0}\" имеет неправильный формат. Проверьте формат. Пример правильного формата: 1.0.1", "loc.messages.JS_ExitCode": "Завершение работы PowerShell с кодом \"%s\".", "loc.messages.JS_Stderr": "Оболочка PowerShell записала одну или несколько строк в стандартный поток ошибок.", - "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек." + "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", + "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson index fe4a5eb3b960..136fb8907b47 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本“{0}”格式不正确。请检查格式。正确格式的示例为 1.0.1", "loc.messages.JS_ExitCode": "PowerShell 已退出,代码为“%s”。", "loc.messages.JS_Stderr": "PowerShell 向标准错误流写入一个或多个行。", - "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。" + "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", + "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson index 5b87db2dbbac..06c8ca132cca 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本 '{0}' 格式不正確。請檢查格式。正確格式的範例為 1.0.1", "loc.messages.JS_ExitCode": "PowerShell 已結束,代碼為 '%s'。", "loc.messages.JS_Stderr": "PowerShell 已將一或多行寫入標準錯誤資料流。", - "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。" + "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", + "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/make.json b/Tasks/AzurePowerShellV4/make.json index 66948f367d59..8608a0a8f001 100644 --- a/Tasks/AzurePowerShellV4/make.json +++ b/Tasks/AzurePowerShellV4/make.json @@ -19,6 +19,10 @@ { "module": "../Common/TlsHelper_", "type": "ps" + }, + { + "module": "../Common/Sanitizer", + "type": "ps" } ], "externals": { diff --git a/Tasks/AzurePowerShellV4/task.json b/Tasks/AzurePowerShellV4/task.json index ea5a7259e887..164d78fb76bb 100644 --- a/Tasks/AzurePowerShellV4/task.json +++ b/Tasks/AzurePowerShellV4/task.json @@ -18,7 +18,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 2 + "Patch": 4 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ diff --git a/Tasks/AzurePowerShellV4/task.loc.json b/Tasks/AzurePowerShellV4/task.loc.json index cc668f32a785..3ed8488933a6 100644 --- a/Tasks/AzurePowerShellV4/task.loc.json +++ b/Tasks/AzurePowerShellV4/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 2 + "Patch": 4 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ @@ -212,6 +212,7 @@ "InvalidAzurePsVersion": "ms-resource:loc.messages.InvalidAzurePsVersion", "JS_ExitCode": "ms-resource:loc.messages.JS_ExitCode", "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", - "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal" + "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", + "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" } -} \ No newline at end of file +} diff --git a/_generated/AzurePowerShellV4.versionmap.txt b/_generated/AzurePowerShellV4.versionmap.txt index 84e4b86f9148..3e1465cdc289 100644 --- a/_generated/AzurePowerShellV4.versionmap.txt +++ b/_generated/AzurePowerShellV4.versionmap.txt @@ -1,2 +1,2 @@ -Default|4.274.2 -Node24_1|4.274.3 +Default|4.274.4 +Node24_1|4.274.5 \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/AzurePowerShell.ps1 b/_generated/AzurePowerShellV4/AzurePowerShell.ps1 index ea3d73c33c1b..992a95b35633 100644 --- a/_generated/AzurePowerShellV4/AzurePowerShell.ps1 +++ b/_generated/AzurePowerShellV4/AzurePowerShell.ps1 @@ -1,6 +1,15 @@ Trace-VstsEnteringInvocation $MyInvocation Import-VstsLocStrings "$PSScriptRoot\Task.json" +Import-Module $PSScriptRoot\ps_modules\Sanitizer + +function Publish-Telemetry($telemetry) { + $area = 'TaskHub' + $feature = 'AzurePowerShellV4' + $telemetryJson = $telemetry | ConvertTo-Json -Compress + Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" +} + # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -28,6 +37,30 @@ if ($scriptArguments -match '[\r\n]') { throw (Get-VstsLocString -Key InvalidScriptArguments0 -ArgumentList $scriptArguments) } +# Sanitize script arguments to prevent PowerShell command injection. +# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all +# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so +# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the +# matching pattern in Tasks/PowerShellV2/powershell.ps1. +if ($scriptType -ne "InlineScript") { + try { + $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV4" + } + catch { + $message = $_.Exception.Message + + if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { + throw $message; + } + + $telemetry = @{ + 'UnexpectedError' = $message + 'ErrorStackTrace' = $_.Exception.StackTrace + } + Publish-Telemetry $telemetry + } +} + # string constants $otherVersion = "OtherVersion" $latestVersion = "LatestVersion" diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson index 44d372e42cb4..259af9c5a85d 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "Die angegebene Azure PowerShell-Version \"{0}\" weist nicht das richtige Format auf. Überprüfen Sie das Format. Ein Beispiel für das richtige Format ist etwa 1.0.1.", "loc.messages.JS_ExitCode": "PowerShell wurde beendet mit dem Code \"%s\".", "loc.messages.JS_Stderr": "PowerShell hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", - "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist." + "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", + "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson index 5357601c22f5..f7d72639dfbe 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "loc.messages.JS_ExitCode": "PowerShell exited with code '%s'.", "loc.messages.JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." + "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson index 9f596d3fdf27..4598cf9b0f58 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "La versión de Azure PowerShell \"{0}\" especificada no tiene el formato correcto. Compruebe el formato. Ejemplo de formato correcto: 1.0.1", "loc.messages.JS_ExitCode": "PowerShell se cerró con el código \"%s\".", "loc.messages.JS_Stderr": "PowerShell escribió una o varias líneas en la secuencia de error estándar.", - "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado." + "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", + "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson index 85ffdca03de8..67ebbc0a8c81 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "La version '{0}' spécifiée pour Azure PowerShell n'est pas au format approprié. Vérifiez le format. Exemple de format correct : 1.0.1", "loc.messages.JS_ExitCode": "Arrêt de PowerShell. Code de sortie : '%s'.", "loc.messages.JS_Stderr": "PowerShell a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", - "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré." + "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", + "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson index de03075839b5..08667373fad7 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "Il formato della versione di Azure PowerShell '{0}' specificata non è corretto. Controllare il formato. Un esempio di formato corretto è 1.0.1", "loc.messages.JS_ExitCode": "PowerShell terminato con codice '%s'.", "loc.messages.JS_Stderr": "PowerShell ha scritto una o più righe nel flusso di errore standard.", - "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta." + "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", + "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson index 5f60ce4b7a81..85e75c29d6d6 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "指定した Azure PowerShell バージョン '{0}' は、形式が正しくありません。形式をご確認ください。正しい形式の例は、1.0.1 です", "loc.messages.JS_ExitCode": "PowerShell がコード '%s' で終了しました。", "loc.messages.JS_Stderr": "PowerShell が標準エラー ストリームに 1 行以上を書き込みました。", - "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。" + "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", + "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson index b00a1a1619c4..03505c625ad8 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "지정한 Azure PowerShell 버전 '{0}'의 형식이 잘못되었습니다. 형식을 확인하세요. 올바른 형식의 예는 1.0.1입니다.", "loc.messages.JS_ExitCode": "PowerShell이 코드 '%s'(으)로 종료되었습니다.", "loc.messages.JS_Stderr": "PowerShell이 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", - "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요." + "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", + "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson index c20a9b0fce5f..cd64f05a2457 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "Указанная версия Azure PowerShell \"{0}\" имеет неправильный формат. Проверьте формат. Пример правильного формата: 1.0.1", "loc.messages.JS_ExitCode": "Завершение работы PowerShell с кодом \"%s\".", "loc.messages.JS_Stderr": "Оболочка PowerShell записала одну или несколько строк в стандартный поток ошибок.", - "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек." + "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", + "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson index fe4a5eb3b960..136fb8907b47 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本“{0}”格式不正确。请检查格式。正确格式的示例为 1.0.1", "loc.messages.JS_ExitCode": "PowerShell 已退出,代码为“%s”。", "loc.messages.JS_Stderr": "PowerShell 向标准错误流写入一个或多个行。", - "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。" + "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", + "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson index 5b87db2dbbac..06c8ca132cca 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本 '{0}' 格式不正確。請檢查格式。正確格式的範例為 1.0.1", "loc.messages.JS_ExitCode": "PowerShell 已結束,代碼為 '%s'。", "loc.messages.JS_Stderr": "PowerShell 已將一或多行寫入標準錯誤資料流。", - "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。" + "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", + "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/make.json b/_generated/AzurePowerShellV4/make.json index 66948f367d59..8608a0a8f001 100644 --- a/_generated/AzurePowerShellV4/make.json +++ b/_generated/AzurePowerShellV4/make.json @@ -19,6 +19,10 @@ { "module": "../Common/TlsHelper_", "type": "ps" + }, + { + "module": "../Common/Sanitizer", + "type": "ps" } ], "externals": { diff --git a/_generated/AzurePowerShellV4/task.json b/_generated/AzurePowerShellV4/task.json index 9a0f7bb6df7e..1f700a3e275b 100644 --- a/_generated/AzurePowerShellV4/task.json +++ b/_generated/AzurePowerShellV4/task.json @@ -18,7 +18,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 2 + "Patch": 4 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ @@ -212,11 +212,12 @@ "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "JS_ExitCode": "PowerShell exited with code '%s'.", "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" }, "_buildConfigMapping": { - "Default": "4.274.2", + "Default": "4.274.4", "LocalPackages": "4.249.4", - "Node24_1": "4.274.3" + "Node24_1": "4.274.5" } -} \ No newline at end of file +} diff --git a/_generated/AzurePowerShellV4/task.loc.json b/_generated/AzurePowerShellV4/task.loc.json index 1b2442d5e6ec..529abba3c19a 100644 --- a/_generated/AzurePowerShellV4/task.loc.json +++ b/_generated/AzurePowerShellV4/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 2 + "Patch": 4 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ @@ -212,11 +212,12 @@ "InvalidAzurePsVersion": "ms-resource:loc.messages.InvalidAzurePsVersion", "JS_ExitCode": "ms-resource:loc.messages.JS_ExitCode", "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", - "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal" + "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", + "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" }, "_buildConfigMapping": { - "Default": "4.274.2", + "Default": "4.274.4", "LocalPackages": "4.249.4", - "Node24_1": "4.274.3" + "Node24_1": "4.274.5" } -} \ No newline at end of file +} diff --git a/_generated/AzurePowerShellV4_Node24/AzurePowerShell.ps1 b/_generated/AzurePowerShellV4_Node24/AzurePowerShell.ps1 index ea3d73c33c1b..992a95b35633 100644 --- a/_generated/AzurePowerShellV4_Node24/AzurePowerShell.ps1 +++ b/_generated/AzurePowerShellV4_Node24/AzurePowerShell.ps1 @@ -1,6 +1,15 @@ Trace-VstsEnteringInvocation $MyInvocation Import-VstsLocStrings "$PSScriptRoot\Task.json" +Import-Module $PSScriptRoot\ps_modules\Sanitizer + +function Publish-Telemetry($telemetry) { + $area = 'TaskHub' + $feature = 'AzurePowerShellV4' + $telemetryJson = $telemetry | ConvertTo-Json -Compress + Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" +} + # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -28,6 +37,30 @@ if ($scriptArguments -match '[\r\n]') { throw (Get-VstsLocString -Key InvalidScriptArguments0 -ArgumentList $scriptArguments) } +# Sanitize script arguments to prevent PowerShell command injection. +# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all +# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so +# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the +# matching pattern in Tasks/PowerShellV2/powershell.ps1. +if ($scriptType -ne "InlineScript") { + try { + $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV4" + } + catch { + $message = $_.Exception.Message + + if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { + throw $message; + } + + $telemetry = @{ + 'UnexpectedError' = $message + 'ErrorStackTrace' = $_.Exception.StackTrace + } + Publish-Telemetry $telemetry + } +} + # string constants $otherVersion = "OtherVersion" $latestVersion = "LatestVersion" diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/de-DE/resources.resjson index 44d372e42cb4..259af9c5a85d 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/de-DE/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/de-DE/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "Die angegebene Azure PowerShell-Version \"{0}\" weist nicht das richtige Format auf. Überprüfen Sie das Format. Ein Beispiel für das richtige Format ist etwa 1.0.1.", "loc.messages.JS_ExitCode": "PowerShell wurde beendet mit dem Code \"%s\".", "loc.messages.JS_Stderr": "PowerShell hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", - "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist." + "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", + "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/en-US/resources.resjson index 5357601c22f5..f7d72639dfbe 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/en-US/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/en-US/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "loc.messages.JS_ExitCode": "PowerShell exited with code '%s'.", "loc.messages.JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." + "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/es-ES/resources.resjson index 9f596d3fdf27..4598cf9b0f58 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/es-ES/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/es-ES/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "La versión de Azure PowerShell \"{0}\" especificada no tiene el formato correcto. Compruebe el formato. Ejemplo de formato correcto: 1.0.1", "loc.messages.JS_ExitCode": "PowerShell se cerró con el código \"%s\".", "loc.messages.JS_Stderr": "PowerShell escribió una o varias líneas en la secuencia de error estándar.", - "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado." + "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", + "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/fr-FR/resources.resjson index 85ffdca03de8..67ebbc0a8c81 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/fr-FR/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/fr-FR/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "La version '{0}' spécifiée pour Azure PowerShell n'est pas au format approprié. Vérifiez le format. Exemple de format correct : 1.0.1", "loc.messages.JS_ExitCode": "Arrêt de PowerShell. Code de sortie : '%s'.", "loc.messages.JS_Stderr": "PowerShell a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", - "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré." + "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", + "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/it-IT/resources.resjson index de03075839b5..08667373fad7 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/it-IT/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/it-IT/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "Il formato della versione di Azure PowerShell '{0}' specificata non è corretto. Controllare il formato. Un esempio di formato corretto è 1.0.1", "loc.messages.JS_ExitCode": "PowerShell terminato con codice '%s'.", "loc.messages.JS_Stderr": "PowerShell ha scritto una o più righe nel flusso di errore standard.", - "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta." + "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", + "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ja-JP/resources.resjson index 5f60ce4b7a81..85e75c29d6d6 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ja-JP/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ja-JP/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "指定した Azure PowerShell バージョン '{0}' は、形式が正しくありません。形式をご確認ください。正しい形式の例は、1.0.1 です", "loc.messages.JS_ExitCode": "PowerShell がコード '%s' で終了しました。", "loc.messages.JS_Stderr": "PowerShell が標準エラー ストリームに 1 行以上を書き込みました。", - "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。" + "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", + "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ko-KR/resources.resjson index b00a1a1619c4..03505c625ad8 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ko-KR/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ko-KR/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "지정한 Azure PowerShell 버전 '{0}'의 형식이 잘못되었습니다. 형식을 확인하세요. 올바른 형식의 예는 1.0.1입니다.", "loc.messages.JS_ExitCode": "PowerShell이 코드 '%s'(으)로 종료되었습니다.", "loc.messages.JS_Stderr": "PowerShell이 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", - "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요." + "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", + "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ru-RU/resources.resjson index c20a9b0fce5f..cd64f05a2457 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ru-RU/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ru-RU/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "Указанная версия Azure PowerShell \"{0}\" имеет неправильный формат. Проверьте формат. Пример правильного формата: 1.0.1", "loc.messages.JS_ExitCode": "Завершение работы PowerShell с кодом \"%s\".", "loc.messages.JS_Stderr": "Оболочка PowerShell записала одну или несколько строк в стандартный поток ошибок.", - "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек." + "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", + "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-CN/resources.resjson index fe4a5eb3b960..136fb8907b47 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-CN/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-CN/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本“{0}”格式不正确。请检查格式。正确格式的示例为 1.0.1", "loc.messages.JS_ExitCode": "PowerShell 已退出,代码为“%s”。", "loc.messages.JS_Stderr": "PowerShell 向标准错误流写入一个或多个行。", - "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。" + "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", + "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-TW/resources.resjson index 5b87db2dbbac..06c8ca132cca 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-TW/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-TW/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本 '{0}' 格式不正確。請檢查格式。正確格式的範例為 1.0.1", "loc.messages.JS_ExitCode": "PowerShell 已結束,代碼為 '%s'。", "loc.messages.JS_Stderr": "PowerShell 已將一或多行寫入標準錯誤資料流。", - "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。" + "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", + "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/make.json b/_generated/AzurePowerShellV4_Node24/make.json index 66948f367d59..8608a0a8f001 100644 --- a/_generated/AzurePowerShellV4_Node24/make.json +++ b/_generated/AzurePowerShellV4_Node24/make.json @@ -19,6 +19,10 @@ { "module": "../Common/TlsHelper_", "type": "ps" + }, + { + "module": "../Common/Sanitizer", + "type": "ps" } ], "externals": { diff --git a/_generated/AzurePowerShellV4_Node24/task.json b/_generated/AzurePowerShellV4_Node24/task.json index d45d78452c83..f5251615ed48 100644 --- a/_generated/AzurePowerShellV4_Node24/task.json +++ b/_generated/AzurePowerShellV4_Node24/task.json @@ -18,7 +18,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 3 + "Patch": 5 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ @@ -216,11 +216,12 @@ "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "JS_ExitCode": "PowerShell exited with code '%s'.", "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" }, "_buildConfigMapping": { - "Default": "4.274.2", + "Default": "4.274.4", "LocalPackages": "4.249.4", - "Node24_1": "4.274.3" + "Node24_1": "4.274.5" } -} \ No newline at end of file +} diff --git a/_generated/AzurePowerShellV4_Node24/task.loc.json b/_generated/AzurePowerShellV4_Node24/task.loc.json index 7603c1e19a49..4a682a1691e1 100644 --- a/_generated/AzurePowerShellV4_Node24/task.loc.json +++ b/_generated/AzurePowerShellV4_Node24/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 3 + "Patch": 5 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ @@ -216,11 +216,12 @@ "InvalidAzurePsVersion": "ms-resource:loc.messages.InvalidAzurePsVersion", "JS_ExitCode": "ms-resource:loc.messages.JS_ExitCode", "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", - "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal" + "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", + "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" }, "_buildConfigMapping": { - "Default": "4.274.2", + "Default": "4.274.4", "LocalPackages": "4.249.4", - "Node24_1": "4.274.3" + "Node24_1": "4.274.5" } -} \ No newline at end of file +} From 4ff6fd037c1dbdf79cecd03936075e246e7757d2 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Mon, 11 May 2026 13:52:35 +0200 Subject: [PATCH 04/25] AzurePowerShellV5: sanitize ScriptArguments via Common/Sanitizer MSRC 115118 / ICM 31000000596029. Mirrors the PowerShellV2 retrofit from PR #18744 / #19183. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/AzurePowerShellV5/AzurePowerShell.ps1 | 33 +++++++++++++++++++ .../resources.resjson/de-DE/resources.resjson | 2 ++ .../resources.resjson/en-US/resources.resjson | 3 +- .../resources.resjson/es-ES/resources.resjson | 2 ++ .../resources.resjson/fr-FR/resources.resjson | 2 ++ .../resources.resjson/it-IT/resources.resjson | 2 ++ .../resources.resjson/ja-JP/resources.resjson | 2 ++ .../resources.resjson/ko-KR/resources.resjson | 2 ++ .../resources.resjson/ru-RU/resources.resjson | 2 ++ .../resources.resjson/zh-CN/resources.resjson | 2 ++ .../resources.resjson/zh-TW/resources.resjson | 2 ++ Tasks/AzurePowerShellV5/make.json | 4 +++ Tasks/AzurePowerShellV5/task.loc.json | 5 +-- .../AzurePowerShellV5/AzurePowerShell.ps1 | 33 +++++++++++++++++++ .../resources.resjson/de-DE/resources.resjson | 2 ++ .../resources.resjson/en-US/resources.resjson | 3 +- .../resources.resjson/es-ES/resources.resjson | 2 ++ .../resources.resjson/fr-FR/resources.resjson | 2 ++ .../resources.resjson/it-IT/resources.resjson | 2 ++ .../resources.resjson/ja-JP/resources.resjson | 2 ++ .../resources.resjson/ko-KR/resources.resjson | 2 ++ .../resources.resjson/ru-RU/resources.resjson | 2 ++ .../resources.resjson/zh-CN/resources.resjson | 2 ++ .../resources.resjson/zh-TW/resources.resjson | 2 ++ _generated/AzurePowerShellV5/make.json | 4 +++ _generated/AzurePowerShellV5/task.json | 5 +-- _generated/AzurePowerShellV5/task.loc.json | 5 +-- .../AzurePowerShell.ps1 | 33 +++++++++++++++++++ .../resources.resjson/de-DE/resources.resjson | 2 ++ .../resources.resjson/en-US/resources.resjson | 3 +- .../resources.resjson/es-ES/resources.resjson | 2 ++ .../resources.resjson/fr-FR/resources.resjson | 2 ++ .../resources.resjson/it-IT/resources.resjson | 2 ++ .../resources.resjson/ja-JP/resources.resjson | 2 ++ .../resources.resjson/ko-KR/resources.resjson | 2 ++ .../resources.resjson/ru-RU/resources.resjson | 2 ++ .../resources.resjson/zh-CN/resources.resjson | 2 ++ .../resources.resjson/zh-TW/resources.resjson | 2 ++ _generated/AzurePowerShellV5_Node24/make.json | 4 +++ _generated/AzurePowerShellV5_Node24/task.json | 5 +-- .../AzurePowerShellV5_Node24/task.loc.json | 5 +-- 41 files changed, 186 insertions(+), 13 deletions(-) diff --git a/Tasks/AzurePowerShellV5/AzurePowerShell.ps1 b/Tasks/AzurePowerShellV5/AzurePowerShell.ps1 index 5bf675d2ecb6..7f43919ceccd 100644 --- a/Tasks/AzurePowerShellV5/AzurePowerShell.ps1 +++ b/Tasks/AzurePowerShellV5/AzurePowerShell.ps1 @@ -1,6 +1,15 @@ Trace-VstsEnteringInvocation $MyInvocation Import-VstsLocStrings "$PSScriptRoot\Task.json" +Import-Module $PSScriptRoot\ps_modules\Sanitizer + +function Publish-Telemetry($telemetry) { + $area = 'TaskHub' + $feature = 'AzurePowerShellV5' + $telemetryJson = $telemetry | ConvertTo-Json -Compress + Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" +} + # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -30,6 +39,30 @@ if ($scriptArguments -match '[\r\n]') { throw (Get-VstsLocString -Key InvalidScriptArguments0 -ArgumentList $scriptArguments) } +# Sanitize script arguments to prevent PowerShell command injection. +# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all +# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so +# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the +# matching pattern in Tasks/PowerShellV2/powershell.ps1. +if ($scriptType -ne "InlineScript") { + try { + $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV5" + } + catch { + $message = $_.Exception.Message + + if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { + throw $message; + } + + $telemetry = @{ + 'UnexpectedError' = $message + 'ErrorStackTrace' = $_.Exception.StackTrace + } + Publish-Telemetry $telemetry + } +} + # string constants $otherVersion = "OtherVersion" $latestVersion = "LatestVersion" diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson index 01cef9e088bc..9b987da116b6 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", "loc.messages.PS_ExitCode": "PowerShell wurde beendet mit dem Code \"{0}\".", "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}" +, + "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson index 12a72280c5e2..168dc362bd47 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "loc.messages.PS_ExitCode": "PowerShell exited with code '{0}'.", - "loc.messages.Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" + "loc.messages.Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", + "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson index a272cd593e8b..7350edd0d428 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", "loc.messages.PS_ExitCode": "PowerShell se cerró con el código \"{0}\".", "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}" +, + "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson index 15ee7854ad82..25081ca9ab98 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", "loc.messages.PS_ExitCode": "Arrêt de PowerShell. Code de sortie : '{0}'.", "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}" +, + "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson index ba4a514ec06b..50c9ccda8d39 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", "loc.messages.PS_ExitCode": "PowerShell terminato con codice '{0}'.", "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}" +, + "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson index e54d0a199131..a63378aa71b0 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", "loc.messages.PS_ExitCode": "PowerShell がコード '{0}' で終了しました。", "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です" +, + "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson index a25c8316e474..606ebb338d04 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", "loc.messages.PS_ExitCode": "PowerShell이 코드 '{0}'(으)로 종료되었습니다.", "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다." +, + "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson index d65e2b9d2b6b..12afd3e9009b 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", "loc.messages.PS_ExitCode": "Завершение работы PowerShell с кодом \"{0}\".", "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}" +, + "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson index 5fca75a131f5..dc1d38ef02ce 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", "loc.messages.PS_ExitCode": "PowerShell 已退出,代码为“{0}”。", "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}" +, + "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson index 91a14581861f..71ff0258a089 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", "loc.messages.PS_ExitCode": "PowerShell 已結束,代碼為 '{0}'。", "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}" +, + "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/make.json b/Tasks/AzurePowerShellV5/make.json index caa212abdaaf..bcfbdfc7ed94 100644 --- a/Tasks/AzurePowerShellV5/make.json +++ b/Tasks/AzurePowerShellV5/make.json @@ -18,6 +18,10 @@ { "module": "../Common/TlsHelper_", "type": "ps" + }, + { + "module": "../Common/Sanitizer", + "type": "ps" } ], "externals": { diff --git a/Tasks/AzurePowerShellV5/task.loc.json b/Tasks/AzurePowerShellV5/task.loc.json index a736dbdb6e19..ab75b784fb47 100644 --- a/Tasks/AzurePowerShellV5/task.loc.json +++ b/Tasks/AzurePowerShellV5/task.loc.json @@ -206,6 +206,7 @@ "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", "PS_ExitCode": "ms-resource:loc.messages.PS_ExitCode", - "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning" + "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning", + "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" } -} \ No newline at end of file +} diff --git a/_generated/AzurePowerShellV5/AzurePowerShell.ps1 b/_generated/AzurePowerShellV5/AzurePowerShell.ps1 index 5bf675d2ecb6..7f43919ceccd 100644 --- a/_generated/AzurePowerShellV5/AzurePowerShell.ps1 +++ b/_generated/AzurePowerShellV5/AzurePowerShell.ps1 @@ -1,6 +1,15 @@ Trace-VstsEnteringInvocation $MyInvocation Import-VstsLocStrings "$PSScriptRoot\Task.json" +Import-Module $PSScriptRoot\ps_modules\Sanitizer + +function Publish-Telemetry($telemetry) { + $area = 'TaskHub' + $feature = 'AzurePowerShellV5' + $telemetryJson = $telemetry | ConvertTo-Json -Compress + Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" +} + # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -30,6 +39,30 @@ if ($scriptArguments -match '[\r\n]') { throw (Get-VstsLocString -Key InvalidScriptArguments0 -ArgumentList $scriptArguments) } +# Sanitize script arguments to prevent PowerShell command injection. +# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all +# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so +# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the +# matching pattern in Tasks/PowerShellV2/powershell.ps1. +if ($scriptType -ne "InlineScript") { + try { + $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV5" + } + catch { + $message = $_.Exception.Message + + if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { + throw $message; + } + + $telemetry = @{ + 'UnexpectedError' = $message + 'ErrorStackTrace' = $_.Exception.StackTrace + } + Publish-Telemetry $telemetry + } +} + # string constants $otherVersion = "OtherVersion" $latestVersion = "LatestVersion" diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson index 01cef9e088bc..9b987da116b6 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", "loc.messages.PS_ExitCode": "PowerShell wurde beendet mit dem Code \"{0}\".", "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}" +, + "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson index 12a72280c5e2..168dc362bd47 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "loc.messages.PS_ExitCode": "PowerShell exited with code '{0}'.", - "loc.messages.Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" + "loc.messages.Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", + "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson index a272cd593e8b..7350edd0d428 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", "loc.messages.PS_ExitCode": "PowerShell se cerró con el código \"{0}\".", "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}" +, + "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson index 15ee7854ad82..25081ca9ab98 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", "loc.messages.PS_ExitCode": "Arrêt de PowerShell. Code de sortie : '{0}'.", "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}" +, + "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson index ba4a514ec06b..50c9ccda8d39 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", "loc.messages.PS_ExitCode": "PowerShell terminato con codice '{0}'.", "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}" +, + "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson index e54d0a199131..a63378aa71b0 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", "loc.messages.PS_ExitCode": "PowerShell がコード '{0}' で終了しました。", "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です" +, + "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson index a25c8316e474..606ebb338d04 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", "loc.messages.PS_ExitCode": "PowerShell이 코드 '{0}'(으)로 종료되었습니다.", "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다." +, + "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson index d65e2b9d2b6b..12afd3e9009b 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", "loc.messages.PS_ExitCode": "Завершение работы PowerShell с кодом \"{0}\".", "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}" +, + "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson index 5fca75a131f5..dc1d38ef02ce 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", "loc.messages.PS_ExitCode": "PowerShell 已退出,代码为“{0}”。", "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}" +, + "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson index 91a14581861f..71ff0258a089 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", "loc.messages.PS_ExitCode": "PowerShell 已結束,代碼為 '{0}'。", "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}" +, + "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/make.json b/_generated/AzurePowerShellV5/make.json index caa212abdaaf..bcfbdfc7ed94 100644 --- a/_generated/AzurePowerShellV5/make.json +++ b/_generated/AzurePowerShellV5/make.json @@ -18,6 +18,10 @@ { "module": "../Common/TlsHelper_", "type": "ps" + }, + { + "module": "../Common/Sanitizer", + "type": "ps" } ], "externals": { diff --git a/_generated/AzurePowerShellV5/task.json b/_generated/AzurePowerShellV5/task.json index 00a943b6bee1..9b82df395cf5 100644 --- a/_generated/AzurePowerShellV5/task.json +++ b/_generated/AzurePowerShellV5/task.json @@ -206,11 +206,12 @@ "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "PS_ExitCode": "PowerShell exited with code '{0}'.", - "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" + "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" }, "_buildConfigMapping": { "Default": "5.274.4", "LocalPackages": "5.249.4", "Node24_1": "5.274.5" } -} \ No newline at end of file +} diff --git a/_generated/AzurePowerShellV5/task.loc.json b/_generated/AzurePowerShellV5/task.loc.json index e7e6ab6c84ae..e4a207a1d1af 100644 --- a/_generated/AzurePowerShellV5/task.loc.json +++ b/_generated/AzurePowerShellV5/task.loc.json @@ -206,11 +206,12 @@ "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", "PS_ExitCode": "ms-resource:loc.messages.PS_ExitCode", - "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning" + "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning", + "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" }, "_buildConfigMapping": { "Default": "5.274.4", "LocalPackages": "5.249.4", "Node24_1": "5.274.5" } -} \ No newline at end of file +} diff --git a/_generated/AzurePowerShellV5_Node24/AzurePowerShell.ps1 b/_generated/AzurePowerShellV5_Node24/AzurePowerShell.ps1 index 5bf675d2ecb6..7f43919ceccd 100644 --- a/_generated/AzurePowerShellV5_Node24/AzurePowerShell.ps1 +++ b/_generated/AzurePowerShellV5_Node24/AzurePowerShell.ps1 @@ -1,6 +1,15 @@ Trace-VstsEnteringInvocation $MyInvocation Import-VstsLocStrings "$PSScriptRoot\Task.json" +Import-Module $PSScriptRoot\ps_modules\Sanitizer + +function Publish-Telemetry($telemetry) { + $area = 'TaskHub' + $feature = 'AzurePowerShellV5' + $telemetryJson = $telemetry | ConvertTo-Json -Compress + Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" +} + # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -30,6 +39,30 @@ if ($scriptArguments -match '[\r\n]') { throw (Get-VstsLocString -Key InvalidScriptArguments0 -ArgumentList $scriptArguments) } +# Sanitize script arguments to prevent PowerShell command injection. +# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all +# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so +# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the +# matching pattern in Tasks/PowerShellV2/powershell.ps1. +if ($scriptType -ne "InlineScript") { + try { + $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV5" + } + catch { + $message = $_.Exception.Message + + if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { + throw $message; + } + + $telemetry = @{ + 'UnexpectedError' = $message + 'ErrorStackTrace' = $_.Exception.StackTrace + } + Publish-Telemetry $telemetry + } +} + # string constants $otherVersion = "OtherVersion" $latestVersion = "LatestVersion" diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/de-DE/resources.resjson index 01cef9e088bc..9b987da116b6 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/de-DE/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/de-DE/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", "loc.messages.PS_ExitCode": "PowerShell wurde beendet mit dem Code \"{0}\".", "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}" +, + "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/en-US/resources.resjson index 12a72280c5e2..168dc362bd47 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/en-US/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/en-US/resources.resjson @@ -39,5 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "loc.messages.PS_ExitCode": "PowerShell exited with code '{0}'.", - "loc.messages.Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" + "loc.messages.Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", + "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/es-ES/resources.resjson index a272cd593e8b..7350edd0d428 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/es-ES/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/es-ES/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", "loc.messages.PS_ExitCode": "PowerShell se cerró con el código \"{0}\".", "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}" +, + "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/fr-FR/resources.resjson index 15ee7854ad82..25081ca9ab98 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/fr-FR/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/fr-FR/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", "loc.messages.PS_ExitCode": "Arrêt de PowerShell. Code de sortie : '{0}'.", "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}" +, + "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/it-IT/resources.resjson index ba4a514ec06b..50c9ccda8d39 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/it-IT/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/it-IT/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", "loc.messages.PS_ExitCode": "PowerShell terminato con codice '{0}'.", "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}" +, + "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ja-JP/resources.resjson index e54d0a199131..a63378aa71b0 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ja-JP/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ja-JP/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", "loc.messages.PS_ExitCode": "PowerShell がコード '{0}' で終了しました。", "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です" +, + "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ko-KR/resources.resjson index a25c8316e474..606ebb338d04 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ko-KR/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ko-KR/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", "loc.messages.PS_ExitCode": "PowerShell이 코드 '{0}'(으)로 종료되었습니다.", "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다." +, + "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ru-RU/resources.resjson index d65e2b9d2b6b..12afd3e9009b 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ru-RU/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ru-RU/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", "loc.messages.PS_ExitCode": "Завершение работы PowerShell с кодом \"{0}\".", "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}" +, + "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-CN/resources.resjson index 5fca75a131f5..dc1d38ef02ce 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-CN/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-CN/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", "loc.messages.PS_ExitCode": "PowerShell 已退出,代码为“{0}”。", "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}" +, + "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-TW/resources.resjson index 91a14581861f..71ff0258a089 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-TW/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-TW/resources.resjson @@ -40,4 +40,6 @@ "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", "loc.messages.PS_ExitCode": "PowerShell 已結束,代碼為 '{0}'。", "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}" +, + "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/make.json b/_generated/AzurePowerShellV5_Node24/make.json index caa212abdaaf..bcfbdfc7ed94 100644 --- a/_generated/AzurePowerShellV5_Node24/make.json +++ b/_generated/AzurePowerShellV5_Node24/make.json @@ -18,6 +18,10 @@ { "module": "../Common/TlsHelper_", "type": "ps" + }, + { + "module": "../Common/Sanitizer", + "type": "ps" } ], "externals": { diff --git a/_generated/AzurePowerShellV5_Node24/task.json b/_generated/AzurePowerShellV5_Node24/task.json index 82c41b895e0d..60f977f90b11 100644 --- a/_generated/AzurePowerShellV5_Node24/task.json +++ b/_generated/AzurePowerShellV5_Node24/task.json @@ -210,11 +210,12 @@ "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "PS_ExitCode": "PowerShell exited with code '{0}'.", - "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" + "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" }, "_buildConfigMapping": { "Default": "5.274.4", "LocalPackages": "5.249.4", "Node24_1": "5.274.5" } -} \ No newline at end of file +} diff --git a/_generated/AzurePowerShellV5_Node24/task.loc.json b/_generated/AzurePowerShellV5_Node24/task.loc.json index 7867f0b5e330..9a999f00e1e7 100644 --- a/_generated/AzurePowerShellV5_Node24/task.loc.json +++ b/_generated/AzurePowerShellV5_Node24/task.loc.json @@ -210,11 +210,12 @@ "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", "PS_ExitCode": "ms-resource:loc.messages.PS_ExitCode", - "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning" + "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning", + "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" }, "_buildConfigMapping": { "Default": "5.274.4", "LocalPackages": "5.249.4", "Node24_1": "5.274.5" } -} \ No newline at end of file +} From 73fc7aede0268f00a2fe976268665fec1ecb2e0c Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Mon, 11 May 2026 13:52:35 +0200 Subject: [PATCH 05/25] ServiceFabricPowerShellV1: sanitize ScriptArguments via Common/Sanitizer MSRC 115118 / ICM 31000000596029. Mirrors the PowerShellV2 retrofit from PR #18744 / #19183. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../ServiceFabricPowerShell.ps1 | 33 +++++++++++++++++++ .../resources.resjson/de-DE/resources.resjson | 3 +- .../resources.resjson/en-US/resources.resjson | 3 +- .../resources.resjson/es-ES/resources.resjson | 3 +- .../resources.resjson/fr-FR/resources.resjson | 3 +- .../resources.resjson/it-IT/resources.resjson | 3 +- .../resources.resjson/ja-JP/resources.resjson | 3 +- .../resources.resjson/ko-KR/resources.resjson | 3 +- .../resources.resjson/ru-RU/resources.resjson | 3 +- .../resources.resjson/zh-CN/resources.resjson | 3 +- .../resources.resjson/zh-TW/resources.resjson | 3 +- Tasks/ServiceFabricPowerShellV1/make.json | 4 +++ Tasks/ServiceFabricPowerShellV1/task.json | 2 +- Tasks/ServiceFabricPowerShellV1/task.loc.json | 7 ++-- 14 files changed, 62 insertions(+), 14 deletions(-) diff --git a/Tasks/ServiceFabricPowerShellV1/ServiceFabricPowerShell.ps1 b/Tasks/ServiceFabricPowerShellV1/ServiceFabricPowerShell.ps1 index c1d87e42edf1..73bf597a6440 100644 --- a/Tasks/ServiceFabricPowerShellV1/ServiceFabricPowerShell.ps1 +++ b/Tasks/ServiceFabricPowerShellV1/ServiceFabricPowerShell.ps1 @@ -3,6 +3,15 @@ Trace-VstsEnteringInvocation $MyInvocation Import-VstsLocStrings "$PSScriptRoot\Task.json" +Import-Module $PSScriptRoot\ps_modules\Sanitizer + +function Publish-SanitizerTelemetry($telemetry) { + $area = 'TaskHub' + $feature = 'ServiceFabricPowerShellV1' + $telemetryJson = $telemetry | ConvertTo-Json -Compress + Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" +} + # Get inputs. $serviceConnectionName = Get-VstsInput -Name serviceConnectionName -Require $scriptType = Get-VstsInput -Name ScriptType -Require @@ -28,6 +37,30 @@ if ($scriptArguments -match '[\r\n]') throw (Get-VstsLocString -Key InvalidScriptArguments0 -ArgumentList $scriptArguments) } +# Sanitize script arguments to prevent PowerShell command injection. +# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all +# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so +# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the +# matching pattern in Tasks/PowerShellV2/powershell.ps1. +if ($scriptType -ne "InlineScript") { + try { + $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "ServiceFabricPowerShellV1" + } + catch { + $message = $_.Exception.Message + + if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { + throw $message; + } + + $telemetry = @{ + 'UnexpectedError' = $message + 'ErrorStackTrace' = $_.Exception.StackTrace + } + Publish-SanitizerTelemetry $telemetry + } +} + $certificate = $null try { diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/de-DE/resources.resjson index 7804cd486c63..d7cffbe350fd 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/de-DE/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/de-DE/resources.resjson @@ -15,5 +15,6 @@ "loc.input.help.ScriptArguments": "Zusätzliche Argumente, die an PowerShell übergeben werden sollen. Entweder Ordnungszahl- oder benannte Parameter.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "Das Zertifikat mit dem Fingerabdruck \"{0}\" ist nicht im lokalen Zertifikatspeicher vorhanden. Dies kann möglicherweise zu Fehlern führen. Wenn Release-/Buildfehler auftreten, versuchen Sie es noch mal, oder stellen Sie sicher, dass nicht mehrere Agents Builds/Releases unter Verwendung desselben Dienstendpunkts parallel auf demselben Computer ausführen.", "loc.messages.InvalidScriptArguments0": "Ungültige Skriptargumente \"{0}\". Zeilenumbrüche sind unzulässig.", - "loc.messages.InvalidScriptPath0": "Ungültiger Skriptpfad \"{0}\". Es wurden ungültige Pfadzeichen angegeben." + "loc.messages.InvalidScriptPath0": "Ungültiger Skriptpfad \"{0}\". Es wurden ungültige Pfadzeichen angegeben.", + "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/en-US/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/en-US/resources.resjson index a600d37bf3ba..7593fc2d351e 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/en-US/resources.resjson @@ -15,5 +15,6 @@ "loc.input.help.ScriptArguments": "Additional parameters to pass to PowerShell. Can be either ordinal or named parameters.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "The certificate with thumbprint {0} is not present in the local certificate store. This can potentially cause errors. If the release/build fails, please re-try it or ensure that multiple agents are not running builds/releases using the same service endpoint simultaneously on the same machine.", "loc.messages.InvalidScriptArguments0": "Invalid script arguments '{0}'. Line breaks are not allowed.", - "loc.messages.InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified." + "loc.messages.InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified.", + "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/es-ES/resources.resjson index 7f5b9d7c6a64..1359d058a4b8 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/es-ES/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/es-ES/resources.resjson @@ -15,5 +15,6 @@ "loc.input.help.ScriptArguments": "Parámetros adicionales que pasar a PowerShell. Pueden ser parámetros ordinales o con nombre.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "El certificado con la huella digital {0} no está presente en el almacén de certificados local, lo cual puede causar errores. Si se produce un error de versión o compilación, vuelva a intentarlo o asegúrese de que no haya varios agentes que ejecuten compilaciones o versiones que usan el mismo punto de conexión de servicio simultáneamente en la misma máquina.", "loc.messages.InvalidScriptArguments0": "Argumentos de script '{0}' no válidos. No se permiten los saltos de línea.", - "loc.messages.InvalidScriptPath0": "Ruta del script '{0}' no válida. Los caracteres de ruta de acceso especificados no son válidos." + "loc.messages.InvalidScriptPath0": "Ruta del script '{0}' no válida. Los caracteres de ruta de acceso especificados no son válidos.", + "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/fr-FR/resources.resjson index 8c05752b605e..b86626bdd4e1 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/fr-FR/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -15,5 +15,6 @@ "loc.input.help.ScriptArguments": "Paramètres supplémentaires à passer à PowerShell. Peuvent être des paramètres ordinaux ou nommés.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "Le certificat avec l'empreinte numérique {0} n'est pas présent dans le magasin de certificats local. Cela peut entraîner des erreurs. En cas d'échec de la mise en production/build, réessayez l'opération, ou vérifiez que plusieurs agents n'exécutent pas de builds/mises en production simultanément à l'aide du même point de terminaison de service sur la même machine.", "loc.messages.InvalidScriptArguments0": "Arguments de script '{0}' non valides. Les sauts de ligne ne sont pas autorisés.", - "loc.messages.InvalidScriptPath0": "Chemin de script '{0}' non valide. Caractères non valides spécifiés dans le chemin." + "loc.messages.InvalidScriptPath0": "Chemin de script '{0}' non valide. Caractères non valides spécifiés dans le chemin.", + "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/it-IT/resources.resjson index 2f78864f1554..7dfab59ec367 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/it-IT/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/it-IT/resources.resjson @@ -15,5 +15,6 @@ "loc.input.help.ScriptArguments": "Parametri aggiuntivi da passare a PowerShell. Possono essere ordinali o denominati.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "Il certificato con identificazione personale {0} non è presente nell'archivio certificati locale. Questa condizione potrebbe causare errori. Se la versione/compilazione non riesce, riprovare oppure verificare che più agenti non eseguano compilazioni/versioni usando contemporaneamente lo stesso endpoint servizio nello stesso computer.", "loc.messages.InvalidScriptArguments0": "Gli argomenti '{0}' dello script non sono validi. Le interruzioni di riga non sono consentite.", - "loc.messages.InvalidScriptPath0": "Il percorso '{0}' dello script non è valido. Sono stati specificati caratteri non validi." + "loc.messages.InvalidScriptPath0": "Il percorso '{0}' dello script non è valido. Sono stati specificati caratteri non validi.", + "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ja-JP/resources.resjson index a09e7f457f58..366971dd9059 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ja-JP/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -15,5 +15,6 @@ "loc.input.help.ScriptArguments": "PowerShell に渡す追加のパラメーター。順序によるパラメーターまたは名前指定されたパラメーターのいずれかです。", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "サムプリント {0} を持つ証明書がローカル証明書ストアに存在しません。これによりエラーが発生する可能性があります。リリースまたはビルドが失敗する場合、再試行するか、同じマシンで同じサービス エンドポイントを同時に使用して複数のエージェントによってビルドやリリースが実行されていないことをご確認ください。", "loc.messages.InvalidScriptArguments0": "スクリプトの引数 '{0}' が無効です。改行は使用できません。", - "loc.messages.InvalidScriptPath0": "スクリプト パス '{0}' が無効です。無効なパス文字が指定されました。" + "loc.messages.InvalidScriptPath0": "スクリプト パス '{0}' が無効です。無効なパス文字が指定されました。", + "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ko-KR/resources.resjson index 8e796c7783e3..528109fa20cd 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ko-KR/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -15,5 +15,6 @@ "loc.input.help.ScriptArguments": "PowerShell에 전달할 추가 인수입니다. 서수 매개 변수나 명명된 매개 변수 중 하나일 수 있습니다.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "지문이 {0}인 인증서가 로컬 인증서 저장소에 없습니다. 이로 인해 오류가 발생할 수 있습니다. 릴리스/빌드에 실패하는 경우 다시 시도하거나, 동일한 머신에서 여러 에이전트가 동일한 서비스 엔드포인트를 사용하여 빌드/릴리스를 동시에 실행하고 있지 않은지 확인하세요.", "loc.messages.InvalidScriptArguments0": "스크립트 인수 '{0}'이(가) 잘못되었습니다. 줄 바꿈은 허용되지 않습니다.", - "loc.messages.InvalidScriptPath0": "스크립트 경로 '{0}'이(가) 잘못되었습니다. 잘못된 경로 문자를 지정했습니다." + "loc.messages.InvalidScriptPath0": "스크립트 경로 '{0}'이(가) 잘못되었습니다. 잘못된 경로 문자를 지정했습니다.", + "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ru-RU/resources.resjson index d03ac0e098e1..2eeeeb80be32 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ru-RU/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -15,5 +15,6 @@ "loc.input.help.ScriptArguments": "Дополнительные параметры для передачи в PowerShell. Могут быть как порядковыми, так и именованными.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "Сертификат с отпечатком {0} отсутствует в локальном хранилище сертификатов. Это может вызвать ошибки. В случае сбоя выпуска или сборки повторите попытку или убедитесь, что на одном и том же компьютере не выполняется несколько агентов, одновременно запускающих сборки/выпуски с использованием одной конечной точки службы.", "loc.messages.InvalidScriptArguments0": "Недопустимые аргументы скрипта \"{0}\". Разрывы строк запрещены.", - "loc.messages.InvalidScriptPath0": "Недопустимый путь к скрипту \"{0}\". Указаны символы, недопустимые в пути." + "loc.messages.InvalidScriptPath0": "Недопустимый путь к скрипту \"{0}\". Указаны символы, недопустимые в пути.", + "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-CN/resources.resjson index ec957178c7e7..170ebd91c44b 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-CN/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -15,5 +15,6 @@ "loc.input.help.ScriptArguments": "要传递给 PowerShell 的其他参数。可以是序号或命名参数。", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "具有指纹 {0} 的证书在本地证书存储中不存在。这可能会导致错误。如果发布/生成失败,请重试此操作,或确保多个代理未在同一计算机上同时使用同一服务终结点运行生成/发布。", "loc.messages.InvalidScriptArguments0": "脚本参数“{0}”无效。不允许换行。", - "loc.messages.InvalidScriptPath0": "脚本路径“{0}”无效。指定的路径字符无效。" + "loc.messages.InvalidScriptPath0": "脚本路径“{0}”无效。指定的路径字符无效。", + "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-TW/resources.resjson index 3145f7fc7190..b9741f11df7d 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-TW/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -15,5 +15,6 @@ "loc.input.help.ScriptArguments": "傳遞至 PowerShell 的額外引數。可以是序數或具名參數。", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "指紋為 {0} 的憑證不在本機憑證存放區中。這可能會造成錯誤。如果發行/建置失敗,請予以重試,或確保多個代理程式不會在相同的電腦上,同時使用相同的服務端點執行發行/建置。", "loc.messages.InvalidScriptArguments0": "指令碼引數 '{0}' 無效。不允許分行符號。", - "loc.messages.InvalidScriptPath0": "指令碼路徑 '{0}' 無效。指定的路徑字元無效。" + "loc.messages.InvalidScriptPath0": "指令碼路徑 '{0}' 無效。指定的路徑字元無效。", + "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/make.json b/Tasks/ServiceFabricPowerShellV1/make.json index d575847218af..aa717cdaf52c 100644 --- a/Tasks/ServiceFabricPowerShellV1/make.json +++ b/Tasks/ServiceFabricPowerShellV1/make.json @@ -11,6 +11,10 @@ { "module": "../Common/PowershellHelpers", "type": "ps" + }, + { + "module": "../Common/Sanitizer", + "type": "ps" } ], "externals": { diff --git a/Tasks/ServiceFabricPowerShellV1/task.json b/Tasks/ServiceFabricPowerShellV1/task.json index 925e579f0938..f9b6e38b2636 100644 --- a/Tasks/ServiceFabricPowerShellV1/task.json +++ b/Tasks/ServiceFabricPowerShellV1/task.json @@ -18,7 +18,7 @@ "version": { "Major": 1, "Minor": 228, - "Patch": 0 + "Patch": 1 }, "demands": [ "Cmd" diff --git a/Tasks/ServiceFabricPowerShellV1/task.loc.json b/Tasks/ServiceFabricPowerShellV1/task.loc.json index b7906bd2e2cd..287988ed7c33 100644 --- a/Tasks/ServiceFabricPowerShellV1/task.loc.json +++ b/Tasks/ServiceFabricPowerShellV1/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 1, "Minor": 228, - "Patch": 0 + "Patch": 1 }, "demands": [ "Cmd" @@ -92,6 +92,7 @@ "messages": { "CertNotPresentInLocalStoreWarningMsg": "ms-resource:loc.messages.CertNotPresentInLocalStoreWarningMsg", "InvalidScriptArguments0": "ms-resource:loc.messages.InvalidScriptArguments0", - "InvalidScriptPath0": "ms-resource:loc.messages.InvalidScriptPath0" + "InvalidScriptPath0": "ms-resource:loc.messages.InvalidScriptPath0", + "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" } -} \ No newline at end of file +} From c1f3f85be130cc2ef5d7130d6c70f2379591dadc Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Mon, 11 May 2026 17:56:17 +0200 Subject: [PATCH 06/25] Common/Sanitizer: add Invoke-ScriptArgumentSanitization helper MSRC 115118 / ICM 31000000596029. Mirrors the Should-UseSanitizedArguments / per-task pipeline FF pattern from PR #21947. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Invoke-ScriptArgumentSanitization.ps1 | 129 ++++++++++++++++++ Tasks/Common/Sanitizer/Sanitizer.psm1 | 6 +- 2 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 diff --git a/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 b/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 new file mode 100644 index 000000000000..8de506be6494 --- /dev/null +++ b/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 @@ -0,0 +1,129 @@ +# Combines the org-level "Enable shell tasks arguments validation" toggle (via +# Get-SanitizerCallStatus / AZP_75787_*) AND a per-task pipeline-level +# feature flag, then runs Protect-ScriptArguments inside a try/catch that +# routes the localized 'ScriptArgsSanitized' message back to the caller while +# swallowing unexpected errors into telemetry. +# +# Mirrors the Should-UseSanitizedArguments / Execute-CommandV2 dispatch +# pattern introduced by PR #21947 (SqlAzureDacpacDeploymentV1 / +# SqlDacpacDeploymentOnMachineGroupV0), generalised so any task can opt-in +# with one line: +# +# Invoke-ScriptArgumentSanitization ` +# -InputArgs $scriptArguments ` +# -TaskName 'AzurePowerShellV5' ` +# -PipelineFeatureFlagName 'EnableAzurePowerShellArgumentsSanitization' +# +# When *either* feature flag is off the call is a no-op, so existing +# pipelines are unaffected. See https://aka.ms/ado/75787. + +function Publish-SanitizerErrorTelemetry { + [CmdletBinding()] + param( + [Parameter(Mandatory = $true)] + [string]$TaskName, + + [Parameter(Mandatory = $true)] + [hashtable]$Telemetry + ) + + $telemetryJson = $Telemetry | ConvertTo-Json -Compress + Write-Host "##vso[telemetry.publish area=TaskHub;feature=$TaskName]$telemetryJson" +} + +function Test-ShouldUseSanitizer { + [CmdletBinding()] + [OutputType([bool])] + param( + [Parameter(Mandatory = $true)] + [string]$TaskName, + + [Parameter(Mandatory = $true)] + [string]$PipelineFeatureFlagName + ) + + try { + $orgLevelEnabled = Get-SanitizerCallStatus + } + catch { + Write-Verbose "Failed to check org-level sanitizer status: $_. Skipping sanitization." + Publish-SanitizerErrorTelemetry -TaskName $TaskName -Telemetry @{ + checkType = 'OrgLevelFeatureFlag' + checkFailed = $true + errorMessage = $_.Exception.Message + } + return $false + } + + if (-not $orgLevelEnabled) { + Write-Verbose "Argument sanitization disabled for $TaskName : 'Enable shell tasks arguments validation' is not enabled" + return $false + } + + if (-not (Get-Command -Name 'Get-VstsPipelineFeature' -ErrorAction SilentlyContinue)) { + Write-Verbose "Get-VstsPipelineFeature cmdlet not available; skipping pipeline-level sanitization check for $TaskName." + Publish-SanitizerErrorTelemetry -TaskName $TaskName -Telemetry @{ + checkType = 'PipelineLevelFeatureFlag' + cmdletMissing = $true + } + return $false + } + + try { + $pipelineLevelEnabled = Get-VstsPipelineFeature -FeatureName $PipelineFeatureFlagName -ErrorAction Stop + } + catch { + Write-Verbose "Pipeline-level feature flag check failed for $TaskName : $_. Skipping sanitization." + Publish-SanitizerErrorTelemetry -TaskName $TaskName -Telemetry @{ + checkType = 'PipelineLevelFeatureFlag' + checkFailed = $true + errorMessage = $_.Exception.Message + } + return $false + } + + if (-not $pipelineLevelEnabled) { + Write-Verbose "Argument sanitization disabled for $TaskName : '$PipelineFeatureFlagName' pipeline feature flag not enabled" + return $false + } + + return $true +} + +function Invoke-ScriptArgumentSanitization { + [CmdletBinding()] + param( + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [string]$InputArgs, + + [Parameter(Mandatory = $true)] + [string]$TaskName, + + [Parameter(Mandatory = $true)] + [string]$PipelineFeatureFlagName + ) + + if (-not (Test-ShouldUseSanitizer -TaskName $TaskName -PipelineFeatureFlagName $PipelineFeatureFlagName)) { + return + } + + try { + $null = Protect-ScriptArguments -InputArgs $InputArgs -TaskName $TaskName + } + catch { + $message = $_.Exception.Message + + # When the sanitizer rejects the input it throws the localized + # 'ScriptArgsSanitized' message - re-throw verbatim so the calling + # task fails with the same customer-facing text as PowerShellV2. + if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { + throw $message + } + + Publish-SanitizerErrorTelemetry -TaskName $TaskName -Telemetry @{ + 'UnexpectedError' = $message + 'ErrorStackTrace' = $_.Exception.StackTrace + } + } +} diff --git a/Tasks/Common/Sanitizer/Sanitizer.psm1 b/Tasks/Common/Sanitizer/Sanitizer.psm1 index 32d5220c1de0..dc2d92b0a53a 100644 --- a/Tasks/Common/Sanitizer/Sanitizer.psm1 +++ b/Tasks/Common/Sanitizer/Sanitizer.psm1 @@ -9,9 +9,13 @@ Import-VstsLocStrings -LiteralPath $PSScriptRoot/module.json # Don't source the private functions. . $PSScriptRoot/ArgumentsSanitizer.ps1 +. $PSScriptRoot/Invoke-ScriptArgumentSanitization.ps1 # Export public functions. Export-ModuleMember -Function Get-SanitizerFeatureFlags Export-ModuleMember -Function Get-SanitizerCallStatus Export-ModuleMember -Function Get-SanitizerActivateStatus -Export-ModuleMember -Function Protect-ScriptArguments \ No newline at end of file +Export-ModuleMember -Function Protect-ScriptArguments +Export-ModuleMember -Function Invoke-ScriptArgumentSanitization +Export-ModuleMember -Function Test-ShouldUseSanitizer +Export-ModuleMember -Function Publish-SanitizerErrorTelemetry \ No newline at end of file From c62ddd4a25fb59915390b7a7f137b9b3974494e1 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Mon, 11 May 2026 17:56:17 +0200 Subject: [PATCH 07/25] AzurePowerShellV2: use shared Invoke-ScriptArgumentSanitization + per-task pipeline FF MSRC 115118 / ICM 31000000596029. Mirrors the Should-UseSanitizedArguments / per-task pipeline FF pattern from PR #21947. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/AzurePowerShellV2/AzurePowerShell.ps1 | 34 +++++---------------- Tasks/AzurePowerShellV2/task.json | 2 +- Tasks/AzurePowerShellV2/task.loc.json | 2 +- 3 files changed, 9 insertions(+), 29 deletions(-) diff --git a/Tasks/AzurePowerShellV2/AzurePowerShell.ps1 b/Tasks/AzurePowerShellV2/AzurePowerShell.ps1 index 1cc2996ee9da..def1971491f8 100644 --- a/Tasks/AzurePowerShellV2/AzurePowerShell.ps1 +++ b/Tasks/AzurePowerShellV2/AzurePowerShell.ps1 @@ -3,13 +3,6 @@ Import-VstsLocStrings "$PSScriptRoot\Task.json" Import-Module $PSScriptRoot\ps_modules\Sanitizer -function Publish-Telemetry($telemetry) { - $area = 'TaskHub' - $feature = 'AzurePowerShellV2' - $telemetryJson = $telemetry | ConvertTo-Json -Compress - Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" -} - # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -31,27 +24,14 @@ if ($scriptArguments -match '[\r\n]') { } # Sanitize script arguments to prevent PowerShell command injection. -# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all -# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so -# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the -# matching pattern in Tasks/PowerShellV2/powershell.ps1. +# No-op unless BOTH the org-level "Enable shell tasks arguments validation" +# toggle and the per-task pipeline feature flag are enabled. +# See https://aka.ms/ado/75787 and Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1. if ($scriptType -ne "InlineScript") { - try { - $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV2" - } - catch { - $message = $_.Exception.Message - - if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { - throw $message; - } - - $telemetry = @{ - 'UnexpectedError' = $message - 'ErrorStackTrace' = $_.Exception.StackTrace - } - Publish-Telemetry $telemetry - } + Invoke-ScriptArgumentSanitization ` + -InputArgs $scriptArguments ` + -TaskName 'AzurePowerShellV2' ` + -PipelineFeatureFlagName 'EnableAzurePowerShellArgumentsSanitization' } # string constants diff --git a/Tasks/AzurePowerShellV2/task.json b/Tasks/AzurePowerShellV2/task.json index 00bfda70aacf..4070663eba93 100644 --- a/Tasks/AzurePowerShellV2/task.json +++ b/Tasks/AzurePowerShellV2/task.json @@ -18,7 +18,7 @@ "version": { "Major": 2, "Minor": 274, - "Patch": 1 + "Patch": 2 }, "demands": [ "azureps" diff --git a/Tasks/AzurePowerShellV2/task.loc.json b/Tasks/AzurePowerShellV2/task.loc.json index 4dc2a0b8a0fc..13d9e93ce7e3 100644 --- a/Tasks/AzurePowerShellV2/task.loc.json +++ b/Tasks/AzurePowerShellV2/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 2, "Minor": 274, - "Patch": 1 + "Patch": 2 }, "demands": [ "azureps" From b1d028e80e4bc2b8ba1aaf63d8c9bf249f9ef2c8 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Mon, 11 May 2026 17:56:17 +0200 Subject: [PATCH 08/25] AzurePowerShellV3: use shared Invoke-ScriptArgumentSanitization + per-task pipeline FF MSRC 115118 / ICM 31000000596029. Mirrors the Should-UseSanitizedArguments / per-task pipeline FF pattern from PR #21947. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/AzurePowerShellV3/AzurePowerShell.ps1 | 34 +++++---------------- Tasks/AzurePowerShellV3/task.json | 2 +- Tasks/AzurePowerShellV3/task.loc.json | 2 +- 3 files changed, 9 insertions(+), 29 deletions(-) diff --git a/Tasks/AzurePowerShellV3/AzurePowerShell.ps1 b/Tasks/AzurePowerShellV3/AzurePowerShell.ps1 index 95b3c69173a1..6cbcf131e00b 100644 --- a/Tasks/AzurePowerShellV3/AzurePowerShell.ps1 +++ b/Tasks/AzurePowerShellV3/AzurePowerShell.ps1 @@ -3,13 +3,6 @@ Import-VstsLocStrings "$PSScriptRoot\Task.json" Import-Module $PSScriptRoot\ps_modules\Sanitizer -function Publish-Telemetry($telemetry) { - $area = 'TaskHub' - $feature = 'AzurePowerShellV3' - $telemetryJson = $telemetry | ConvertTo-Json -Compress - Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" -} - # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -35,27 +28,14 @@ if ($scriptArguments -match '[\r\n]') { } # Sanitize script arguments to prevent PowerShell command injection. -# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all -# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so -# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the -# matching pattern in Tasks/PowerShellV2/powershell.ps1. +# No-op unless BOTH the org-level "Enable shell tasks arguments validation" +# toggle and the per-task pipeline feature flag are enabled. +# See https://aka.ms/ado/75787 and Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1. if ($scriptType -ne "InlineScript") { - try { - $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV3" - } - catch { - $message = $_.Exception.Message - - if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { - throw $message; - } - - $telemetry = @{ - 'UnexpectedError' = $message - 'ErrorStackTrace' = $_.Exception.StackTrace - } - Publish-Telemetry $telemetry - } + Invoke-ScriptArgumentSanitization ` + -InputArgs $scriptArguments ` + -TaskName 'AzurePowerShellV3' ` + -PipelineFeatureFlagName 'EnableAzurePowerShellArgumentsSanitization' } # string constants diff --git a/Tasks/AzurePowerShellV3/task.json b/Tasks/AzurePowerShellV3/task.json index ba60dd21668a..62ba216d2d44 100644 --- a/Tasks/AzurePowerShellV3/task.json +++ b/Tasks/AzurePowerShellV3/task.json @@ -18,7 +18,7 @@ "version": { "Major": 3, "Minor": 274, - "Patch": 1 + "Patch": 2 }, "releaseNotes": "Added support for Fail on standard error and ErrorActionPreference", "demands": [ diff --git a/Tasks/AzurePowerShellV3/task.loc.json b/Tasks/AzurePowerShellV3/task.loc.json index 7a721259b53c..841344c09f2f 100644 --- a/Tasks/AzurePowerShellV3/task.loc.json +++ b/Tasks/AzurePowerShellV3/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 3, "Minor": 274, - "Patch": 1 + "Patch": 2 }, "releaseNotes": "ms-resource:loc.releaseNotes", "demands": [ From 82208cdf61f1c39f3daf5816c4170ced392669da Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Mon, 11 May 2026 17:56:18 +0200 Subject: [PATCH 09/25] AzurePowerShellV4: use shared Invoke-ScriptArgumentSanitization + per-task pipeline FF MSRC 115118 / ICM 31000000596029. Mirrors the Should-UseSanitizedArguments / per-task pipeline FF pattern from PR #21947. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/AzurePowerShellV4/AzurePowerShell.ps1 | 34 ++++--------------- Tasks/AzurePowerShellV4/task.json | 2 +- Tasks/AzurePowerShellV4/task.loc.json | 2 +- _generated/AzurePowerShellV4.versionmap.txt | 4 +-- .../AzurePowerShellV4/AzurePowerShell.ps1 | 34 ++++--------------- _generated/AzurePowerShellV4/task.json | 6 ++-- _generated/AzurePowerShellV4/task.loc.json | 6 ++-- .../AzurePowerShell.ps1 | 34 ++++--------------- _generated/AzurePowerShellV4_Node24/task.json | 6 ++-- .../AzurePowerShellV4_Node24/task.loc.json | 6 ++-- 10 files changed, 37 insertions(+), 97 deletions(-) diff --git a/Tasks/AzurePowerShellV4/AzurePowerShell.ps1 b/Tasks/AzurePowerShellV4/AzurePowerShell.ps1 index 992a95b35633..f78178f87a31 100644 --- a/Tasks/AzurePowerShellV4/AzurePowerShell.ps1 +++ b/Tasks/AzurePowerShellV4/AzurePowerShell.ps1 @@ -3,13 +3,6 @@ Import-VstsLocStrings "$PSScriptRoot\Task.json" Import-Module $PSScriptRoot\ps_modules\Sanitizer -function Publish-Telemetry($telemetry) { - $area = 'TaskHub' - $feature = 'AzurePowerShellV4' - $telemetryJson = $telemetry | ConvertTo-Json -Compress - Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" -} - # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -38,27 +31,14 @@ if ($scriptArguments -match '[\r\n]') { } # Sanitize script arguments to prevent PowerShell command injection. -# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all -# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so -# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the -# matching pattern in Tasks/PowerShellV2/powershell.ps1. +# No-op unless BOTH the org-level "Enable shell tasks arguments validation" +# toggle and the per-task pipeline feature flag are enabled. +# See https://aka.ms/ado/75787 and Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1. if ($scriptType -ne "InlineScript") { - try { - $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV4" - } - catch { - $message = $_.Exception.Message - - if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { - throw $message; - } - - $telemetry = @{ - 'UnexpectedError' = $message - 'ErrorStackTrace' = $_.Exception.StackTrace - } - Publish-Telemetry $telemetry - } + Invoke-ScriptArgumentSanitization ` + -InputArgs $scriptArguments ` + -TaskName 'AzurePowerShellV4' ` + -PipelineFeatureFlagName 'EnableAzurePowerShellArgumentsSanitization' } # string constants diff --git a/Tasks/AzurePowerShellV4/task.json b/Tasks/AzurePowerShellV4/task.json index 164d78fb76bb..cb94d1581b87 100644 --- a/Tasks/AzurePowerShellV4/task.json +++ b/Tasks/AzurePowerShellV4/task.json @@ -18,7 +18,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 4 + "Patch": 6 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ diff --git a/Tasks/AzurePowerShellV4/task.loc.json b/Tasks/AzurePowerShellV4/task.loc.json index 3ed8488933a6..09c762c3f1ce 100644 --- a/Tasks/AzurePowerShellV4/task.loc.json +++ b/Tasks/AzurePowerShellV4/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 4 + "Patch": 6 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ diff --git a/_generated/AzurePowerShellV4.versionmap.txt b/_generated/AzurePowerShellV4.versionmap.txt index 3e1465cdc289..bd14f4389f43 100644 --- a/_generated/AzurePowerShellV4.versionmap.txt +++ b/_generated/AzurePowerShellV4.versionmap.txt @@ -1,2 +1,2 @@ -Default|4.274.4 -Node24_1|4.274.5 \ No newline at end of file +Default|4.274.6 +Node24_1|4.274.7 \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/AzurePowerShell.ps1 b/_generated/AzurePowerShellV4/AzurePowerShell.ps1 index 992a95b35633..f78178f87a31 100644 --- a/_generated/AzurePowerShellV4/AzurePowerShell.ps1 +++ b/_generated/AzurePowerShellV4/AzurePowerShell.ps1 @@ -3,13 +3,6 @@ Import-VstsLocStrings "$PSScriptRoot\Task.json" Import-Module $PSScriptRoot\ps_modules\Sanitizer -function Publish-Telemetry($telemetry) { - $area = 'TaskHub' - $feature = 'AzurePowerShellV4' - $telemetryJson = $telemetry | ConvertTo-Json -Compress - Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" -} - # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -38,27 +31,14 @@ if ($scriptArguments -match '[\r\n]') { } # Sanitize script arguments to prevent PowerShell command injection. -# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all -# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so -# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the -# matching pattern in Tasks/PowerShellV2/powershell.ps1. +# No-op unless BOTH the org-level "Enable shell tasks arguments validation" +# toggle and the per-task pipeline feature flag are enabled. +# See https://aka.ms/ado/75787 and Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1. if ($scriptType -ne "InlineScript") { - try { - $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV4" - } - catch { - $message = $_.Exception.Message - - if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { - throw $message; - } - - $telemetry = @{ - 'UnexpectedError' = $message - 'ErrorStackTrace' = $_.Exception.StackTrace - } - Publish-Telemetry $telemetry - } + Invoke-ScriptArgumentSanitization ` + -InputArgs $scriptArguments ` + -TaskName 'AzurePowerShellV4' ` + -PipelineFeatureFlagName 'EnableAzurePowerShellArgumentsSanitization' } # string constants diff --git a/_generated/AzurePowerShellV4/task.json b/_generated/AzurePowerShellV4/task.json index 1f700a3e275b..f06544366155 100644 --- a/_generated/AzurePowerShellV4/task.json +++ b/_generated/AzurePowerShellV4/task.json @@ -18,7 +18,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 4 + "Patch": 6 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ @@ -216,8 +216,8 @@ "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" }, "_buildConfigMapping": { - "Default": "4.274.4", + "Default": "4.274.6", "LocalPackages": "4.249.4", - "Node24_1": "4.274.5" + "Node24_1": "4.274.7" } } diff --git a/_generated/AzurePowerShellV4/task.loc.json b/_generated/AzurePowerShellV4/task.loc.json index 529abba3c19a..a878cd474ef6 100644 --- a/_generated/AzurePowerShellV4/task.loc.json +++ b/_generated/AzurePowerShellV4/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 4 + "Patch": 6 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ @@ -216,8 +216,8 @@ "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" }, "_buildConfigMapping": { - "Default": "4.274.4", + "Default": "4.274.6", "LocalPackages": "4.249.4", - "Node24_1": "4.274.5" + "Node24_1": "4.274.7" } } diff --git a/_generated/AzurePowerShellV4_Node24/AzurePowerShell.ps1 b/_generated/AzurePowerShellV4_Node24/AzurePowerShell.ps1 index 992a95b35633..f78178f87a31 100644 --- a/_generated/AzurePowerShellV4_Node24/AzurePowerShell.ps1 +++ b/_generated/AzurePowerShellV4_Node24/AzurePowerShell.ps1 @@ -3,13 +3,6 @@ Import-VstsLocStrings "$PSScriptRoot\Task.json" Import-Module $PSScriptRoot\ps_modules\Sanitizer -function Publish-Telemetry($telemetry) { - $area = 'TaskHub' - $feature = 'AzurePowerShellV4' - $telemetryJson = $telemetry | ConvertTo-Json -Compress - Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" -} - # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -38,27 +31,14 @@ if ($scriptArguments -match '[\r\n]') { } # Sanitize script arguments to prevent PowerShell command injection. -# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all -# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so -# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the -# matching pattern in Tasks/PowerShellV2/powershell.ps1. +# No-op unless BOTH the org-level "Enable shell tasks arguments validation" +# toggle and the per-task pipeline feature flag are enabled. +# See https://aka.ms/ado/75787 and Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1. if ($scriptType -ne "InlineScript") { - try { - $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV4" - } - catch { - $message = $_.Exception.Message - - if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { - throw $message; - } - - $telemetry = @{ - 'UnexpectedError' = $message - 'ErrorStackTrace' = $_.Exception.StackTrace - } - Publish-Telemetry $telemetry - } + Invoke-ScriptArgumentSanitization ` + -InputArgs $scriptArguments ` + -TaskName 'AzurePowerShellV4' ` + -PipelineFeatureFlagName 'EnableAzurePowerShellArgumentsSanitization' } # string constants diff --git a/_generated/AzurePowerShellV4_Node24/task.json b/_generated/AzurePowerShellV4_Node24/task.json index f5251615ed48..8342c56d12f2 100644 --- a/_generated/AzurePowerShellV4_Node24/task.json +++ b/_generated/AzurePowerShellV4_Node24/task.json @@ -18,7 +18,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 5 + "Patch": 7 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ @@ -220,8 +220,8 @@ "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" }, "_buildConfigMapping": { - "Default": "4.274.4", + "Default": "4.274.6", "LocalPackages": "4.249.4", - "Node24_1": "4.274.5" + "Node24_1": "4.274.7" } } diff --git a/_generated/AzurePowerShellV4_Node24/task.loc.json b/_generated/AzurePowerShellV4_Node24/task.loc.json index 4a682a1691e1..94f49b10491a 100644 --- a/_generated/AzurePowerShellV4_Node24/task.loc.json +++ b/_generated/AzurePowerShellV4_Node24/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 5 + "Patch": 7 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ @@ -220,8 +220,8 @@ "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" }, "_buildConfigMapping": { - "Default": "4.274.4", + "Default": "4.274.6", "LocalPackages": "4.249.4", - "Node24_1": "4.274.5" + "Node24_1": "4.274.7" } } From 5657b1546d0f4aacc244995ab6be77aae6350f29 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Mon, 11 May 2026 17:56:18 +0200 Subject: [PATCH 10/25] AzurePowerShellV5: use shared Invoke-ScriptArgumentSanitization + per-task pipeline FF MSRC 115118 / ICM 31000000596029. Mirrors the Should-UseSanitizedArguments / per-task pipeline FF pattern from PR #21947. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/AzurePowerShellV5/AzurePowerShell.ps1 | 34 ++++--------------- Tasks/AzurePowerShellV5/task.json | 2 +- Tasks/AzurePowerShellV5/task.loc.json | 2 +- _generated/AzurePowerShellV5.versionmap.txt | 4 +-- .../AzurePowerShellV5/AzurePowerShell.ps1 | 34 ++++--------------- _generated/AzurePowerShellV5/task.json | 6 ++-- _generated/AzurePowerShellV5/task.loc.json | 6 ++-- .../AzurePowerShell.ps1 | 34 ++++--------------- _generated/AzurePowerShellV5_Node24/task.json | 6 ++-- .../AzurePowerShellV5_Node24/task.loc.json | 6 ++-- 10 files changed, 37 insertions(+), 97 deletions(-) diff --git a/Tasks/AzurePowerShellV5/AzurePowerShell.ps1 b/Tasks/AzurePowerShellV5/AzurePowerShell.ps1 index 7f43919ceccd..360918c51907 100644 --- a/Tasks/AzurePowerShellV5/AzurePowerShell.ps1 +++ b/Tasks/AzurePowerShellV5/AzurePowerShell.ps1 @@ -3,13 +3,6 @@ Import-VstsLocStrings "$PSScriptRoot\Task.json" Import-Module $PSScriptRoot\ps_modules\Sanitizer -function Publish-Telemetry($telemetry) { - $area = 'TaskHub' - $feature = 'AzurePowerShellV5' - $telemetryJson = $telemetry | ConvertTo-Json -Compress - Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" -} - # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -40,27 +33,14 @@ if ($scriptArguments -match '[\r\n]') { } # Sanitize script arguments to prevent PowerShell command injection. -# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all -# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so -# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the -# matching pattern in Tasks/PowerShellV2/powershell.ps1. +# No-op unless BOTH the org-level "Enable shell tasks arguments validation" +# toggle and the per-task pipeline feature flag are enabled. +# See https://aka.ms/ado/75787 and Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1. if ($scriptType -ne "InlineScript") { - try { - $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV5" - } - catch { - $message = $_.Exception.Message - - if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { - throw $message; - } - - $telemetry = @{ - 'UnexpectedError' = $message - 'ErrorStackTrace' = $_.Exception.StackTrace - } - Publish-Telemetry $telemetry - } + Invoke-ScriptArgumentSanitization ` + -InputArgs $scriptArguments ` + -TaskName 'AzurePowerShellV5' ` + -PipelineFeatureFlagName 'EnableAzurePowerShellArgumentsSanitization' } # string constants diff --git a/Tasks/AzurePowerShellV5/task.json b/Tasks/AzurePowerShellV5/task.json index 0c3f682164c0..c2b88fecc4e5 100644 --- a/Tasks/AzurePowerShellV5/task.json +++ b/Tasks/AzurePowerShellV5/task.json @@ -18,7 +18,7 @@ "version": { "Major": 5, "Minor": 274, - "Patch": 4 + "Patch": 6 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ diff --git a/Tasks/AzurePowerShellV5/task.loc.json b/Tasks/AzurePowerShellV5/task.loc.json index ab75b784fb47..410ca2726b40 100644 --- a/Tasks/AzurePowerShellV5/task.loc.json +++ b/Tasks/AzurePowerShellV5/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 5, "Minor": 274, - "Patch": 4 + "Patch": 6 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ diff --git a/_generated/AzurePowerShellV5.versionmap.txt b/_generated/AzurePowerShellV5.versionmap.txt index 2202a401deb7..4f01f6bbfb8c 100644 --- a/_generated/AzurePowerShellV5.versionmap.txt +++ b/_generated/AzurePowerShellV5.versionmap.txt @@ -1,2 +1,2 @@ -Default|5.274.4 -Node24_1|5.274.5 +Default|5.274.6 +Node24_1|5.274.7 diff --git a/_generated/AzurePowerShellV5/AzurePowerShell.ps1 b/_generated/AzurePowerShellV5/AzurePowerShell.ps1 index 7f43919ceccd..360918c51907 100644 --- a/_generated/AzurePowerShellV5/AzurePowerShell.ps1 +++ b/_generated/AzurePowerShellV5/AzurePowerShell.ps1 @@ -3,13 +3,6 @@ Import-VstsLocStrings "$PSScriptRoot\Task.json" Import-Module $PSScriptRoot\ps_modules\Sanitizer -function Publish-Telemetry($telemetry) { - $area = 'TaskHub' - $feature = 'AzurePowerShellV5' - $telemetryJson = $telemetry | ConvertTo-Json -Compress - Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" -} - # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -40,27 +33,14 @@ if ($scriptArguments -match '[\r\n]') { } # Sanitize script arguments to prevent PowerShell command injection. -# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all -# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so -# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the -# matching pattern in Tasks/PowerShellV2/powershell.ps1. +# No-op unless BOTH the org-level "Enable shell tasks arguments validation" +# toggle and the per-task pipeline feature flag are enabled. +# See https://aka.ms/ado/75787 and Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1. if ($scriptType -ne "InlineScript") { - try { - $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV5" - } - catch { - $message = $_.Exception.Message - - if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { - throw $message; - } - - $telemetry = @{ - 'UnexpectedError' = $message - 'ErrorStackTrace' = $_.Exception.StackTrace - } - Publish-Telemetry $telemetry - } + Invoke-ScriptArgumentSanitization ` + -InputArgs $scriptArguments ` + -TaskName 'AzurePowerShellV5' ` + -PipelineFeatureFlagName 'EnableAzurePowerShellArgumentsSanitization' } # string constants diff --git a/_generated/AzurePowerShellV5/task.json b/_generated/AzurePowerShellV5/task.json index 9b82df395cf5..9d5c10bdd193 100644 --- a/_generated/AzurePowerShellV5/task.json +++ b/_generated/AzurePowerShellV5/task.json @@ -18,7 +18,7 @@ "version": { "Major": 5, "Minor": 274, - "Patch": 4 + "Patch": 6 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ @@ -210,8 +210,8 @@ "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" }, "_buildConfigMapping": { - "Default": "5.274.4", + "Default": "5.274.6", "LocalPackages": "5.249.4", - "Node24_1": "5.274.5" + "Node24_1": "5.274.7" } } diff --git a/_generated/AzurePowerShellV5/task.loc.json b/_generated/AzurePowerShellV5/task.loc.json index e4a207a1d1af..926485920442 100644 --- a/_generated/AzurePowerShellV5/task.loc.json +++ b/_generated/AzurePowerShellV5/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 5, "Minor": 274, - "Patch": 4 + "Patch": 6 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ @@ -210,8 +210,8 @@ "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" }, "_buildConfigMapping": { - "Default": "5.274.4", + "Default": "5.274.6", "LocalPackages": "5.249.4", - "Node24_1": "5.274.5" + "Node24_1": "5.274.7" } } diff --git a/_generated/AzurePowerShellV5_Node24/AzurePowerShell.ps1 b/_generated/AzurePowerShellV5_Node24/AzurePowerShell.ps1 index 7f43919ceccd..360918c51907 100644 --- a/_generated/AzurePowerShellV5_Node24/AzurePowerShell.ps1 +++ b/_generated/AzurePowerShellV5_Node24/AzurePowerShell.ps1 @@ -3,13 +3,6 @@ Import-VstsLocStrings "$PSScriptRoot\Task.json" Import-Module $PSScriptRoot\ps_modules\Sanitizer -function Publish-Telemetry($telemetry) { - $area = 'TaskHub' - $feature = 'AzurePowerShellV5' - $telemetryJson = $telemetry | ConvertTo-Json -Compress - Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" -} - # Get inputs. $scriptType = Get-VstsInput -Name ScriptType -Require $scriptPath = Get-VstsInput -Name ScriptPath @@ -40,27 +33,14 @@ if ($scriptArguments -match '[\r\n]') { } # Sanitize script arguments to prevent PowerShell command injection. -# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all -# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so -# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the -# matching pattern in Tasks/PowerShellV2/powershell.ps1. +# No-op unless BOTH the org-level "Enable shell tasks arguments validation" +# toggle and the per-task pipeline feature flag are enabled. +# See https://aka.ms/ado/75787 and Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1. if ($scriptType -ne "InlineScript") { - try { - $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "AzurePowerShellV5" - } - catch { - $message = $_.Exception.Message - - if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { - throw $message; - } - - $telemetry = @{ - 'UnexpectedError' = $message - 'ErrorStackTrace' = $_.Exception.StackTrace - } - Publish-Telemetry $telemetry - } + Invoke-ScriptArgumentSanitization ` + -InputArgs $scriptArguments ` + -TaskName 'AzurePowerShellV5' ` + -PipelineFeatureFlagName 'EnableAzurePowerShellArgumentsSanitization' } # string constants diff --git a/_generated/AzurePowerShellV5_Node24/task.json b/_generated/AzurePowerShellV5_Node24/task.json index 60f977f90b11..40b2b3fcf9db 100644 --- a/_generated/AzurePowerShellV5_Node24/task.json +++ b/_generated/AzurePowerShellV5_Node24/task.json @@ -18,7 +18,7 @@ "version": { "Major": 5, "Minor": 274, - "Patch": 5 + "Patch": 7 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ @@ -214,8 +214,8 @@ "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" }, "_buildConfigMapping": { - "Default": "5.274.4", + "Default": "5.274.6", "LocalPackages": "5.249.4", - "Node24_1": "5.274.5" + "Node24_1": "5.274.7" } } diff --git a/_generated/AzurePowerShellV5_Node24/task.loc.json b/_generated/AzurePowerShellV5_Node24/task.loc.json index 9a999f00e1e7..995507ba87f8 100644 --- a/_generated/AzurePowerShellV5_Node24/task.loc.json +++ b/_generated/AzurePowerShellV5_Node24/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 5, "Minor": 274, - "Patch": 5 + "Patch": 7 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ @@ -214,8 +214,8 @@ "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" }, "_buildConfigMapping": { - "Default": "5.274.4", + "Default": "5.274.6", "LocalPackages": "5.249.4", - "Node24_1": "5.274.5" + "Node24_1": "5.274.7" } } From b12e4131333b5c16c0c964bd2886d2b63c68fa7e Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Mon, 11 May 2026 17:56:18 +0200 Subject: [PATCH 11/25] ServiceFabricPowerShellV1: use shared Invoke-ScriptArgumentSanitization + per-task pipeline FF MSRC 115118 / ICM 31000000596029. Mirrors the Should-UseSanitizedArguments / per-task pipeline FF pattern from PR #21947. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../ServiceFabricPowerShell.ps1 | 34 ++++--------------- Tasks/ServiceFabricPowerShellV1/task.json | 2 +- Tasks/ServiceFabricPowerShellV1/task.loc.json | 2 +- 3 files changed, 9 insertions(+), 29 deletions(-) diff --git a/Tasks/ServiceFabricPowerShellV1/ServiceFabricPowerShell.ps1 b/Tasks/ServiceFabricPowerShellV1/ServiceFabricPowerShell.ps1 index 73bf597a6440..e457857172ff 100644 --- a/Tasks/ServiceFabricPowerShellV1/ServiceFabricPowerShell.ps1 +++ b/Tasks/ServiceFabricPowerShellV1/ServiceFabricPowerShell.ps1 @@ -5,13 +5,6 @@ Import-VstsLocStrings "$PSScriptRoot\Task.json" Import-Module $PSScriptRoot\ps_modules\Sanitizer -function Publish-SanitizerTelemetry($telemetry) { - $area = 'TaskHub' - $feature = 'ServiceFabricPowerShellV1' - $telemetryJson = $telemetry | ConvertTo-Json -Compress - Write-Host "##vso[telemetry.publish area=$area;feature=$feature]$telemetryJson" -} - # Get inputs. $serviceConnectionName = Get-VstsInput -Name serviceConnectionName -Require $scriptType = Get-VstsInput -Name ScriptType -Require @@ -38,27 +31,14 @@ if ($scriptArguments -match '[\r\n]') } # Sanitize script arguments to prevent PowerShell command injection. -# Gated by the AZP_75787_* feature flags (Activate / Log / Collect). When all -# flags are unset (default) Protect-ScriptArguments is effectively a no-op, so -# existing pipelines are unaffected. See https://aka.ms/ado/75787 and the -# matching pattern in Tasks/PowerShellV2/powershell.ps1. +# No-op unless BOTH the org-level "Enable shell tasks arguments validation" +# toggle and the per-task pipeline feature flag are enabled. +# See https://aka.ms/ado/75787 and Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1. if ($scriptType -ne "InlineScript") { - try { - $null = Protect-ScriptArguments -InputArgs $scriptArguments -TaskName "ServiceFabricPowerShellV1" - } - catch { - $message = $_.Exception.Message - - if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { - throw $message; - } - - $telemetry = @{ - 'UnexpectedError' = $message - 'ErrorStackTrace' = $_.Exception.StackTrace - } - Publish-SanitizerTelemetry $telemetry - } + Invoke-ScriptArgumentSanitization ` + -InputArgs $scriptArguments ` + -TaskName 'ServiceFabricPowerShellV1' ` + -PipelineFeatureFlagName 'EnableServiceFabricPowerShellArgumentsSanitization' } $certificate = $null diff --git a/Tasks/ServiceFabricPowerShellV1/task.json b/Tasks/ServiceFabricPowerShellV1/task.json index f9b6e38b2636..d767af894991 100644 --- a/Tasks/ServiceFabricPowerShellV1/task.json +++ b/Tasks/ServiceFabricPowerShellV1/task.json @@ -18,7 +18,7 @@ "version": { "Major": 1, "Minor": 228, - "Patch": 1 + "Patch": 2 }, "demands": [ "Cmd" diff --git a/Tasks/ServiceFabricPowerShellV1/task.loc.json b/Tasks/ServiceFabricPowerShellV1/task.loc.json index 287988ed7c33..ddc714346f61 100644 --- a/Tasks/ServiceFabricPowerShellV1/task.loc.json +++ b/Tasks/ServiceFabricPowerShellV1/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 1, "Minor": 228, - "Patch": 1 + "Patch": 2 }, "demands": [ "Cmd" From 761b76242b863f460655c60963144279babbc3fd Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Tue, 12 May 2026 16:10:36 +0200 Subject: [PATCH 12/25] Common/Sanitizer: add L0 tests for Invoke-ScriptArgumentSanitization dispatcher Covers the new dispatcher introduced by PR #22163 (MSRC 115118): - Test-ShouldUseSanitizer gate logic across all combinations of org-level`n toggle (Get-SanitizerCallStatus) and per-task pipeline FF (Get-VstsPipelineFeature), including throw, missing-cmdlet, and audit fallthrough. - Invoke-ScriptArgumentSanitization dispatch: no-op when either gate is off; passes through clean args; re-throws localized ScriptArgsSanitized verbatim; swallows unexpected sanitizer exceptions into telemetry; handles empty input. - Publish-SanitizerErrorTelemetry emits the expected ##vso[telemetry.publish] command shape. Follows the precedent set by PR #21947's Tasks/SqlAzureDacpacDeploymentV1/Tests/L0SecurityFunctions.ps1. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/Common/Sanitizer/Tests/L0.ts | 6 + .../L0Invoke-ScriptArgumentSanitization.ps1 | 148 ++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 diff --git a/Tasks/Common/Sanitizer/Tests/L0.ts b/Tasks/Common/Sanitizer/Tests/L0.ts index f12e8ee48a83..51e994cbde1d 100644 --- a/Tasks/Common/Sanitizer/Tests/L0.ts +++ b/Tasks/Common/Sanitizer/Tests/L0.ts @@ -64,4 +64,10 @@ describe('Security Suite', function () { psr.run(path.join(__dirname, 'L0Expand-EnvVariables.ps1'), done); }); } + + if (psm.testSupported()) { + it('Invoke-ScriptArgumentSanitization dispatcher (FF gates, error handling, telemetry)', (done) => { + psr.run(path.join(__dirname, 'L0Invoke-ScriptArgumentSanitization.ps1'), done); + }); + } }); diff --git a/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 b/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 new file mode 100644 index 000000000000..87ae59f5665a --- /dev/null +++ b/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 @@ -0,0 +1,148 @@ +# Unit tests for Invoke-ScriptArgumentSanitization dispatcher (added by MSRC 115118 / PR #22163). +# +# Mirrors the precedent set by Tasks/SqlAzureDacpacDeploymentV1/Tests/L0SecurityFunctions.ps1 +# (PR #21947): each scenario configures Register-Mock for Get-SanitizerCallStatus, +# Get-Command (for the Get-VstsPipelineFeature presence check), Get-VstsPipelineFeature, +# and Protect-ScriptArguments, then drives the dispatcher and asserts. +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\..\Invoke-ScriptArgumentSanitization.ps1 + +$taskName = 'AzurePowerShellV5' +$pipelineFlag = 'EnableAzurePowerShellArgumentsSanitization' +$cleanArgs = '-Param1 value1 -Param2 value2' +$dirtyArgs = 'test; whoami' + +function Reset-AllMocks { + foreach ($name in @('Get-SanitizerCallStatus','Get-Command','Get-VstsPipelineFeature','Protect-ScriptArguments','Write-Host')) { + Unregister-Mock $name -ErrorAction SilentlyContinue + } +} + +# ============================================================================ +# Test-ShouldUseSanitizer - gating logic +# ============================================================================ + +# --- Org-level FF off => returns $false (and no pipeline FF query happens) --- +Reset-AllMocks +Register-Mock Get-SanitizerCallStatus { return $false } +Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } +Register-Mock Get-VstsPipelineFeature { return $true } + +$result = Test-ShouldUseSanitizer -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag +Assert-AreEqual $false $result "Org-level FF off should short-circuit to false" +Assert-WasCalled Get-VstsPipelineFeature -Times 0 + +# --- Org on, pipeline FF off => returns $false --- +Reset-AllMocks +Register-Mock Get-SanitizerCallStatus { return $true } +Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } +Register-Mock Get-VstsPipelineFeature { return $false } -ParametersEvaluator { $FeatureName -eq $pipelineFlag } + +$result = Test-ShouldUseSanitizer -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag +Assert-AreEqual $false $result "Pipeline FF off should yield false" + +# --- Org on, pipeline FF on => returns $true --- +Reset-AllMocks +Register-Mock Get-SanitizerCallStatus { return $true } +Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } +Register-Mock Get-VstsPipelineFeature { return $true } -ParametersEvaluator { $FeatureName -eq $pipelineFlag } + +$result = Test-ShouldUseSanitizer -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag +Assert-AreEqual $true $result "Both FFs on should yield true" + +# --- Org-level check throws => returns $false (graceful fallback) --- +Reset-AllMocks +Register-Mock Get-SanitizerCallStatus { throw "Service unavailable" } + +$result = Test-ShouldUseSanitizer -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag +Assert-AreEqual $false $result "Org-level check throw should fall open to false" + +# --- Get-VstsPipelineFeature cmdlet missing => returns $false, emits cmdletMissing telemetry --- +Reset-AllMocks +Register-Mock Get-SanitizerCallStatus { return $true } +Register-Mock Get-Command { return $null } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } + +$result = Test-ShouldUseSanitizer -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag +Assert-AreEqual $false $result "Missing Get-VstsPipelineFeature cmdlet should yield false" + +# --- Pipeline-level FF query throws => returns $false --- +Reset-AllMocks +Register-Mock Get-SanitizerCallStatus { return $true } +Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } +Register-Mock Get-VstsPipelineFeature { throw "Feature service down" } + +$result = Test-ShouldUseSanitizer -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag +Assert-AreEqual $false $result "Pipeline FF query throw should fall open to false" + +# ============================================================================ +# Invoke-ScriptArgumentSanitization - dispatch behavior +# ============================================================================ + +# --- Gates off => Protect-ScriptArguments never called --- +Reset-AllMocks +Register-Mock Get-SanitizerCallStatus { return $false } +Register-Mock Protect-ScriptArguments { return $args[0] } + +Invoke-ScriptArgumentSanitization -InputArgs $dirtyArgs -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag +Assert-WasCalled Protect-ScriptArguments -Times 0 + +# --- Gates on + clean args => Protect-ScriptArguments called once, no throw --- +Reset-AllMocks +Register-Mock Get-SanitizerCallStatus { return $true } +Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } +Register-Mock Get-VstsPipelineFeature { return $true } -ParametersEvaluator { $FeatureName -eq $pipelineFlag } +Register-Mock Protect-ScriptArguments { return '' } + +Invoke-ScriptArgumentSanitization -InputArgs $cleanArgs -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag +Assert-WasCalled Protect-ScriptArguments -Times 1 + +# --- Gates on + dirty args => Protect-ScriptArguments throws 'ScriptArgsSanitized' => re-thrown verbatim --- +# Initialize-Test.ps1 mocks Get-VstsLocString to return the key, so the localized message is 'ScriptArgsSanitized'. +Reset-AllMocks +Register-Mock Get-SanitizerCallStatus { return $true } +Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } +Register-Mock Get-VstsPipelineFeature { return $true } -ParametersEvaluator { $FeatureName -eq $pipelineFlag } +Register-Mock Protect-ScriptArguments { throw 'ScriptArgsSanitized' } + +Assert-Throws { + Invoke-ScriptArgumentSanitization -InputArgs $dirtyArgs -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag +} -MessagePattern 'ScriptArgsSanitized' + +# --- Gates on + Protect-ScriptArguments throws unexpected error => swallowed (no throw) --- +Reset-AllMocks +Register-Mock Get-SanitizerCallStatus { return $true } +Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } +Register-Mock Get-VstsPipelineFeature { return $true } -ParametersEvaluator { $FeatureName -eq $pipelineFlag } +Register-Mock Protect-ScriptArguments { throw 'Unexpected internal error' } + +try { + Invoke-ScriptArgumentSanitization -InputArgs $dirtyArgs -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag +} +catch { + throw "Unexpected sanitizer error should have been swallowed into telemetry, but caller saw: $($_.Exception.Message)" +} + +# --- Empty input is allowed (parameter has [AllowEmptyString()]) --- +Reset-AllMocks +Register-Mock Get-SanitizerCallStatus { return $true } +Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } +Register-Mock Get-VstsPipelineFeature { return $true } -ParametersEvaluator { $FeatureName -eq $pipelineFlag } +Register-Mock Protect-ScriptArguments { return $args[0] } + +Invoke-ScriptArgumentSanitization -InputArgs '' -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag +Assert-WasCalled Protect-ScriptArguments -Times 1 + +# ============================================================================ +# Publish-SanitizerErrorTelemetry - emits ##vso[telemetry.publish] command +# ============================================================================ + +Reset-AllMocks + +Assert-Output ` + -ScriptBlock { Publish-SanitizerErrorTelemetry -TaskName $taskName -Telemetry @{ checkType = 'OrgLevelFeatureFlag'; checkFailed = $true } } ` + -ExpectedOutput "##vso\[telemetry\.publish area=TaskHub;feature=$taskName\].*checkType.*OrgLevelFeatureFlag.*checkFailed.*true" + +Reset-AllMocks From 7b6762cd6c5b48227245ab2ec0d5cfd34cbc7023 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Tue, 12 May 2026 16:48:52 +0200 Subject: [PATCH 13/25] Common/Sanitizer: dispatcher fails closed instead of message-comparing for re-throw The previous implementation caught any exception from Protect-ScriptArguments and compared its message to Get-VstsLocString -Key 'ScriptArgsSanitized' to decide whether to re-throw (rejection) or swallow into telemetry (unexpected error). Two problems: 1. Protect-ScriptArguments throws Get-VstsLocString -Key 'PS_ScriptArgsSanitized' resolved from the Sanitizer module's resjson, while the dispatcher compared against 'ScriptArgsSanitized' resolved from the task's resjson. The two strings are translated independently. fr-FR uses 'coche' in one and 'backtick' in the other, so on a French agent the -eq comparison returned false and a real sanitizer rejection was silently swallowed into telemetry - the task continued executing the injected arguments. The en-US strings happen to be identical, which is why this latent bug went unnoticed. 2. Even when Protect-ScriptArguments crashes with an unrelated error, the safer default for a security gate is to fail the task rather than execute un-vetted arguments. The dispatcher now fails closed: any exception out of Protect-ScriptArguments produces a telemetry record with the underlying message + stack and re-throws the task-localized 'ScriptArgsSanitized' message to the caller. No locale- dependent string comparison remains. Tests cover all three throw paths (matching message, locale-drifted message, unexpected crash) - all must fail closed with 'ScriptArgsSanitized'. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Invoke-ScriptArgumentSanitization.ps1 | 37 ++++++++++++++----- .../L0Invoke-ScriptArgumentSanitization.ps1 | 35 +++++++++++++----- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 b/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 index 8de506be6494..e2e6f72fd854 100644 --- a/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 +++ b/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 @@ -108,22 +108,39 @@ function Invoke-ScriptArgumentSanitization { return } + # Fail closed: ANY exception from Protect-ScriptArguments means the + # sanitization gate did not pass cleanly, so abort the task. + # + # We deliberately do NOT compare $_.Exception.Message to a localized + # 'ScriptArgsSanitized' value to distinguish "rejection" from + # "unexpected crash": + # * The Sanitizer module throws Get-VstsLocString -Key 'PS_ScriptArgsSanitized' + # while the task resjson uses key 'ScriptArgsSanitized'. Translators + # localized the two strings independently (e.g. fr-FR uses "coche" in + # one and "backtick" in the other), so -eq is unreliable in any locale + # where the strings diverge, which would let a sanitizer rejection + # slip into a "swallow into telemetry" branch and bypass the gate. + # * Even if the sanitizer crashed with an unrelated error, executing + # the un-vetted arguments is exactly the vulnerability we are guarding + # against. Failing closed is the safer default. + $sanitizerThrew = $false + $caughtMessage = $null + $caughtStack = $null try { $null = Protect-ScriptArguments -InputArgs $InputArgs -TaskName $TaskName } catch { - $message = $_.Exception.Message - - # When the sanitizer rejects the input it throws the localized - # 'ScriptArgsSanitized' message - re-throw verbatim so the calling - # task fails with the same customer-facing text as PowerShellV2. - if ($message -eq (Get-VstsLocString -Key 'ScriptArgsSanitized')) { - throw $message - } + $sanitizerThrew = $true + $caughtMessage = $_.Exception.Message + $caughtStack = $_.Exception.StackTrace + } + if ($sanitizerThrew) { Publish-SanitizerErrorTelemetry -TaskName $TaskName -Telemetry @{ - 'UnexpectedError' = $message - 'ErrorStackTrace' = $_.Exception.StackTrace + sanitizerThrew = $true + errorMessage = $caughtMessage + errorStackTrace = $caughtStack } + throw (Get-VstsLocString -Key 'ScriptArgsSanitized') } } diff --git a/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 b/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 index 87ae59f5665a..5eb32d872887 100644 --- a/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 +++ b/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 @@ -99,31 +99,48 @@ Register-Mock Protect-ScriptArguments { return '' } Invoke-ScriptArgumentSanitization -InputArgs $cleanArgs -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag Assert-WasCalled Protect-ScriptArguments -Times 1 -# --- Gates on + dirty args => Protect-ScriptArguments throws 'ScriptArgsSanitized' => re-thrown verbatim --- -# Initialize-Test.ps1 mocks Get-VstsLocString to return the key, so the localized message is 'ScriptArgsSanitized'. +# --- Gates on + dirty args => Protect-ScriptArguments throws => dispatcher fails closed +# with the task-localized 'ScriptArgsSanitized' message regardless of the +# message the underlying sanitizer produced. --- +# Initialize-Test.ps1 mocks Get-VstsLocString to return the key, so the localized +# message is 'ScriptArgsSanitized'. Reset-AllMocks Register-Mock Get-SanitizerCallStatus { return $true } Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } Register-Mock Get-VstsPipelineFeature { return $true } -ParametersEvaluator { $FeatureName -eq $pipelineFlag } -Register-Mock Protect-ScriptArguments { throw 'ScriptArgsSanitized' } +Register-Mock Protect-ScriptArguments { throw 'PS_ScriptArgsSanitized' } # what the Sanitizer module actually throws Assert-Throws { Invoke-ScriptArgumentSanitization -InputArgs $dirtyArgs -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag } -MessagePattern 'ScriptArgsSanitized' -# --- Gates on + Protect-ScriptArguments throws unexpected error => swallowed (no throw) --- +# --- Locale-drift hardening: even if the underlying sanitizer throws a +# localized message that does NOT match the task's 'ScriptArgsSanitized' +# value (e.g. fr-FR "coche" vs "backtick" wording), the dispatcher must +# still fail closed. This guards against the original bug where -eq +# against Get-VstsLocString silently let injection through in non-en +# locales. --- +Reset-AllMocks +Register-Mock Get-SanitizerCallStatus { return $true } +Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } +Register-Mock Get-VstsPipelineFeature { return $true } -ParametersEvaluator { $FeatureName -eq $pipelineFlag } +Register-Mock Protect-ScriptArguments { throw "Caracteres detectes dans les arguments..." } + +Assert-Throws { + Invoke-ScriptArgumentSanitization -InputArgs $dirtyArgs -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag +} -MessagePattern 'ScriptArgsSanitized' + +# --- Fail-closed semantics: an unexpected sanitizer crash must NOT silently +# let the task continue with un-vetted args. Re-thrown as ScriptArgsSanitized. --- Reset-AllMocks Register-Mock Get-SanitizerCallStatus { return $true } Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } Register-Mock Get-VstsPipelineFeature { return $true } -ParametersEvaluator { $FeatureName -eq $pipelineFlag } Register-Mock Protect-ScriptArguments { throw 'Unexpected internal error' } -try { +Assert-Throws { Invoke-ScriptArgumentSanitization -InputArgs $dirtyArgs -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag -} -catch { - throw "Unexpected sanitizer error should have been swallowed into telemetry, but caller saw: $($_.Exception.Message)" -} +} -MessagePattern 'ScriptArgsSanitized' # --- Empty input is allowed (parameter has [AllowEmptyString()]) --- Reset-AllMocks From fe608119f1c3c306d00c4dde3779d6871b7ca300 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Wed, 13 May 2026 09:33:27 +0200 Subject: [PATCH 14/25] Fix stray comma on its own line in V5 resjson files (PR review feedback) Rebase auto-resolve introduced a 'comma on own line' formatting glitch in all AzurePowerShellV5 locale resources.resjson files (and the V5 generated mirrors). Moves the comma to the end of the preceding line, matching the rest of the resjson format and addressing review feedback from @nemanjarogic. No content / behavior change. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Strings/resources.resjson/de-DE/resources.resjson | 3 +-- .../Strings/resources.resjson/es-ES/resources.resjson | 3 +-- .../Strings/resources.resjson/fr-FR/resources.resjson | 3 +-- .../Strings/resources.resjson/it-IT/resources.resjson | 3 +-- .../Strings/resources.resjson/ja-JP/resources.resjson | 3 +-- .../Strings/resources.resjson/ko-KR/resources.resjson | 3 +-- .../Strings/resources.resjson/ru-RU/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-CN/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-TW/resources.resjson | 3 +-- .../Strings/resources.resjson/de-DE/resources.resjson | 3 +-- .../Strings/resources.resjson/es-ES/resources.resjson | 3 +-- .../Strings/resources.resjson/fr-FR/resources.resjson | 3 +-- .../Strings/resources.resjson/it-IT/resources.resjson | 3 +-- .../Strings/resources.resjson/ja-JP/resources.resjson | 3 +-- .../Strings/resources.resjson/ko-KR/resources.resjson | 3 +-- .../Strings/resources.resjson/ru-RU/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-CN/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-TW/resources.resjson | 3 +-- .../Strings/resources.resjson/de-DE/resources.resjson | 3 +-- .../Strings/resources.resjson/es-ES/resources.resjson | 3 +-- .../Strings/resources.resjson/fr-FR/resources.resjson | 3 +-- .../Strings/resources.resjson/it-IT/resources.resjson | 3 +-- .../Strings/resources.resjson/ja-JP/resources.resjson | 3 +-- .../Strings/resources.resjson/ko-KR/resources.resjson | 3 +-- .../Strings/resources.resjson/ru-RU/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-CN/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-TW/resources.resjson | 3 +-- 27 files changed, 27 insertions(+), 54 deletions(-) diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson index 9b987da116b6..7a9e97cb6756 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", "loc.messages.PS_ExitCode": "PowerShell wurde beendet mit dem Code \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}" -, + "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}", "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson index 7350edd0d428..b6a1fc1d44c3 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell escribió una o varias líneas en la secuencia de error estándar.", "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", "loc.messages.PS_ExitCode": "PowerShell se cerró con el código \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}" -, + "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}", "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson index 25081ca9ab98..2f5f02c388f9 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", "loc.messages.PS_ExitCode": "Arrêt de PowerShell. Code de sortie : '{0}'.", - "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}" -, + "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}", "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson index 50c9ccda8d39..57f487484097 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell ha scritto una o più righe nel flusso di errore standard.", "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", "loc.messages.PS_ExitCode": "PowerShell terminato con codice '{0}'.", - "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}" -, + "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}", "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson index a63378aa71b0..8b83a0d4a3c9 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell が標準エラー ストリームに 1 行以上を書き込みました。", "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", "loc.messages.PS_ExitCode": "PowerShell がコード '{0}' で終了しました。", - "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です" -, + "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です", "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson index 606ebb338d04..a548a581e5f1 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell이 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", "loc.messages.PS_ExitCode": "PowerShell이 코드 '{0}'(으)로 종료되었습니다.", - "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다." -, + "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다.", "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson index 12afd3e9009b..e05c6308f03b 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "Оболочка PowerShell записала одну или несколько строк в стандартный поток ошибок.", "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", "loc.messages.PS_ExitCode": "Завершение работы PowerShell с кодом \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}" -, + "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}", "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson index dc1d38ef02ce..6b713587eb06 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell 向标准错误流写入一个或多个行。", "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", "loc.messages.PS_ExitCode": "PowerShell 已退出,代码为“{0}”。", - "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}" -, + "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}", "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson index 71ff0258a089..7cd24fddf52c 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell 已將一或多行寫入標準錯誤資料流。", "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", "loc.messages.PS_ExitCode": "PowerShell 已結束,代碼為 '{0}'。", - "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}" -, + "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}", "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson index 9b987da116b6..7a9e97cb6756 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", "loc.messages.PS_ExitCode": "PowerShell wurde beendet mit dem Code \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}" -, + "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}", "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson index 7350edd0d428..b6a1fc1d44c3 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell escribió una o varias líneas en la secuencia de error estándar.", "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", "loc.messages.PS_ExitCode": "PowerShell se cerró con el código \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}" -, + "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}", "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson index 25081ca9ab98..2f5f02c388f9 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", "loc.messages.PS_ExitCode": "Arrêt de PowerShell. Code de sortie : '{0}'.", - "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}" -, + "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}", "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson index 50c9ccda8d39..57f487484097 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell ha scritto una o più righe nel flusso di errore standard.", "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", "loc.messages.PS_ExitCode": "PowerShell terminato con codice '{0}'.", - "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}" -, + "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}", "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson index a63378aa71b0..8b83a0d4a3c9 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell が標準エラー ストリームに 1 行以上を書き込みました。", "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", "loc.messages.PS_ExitCode": "PowerShell がコード '{0}' で終了しました。", - "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です" -, + "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です", "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson index 606ebb338d04..a548a581e5f1 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell이 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", "loc.messages.PS_ExitCode": "PowerShell이 코드 '{0}'(으)로 종료되었습니다.", - "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다." -, + "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다.", "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson index 12afd3e9009b..e05c6308f03b 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "Оболочка PowerShell записала одну или несколько строк в стандартный поток ошибок.", "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", "loc.messages.PS_ExitCode": "Завершение работы PowerShell с кодом \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}" -, + "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}", "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson index dc1d38ef02ce..6b713587eb06 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell 向标准错误流写入一个或多个行。", "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", "loc.messages.PS_ExitCode": "PowerShell 已退出,代码为“{0}”。", - "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}" -, + "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}", "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson index 71ff0258a089..7cd24fddf52c 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell 已將一或多行寫入標準錯誤資料流。", "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", "loc.messages.PS_ExitCode": "PowerShell 已結束,代碼為 '{0}'。", - "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}" -, + "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}", "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/de-DE/resources.resjson index 9b987da116b6..7a9e97cb6756 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/de-DE/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/de-DE/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", "loc.messages.PS_ExitCode": "PowerShell wurde beendet mit dem Code \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}" -, + "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}", "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/es-ES/resources.resjson index 7350edd0d428..b6a1fc1d44c3 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/es-ES/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/es-ES/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell escribió una o varias líneas en la secuencia de error estándar.", "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", "loc.messages.PS_ExitCode": "PowerShell se cerró con el código \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}" -, + "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}", "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/fr-FR/resources.resjson index 25081ca9ab98..2f5f02c388f9 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/fr-FR/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/fr-FR/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", "loc.messages.PS_ExitCode": "Arrêt de PowerShell. Code de sortie : '{0}'.", - "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}" -, + "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}", "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/it-IT/resources.resjson index 50c9ccda8d39..57f487484097 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/it-IT/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/it-IT/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell ha scritto una o più righe nel flusso di errore standard.", "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", "loc.messages.PS_ExitCode": "PowerShell terminato con codice '{0}'.", - "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}" -, + "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}", "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ja-JP/resources.resjson index a63378aa71b0..8b83a0d4a3c9 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ja-JP/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ja-JP/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell が標準エラー ストリームに 1 行以上を書き込みました。", "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", "loc.messages.PS_ExitCode": "PowerShell がコード '{0}' で終了しました。", - "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です" -, + "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です", "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ko-KR/resources.resjson index 606ebb338d04..a548a581e5f1 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ko-KR/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ko-KR/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell이 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", "loc.messages.PS_ExitCode": "PowerShell이 코드 '{0}'(으)로 종료되었습니다.", - "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다." -, + "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다.", "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ru-RU/resources.resjson index 12afd3e9009b..e05c6308f03b 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ru-RU/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ru-RU/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "Оболочка PowerShell записала одну или несколько строк в стандартный поток ошибок.", "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", "loc.messages.PS_ExitCode": "Завершение работы PowerShell с кодом \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}" -, + "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}", "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-CN/resources.resjson index dc1d38ef02ce..6b713587eb06 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-CN/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-CN/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell 向标准错误流写入一个或多个行。", "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", "loc.messages.PS_ExitCode": "PowerShell 已退出,代码为“{0}”。", - "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}" -, + "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}", "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-TW/resources.resjson index 71ff0258a089..7cd24fddf52c 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-TW/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-TW/resources.resjson @@ -39,7 +39,6 @@ "loc.messages.JS_Stderr": "PowerShell 已將一或多行寫入標準錯誤資料流。", "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", "loc.messages.PS_ExitCode": "PowerShell 已結束,代碼為 '{0}'。", - "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}" -, + "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}", "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" } \ No newline at end of file From 75bacf8c788bdcc5f0c1b4061a2cac595202722e Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Wed, 13 May 2026 13:00:09 +0200 Subject: [PATCH 15/25] Bump versions of 12 Common/Sanitizer-dependent tasks (CI policy) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MSRC 115118 added a new file (Invoke-ScriptArgumentSanitization.ps1) to Tasks/Common/Sanitizer/. ci/filter-tasks.js requires every task whose Common dependencies change to have its own version bumped, otherwise the 'Filter out unchanged tasks' build step fails with 'The following tasks should have their versions bumped due to changes in common: ...'. This matches the precedent established by PR #19834 (Add audit event for Shell Tasks Validation warnings), which made a similar Common/Sanitizer change and bumped the same set of consumer tasks. Bumps (patch +1, except where the existing _generated mirror's maxVersion already exceeded source — in those cases bumped to maxVersion+1 to satisfy BuildConfigGen's monotonicity invariant): AzureFileCopyV1 1.274.0 -> 1.274.1 AzureFileCopyV2 2.274.0 -> 2.274.1 AzureFileCopyV3 3.274.0 -> 3.274.1 AzureFileCopyV4 4.274.0 -> 4.274.2 (Node24_1 was already 4.274.1) AzureFileCopyV5 5.274.0 -> 5.274.2 (Node24_1was already 5.274.1) AzureFileCopyV6 6.274.2 -> 6.274.4 (Node24_1 was already 6.274.3) PowerShellV2 2.274.0 -> 2.274.1 PowerShellOnTargetMachinesV3 3.273.0 -> 3.273.1 SqlAzureDacpacDeploymentV1 1.274.0 -> 1.274.1 SqlDacpacDeploymentOnMachineGroupV0 0.274.0 -> 0.274.1 WindowsMachineFileCopyV1 1.243.0 -> 1.243.1 WindowsMachineFileCopyV2 2.251.0 -> 2.251.1 Also updates _generated/ mirrors to match (re-run via BuildConfigGen with --write-updates --current-sprint 274). Most of the new files in _generated/ AzureFileCopyV4 and _generated/AzureFileCopyV5 are byte-identical copies of source (54/56 unchanged); they exist because BCG materializes the Default mirror whenever any non-Default config (here Node24_1) is registered. Precedent: _generated/AzureFileCopyV6/ has been checked in this way for the same reason. No source / behavior changes in any of the 12 bumped tasks. The Sanitizer dispatcher (Invoke-ScriptArgumentSanitization.ps1) is consumed only by AzurePowerShellV2-V5 and ServiceFabricPowerShellV1; the 12 tasks bumped here all already have org-level + per-task FF dispatch and gain nothing from the new helper. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/AzureFileCopyV1/task.json | 2 +- Tasks/AzureFileCopyV1/task.loc.json | 2 +- Tasks/AzureFileCopyV2/task.json | 2 +- Tasks/AzureFileCopyV2/task.loc.json | 2 +- Tasks/AzureFileCopyV3/task.json | 2 +- Tasks/AzureFileCopyV3/task.loc.json | 2 +- Tasks/AzureFileCopyV4/task.json | 2 +- Tasks/AzureFileCopyV4/task.loc.json | 2 +- Tasks/AzureFileCopyV5/task.json | 2 +- Tasks/AzureFileCopyV5/task.loc.json | 2 +- Tasks/AzureFileCopyV6/task.json | 2 +- Tasks/AzureFileCopyV6/task.loc.json | 2 +- Tasks/PowerShellOnTargetMachinesV3/task.json | 2 +- .../task.loc.json | 2 +- Tasks/PowerShellV2/task.json | 2 +- Tasks/PowerShellV2/task.loc.json | 2 +- Tasks/SqlAzureDacpacDeploymentV1/task.json | 2 +- .../SqlAzureDacpacDeploymentV1/task.loc.json | 2 +- .../task.json | 2 +- .../task.loc.json | 2 +- Tasks/WindowsMachineFileCopyV1/task.json | 2 +- Tasks/WindowsMachineFileCopyV1/task.loc.json | 2 +- Tasks/WindowsMachineFileCopyV2/task.json | 2 +- Tasks/WindowsMachineFileCopyV2/task.loc.json | 2 +- _generated/AzureFileCopyV4.versionmap.txt | 4 +- _generated/AzureFileCopyV4/.npmrc | 5 + _generated/AzureFileCopyV4/AzureFileCopy.ps1 | 306 +++ .../AzureFileCopyRemoteJob.ps1 | 117 ++ .../AzureFileCopyV4/AzureUtilityARM.ps1 | 504 +++++ .../AzureFileCopyV4/AzureUtilityAz1.0.ps1 | 380 ++++ .../AzureFileCopyV4/AzureUtilityRest.ps1 | 154 ++ .../PreJobExecutionAzureFileCopy.ts | 54 + _generated/AzureFileCopyV4/README.md | 124 ++ .../resources.resjson/de-DE/resources.resjson | 93 + .../resources.resjson/en-US/resources.resjson | 93 + .../resources.resjson/es-ES/resources.resjson | 93 + .../resources.resjson/fr-FR/resources.resjson | 93 + .../resources.resjson/it-IT/resources.resjson | 93 + .../resources.resjson/ja-JP/resources.resjson | 93 + .../resources.resjson/ko-KR/resources.resjson | 93 + .../resources.resjson/ru-RU/resources.resjson | 93 + .../resources.resjson/zh-CN/resources.resjson | 93 + .../resources.resjson/zh-TW/resources.resjson | 93 + _generated/AzureFileCopyV4/Tests/L0.ts | 106 + .../L0AddAzureVMCustomScriptExtension.ps1 | 68 + .../Tests/L0CheckContainerNameAndArgs.ps1 | 15 + .../Tests/L0CopyFilesParallelyToAzureVMs.ps1 | 34 + .../L0CopyFilesSequentiallyToAzureVMs.ps1 | 30 + ...opyFilesToAzureVMsFromStorageContainer.ps1 | 61 + .../Tests/L0DoesAzureVMMatchTagFilter.ps1 | 33 + .../Tests/L0GetAzureUtility.ps1 | 26 + .../Tests/L0GetAzureVMResourcesProperties.ps1 | 31 + .../Tests/L0GetAzureVMsCredentials.ps1 | 16 + ...L0GetFilteredAzureRMVmsInResourceGroup.ps1 | 19 + .../L0GetFilteredAzureVmsInResourceGroup.ps1 | 27 + .../Tests/L0GetFrontEndPorts.ps1 | 34 + .../L0GetMachineBasedFilteredAzureVMs.ps1 | 30 + .../Tests/L0GetMachineNameFromId.ps1 | 91 + .../Tests/L0GetMachinesFqdnForLB.ps1 | 31 + .../Tests/L0GetRMVMConnectionDetailsInRG.ps1 | 36 + .../Tests/L0GetStorageAccountType.ps1 | 17 + .../AzureFileCopyV4/Tests/L0GetStorageKey.ps1 | 16 + .../Tests/L0GetTagBasedFilteredAzureVMs.ps1 | 22 + .../Tests/L0GetblobStorageEndpoint.ps1 | 17 + .../L0IsWinRMCustomScriptExtensionExists.ps1 | 61 + .../Tests/L0UploadFilesToAzureContainer.ps1 | 37 + .../Tests/L0UtilityThrowError.ps1 | 12 + .../Tests/L0ValidateAzurePSVersion.ps1 | 26 + .../L0ValidateCustomScriptExecutionStatus.ps1 | 66 + .../AzureFileCopyV4/Tests/MockHelper.ps1 | 653 ++++++ .../AzureFileCopyV4/Tests/MockVariable.ps1 | 58 + .../AzureFileCopyV4/ThirdPartyNotices.txt | 1137 +++++++++++ _generated/AzureFileCopyV4/Utility.ps1 | 1394 +++++++++++++ _generated/AzureFileCopyV4/icon.png | Bin 0 -> 517 bytes _generated/AzureFileCopyV4/icon.svg | 3 + _generated/AzureFileCopyV4/make.json | 67 + _generated/AzureFileCopyV4/package-lock.json | 1741 ++++++++++++++++ _generated/AzureFileCopyV4/package.json | 20 + _generated/AzureFileCopyV4/task.json | 316 +++ _generated/AzureFileCopyV4/task.loc.json | 316 +++ _generated/AzureFileCopyV4/tsconfig.json | 10 + _generated/AzureFileCopyV4_Node24/task.json | 6 +- .../AzureFileCopyV4_Node24/task.loc.json | 6 +- _generated/AzureFileCopyV5.versionmap.txt | 4 +- _generated/AzureFileCopyV5/.npmrc | 5 + _generated/AzureFileCopyV5/AzureFileCopy.ps1 | 298 +++ .../AzureFileCopyRemoteJob.ps1 | 120 ++ .../AzureFileCopyV5/AzureUtilityARM.ps1 | 510 +++++ .../AzureFileCopyV5/AzureUtilityAz1.0.ps1 | 380 ++++ .../AzureFileCopyV5/AzureUtilityRest.ps1 | 154 ++ _generated/AzureFileCopyV5/MimeMapping.json | 559 +++++ .../PreJobExecutionAzureFileCopy.ts | 54 + _generated/AzureFileCopyV5/README.md | 116 ++ .../resources.resjson/de-DE/resources.resjson | 94 + .../resources.resjson/en-US/resources.resjson | 94 + .../resources.resjson/es-ES/resources.resjson | 94 + .../resources.resjson/fr-FR/resources.resjson | 94 + .../resources.resjson/it-IT/resources.resjson | 94 + .../resources.resjson/ja-JP/resources.resjson | 94 + .../resources.resjson/ko-KR/resources.resjson | 94 + .../resources.resjson/ru-RU/resources.resjson | 94 + .../resources.resjson/zh-CN/resources.resjson | 94 + .../resources.resjson/zh-TW/resources.resjson | 94 + _generated/AzureFileCopyV5/Tests/L0.ts | 106 + .../L0AddAzureVMCustomScriptExtension.ps1 | 68 + .../Tests/L0CheckContainerNameAndArgs.ps1 | 15 + .../Tests/L0CopyFilesParallelyToAzureVMs.ps1 | 34 + .../L0CopyFilesSequentiallyToAzureVMs.ps1 | 30 + ...opyFilesToAzureVMsFromStorageContainer.ps1 | 61 + .../Tests/L0DoesAzureVMMatchTagFilter.ps1 | 33 + .../Tests/L0GetAzureUtility.ps1 | 26 + .../Tests/L0GetAzureVMResourcesProperties.ps1 | 31 + .../Tests/L0GetAzureVMsCredentials.ps1 | 16 + ...L0GetFilteredAzureRMVmsInResourceGroup.ps1 | 19 + .../L0GetFilteredAzureVmsInResourceGroup.ps1 | 27 + .../Tests/L0GetFrontEndPorts.ps1 | 34 + .../L0GetMachineBasedFilteredAzureVMs.ps1 | 30 + .../Tests/L0GetMachineNameFromId.ps1 | 91 + .../Tests/L0GetMachinesFqdnForLB.ps1 | 31 + .../Tests/L0GetRMVMConnectionDetailsInRG.ps1 | 36 + .../Tests/L0GetStorageAccountType.ps1 | 17 + .../AzureFileCopyV5/Tests/L0GetStorageKey.ps1 | 16 + .../Tests/L0GetTagBasedFilteredAzureVMs.ps1 | 22 + .../Tests/L0GetblobStorageEndpoint.ps1 | 17 + .../L0IsWinRMCustomScriptExtensionExists.ps1 | 61 + .../Tests/L0UploadFilesToAzureContainer.ps1 | 38 + .../Tests/L0UtilityThrowError.ps1 | 12 + .../Tests/L0ValidateAzurePSVersion.ps1 | 26 + .../L0ValidateCustomScriptExecutionStatus.ps1 | 66 + .../AzureFileCopyV5/Tests/MockHelper.ps1 | 653 ++++++ .../AzureFileCopyV5/Tests/MockVariable.ps1 | 58 + .../AzureFileCopyV5/ThirdPartyNotices.txt | 1137 +++++++++++ _generated/AzureFileCopyV5/Utility.ps1 | 1408 +++++++++++++ _generated/AzureFileCopyV5/icon.png | Bin 0 -> 517 bytes _generated/AzureFileCopyV5/icon.svg | 3 + _generated/AzureFileCopyV5/make.json | 73 + _generated/AzureFileCopyV5/package-lock.json | 1793 +++++++++++++++++ _generated/AzureFileCopyV5/package.json | 20 + _generated/AzureFileCopyV5/task.json | 316 +++ _generated/AzureFileCopyV5/task.loc.json | 316 +++ _generated/AzureFileCopyV5/tsconfig.json | 10 + _generated/AzureFileCopyV5_Node24/task.json | 6 +- .../AzureFileCopyV5_Node24/task.loc.json | 6 +- _generated/AzureFileCopyV6.versionmap.txt | 4 +- _generated/AzureFileCopyV6/task.json | 6 +- _generated/AzureFileCopyV6/task.loc.json | 6 +- _generated/AzureFileCopyV6_Node24/task.json | 6 +- .../AzureFileCopyV6_Node24/task.loc.json | 6 +- _generated/AzurePowerShellV4.versionmap.txt | 2 +- _generated/AzurePowerShellV4/task.json | 5 +- _generated/AzurePowerShellV4/task.loc.json | 2 +- _generated/AzurePowerShellV4_Node24/task.json | 5 +- .../AzurePowerShellV4_Node24/task.loc.json | 2 +- _generated/AzurePowerShellV5/task.json | 5 +- _generated/AzurePowerShellV5/task.loc.json | 2 +- _generated/AzurePowerShellV5_Node24/task.json | 5 +- .../AzurePowerShellV5_Node24/task.loc.json | 2 +- 157 files changed, 19204 insertions(+), 71 deletions(-) create mode 100644 _generated/AzureFileCopyV4/.npmrc create mode 100644 _generated/AzureFileCopyV4/AzureFileCopy.ps1 create mode 100644 _generated/AzureFileCopyV4/AzureFileCopyRemoteJob.ps1 create mode 100644 _generated/AzureFileCopyV4/AzureUtilityARM.ps1 create mode 100644 _generated/AzureFileCopyV4/AzureUtilityAz1.0.ps1 create mode 100644 _generated/AzureFileCopyV4/AzureUtilityRest.ps1 create mode 100644 _generated/AzureFileCopyV4/PreJobExecutionAzureFileCopy.ts create mode 100644 _generated/AzureFileCopyV4/README.md create mode 100644 _generated/AzureFileCopyV4/Strings/resources.resjson/de-DE/resources.resjson create mode 100644 _generated/AzureFileCopyV4/Strings/resources.resjson/en-US/resources.resjson create mode 100644 _generated/AzureFileCopyV4/Strings/resources.resjson/es-ES/resources.resjson create mode 100644 _generated/AzureFileCopyV4/Strings/resources.resjson/fr-FR/resources.resjson create mode 100644 _generated/AzureFileCopyV4/Strings/resources.resjson/it-IT/resources.resjson create mode 100644 _generated/AzureFileCopyV4/Strings/resources.resjson/ja-JP/resources.resjson create mode 100644 _generated/AzureFileCopyV4/Strings/resources.resjson/ko-KR/resources.resjson create mode 100644 _generated/AzureFileCopyV4/Strings/resources.resjson/ru-RU/resources.resjson create mode 100644 _generated/AzureFileCopyV4/Strings/resources.resjson/zh-CN/resources.resjson create mode 100644 _generated/AzureFileCopyV4/Strings/resources.resjson/zh-TW/resources.resjson create mode 100644 _generated/AzureFileCopyV4/Tests/L0.ts create mode 100644 _generated/AzureFileCopyV4/Tests/L0AddAzureVMCustomScriptExtension.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0CheckContainerNameAndArgs.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0CopyFilesParallelyToAzureVMs.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0CopyFilesSequentiallyToAzureVMs.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0CopyFilesToAzureVMsFromStorageContainer.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0DoesAzureVMMatchTagFilter.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetAzureUtility.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetAzureVMResourcesProperties.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetAzureVMsCredentials.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetFilteredAzureRMVmsInResourceGroup.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetFilteredAzureVmsInResourceGroup.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetFrontEndPorts.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetMachineBasedFilteredAzureVMs.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetMachineNameFromId.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetMachinesFqdnForLB.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetRMVMConnectionDetailsInRG.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetStorageAccountType.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetStorageKey.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetTagBasedFilteredAzureVMs.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0GetblobStorageEndpoint.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0IsWinRMCustomScriptExtensionExists.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0UploadFilesToAzureContainer.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0UtilityThrowError.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0ValidateAzurePSVersion.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/L0ValidateCustomScriptExecutionStatus.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/MockHelper.ps1 create mode 100644 _generated/AzureFileCopyV4/Tests/MockVariable.ps1 create mode 100644 _generated/AzureFileCopyV4/ThirdPartyNotices.txt create mode 100644 _generated/AzureFileCopyV4/Utility.ps1 create mode 100644 _generated/AzureFileCopyV4/icon.png create mode 100644 _generated/AzureFileCopyV4/icon.svg create mode 100644 _generated/AzureFileCopyV4/make.json create mode 100644 _generated/AzureFileCopyV4/package-lock.json create mode 100644 _generated/AzureFileCopyV4/package.json create mode 100644 _generated/AzureFileCopyV4/task.json create mode 100644 _generated/AzureFileCopyV4/task.loc.json create mode 100644 _generated/AzureFileCopyV4/tsconfig.json create mode 100644 _generated/AzureFileCopyV5/.npmrc create mode 100644 _generated/AzureFileCopyV5/AzureFileCopy.ps1 create mode 100644 _generated/AzureFileCopyV5/AzureFileCopyRemoteJob.ps1 create mode 100644 _generated/AzureFileCopyV5/AzureUtilityARM.ps1 create mode 100644 _generated/AzureFileCopyV5/AzureUtilityAz1.0.ps1 create mode 100644 _generated/AzureFileCopyV5/AzureUtilityRest.ps1 create mode 100644 _generated/AzureFileCopyV5/MimeMapping.json create mode 100644 _generated/AzureFileCopyV5/PreJobExecutionAzureFileCopy.ts create mode 100644 _generated/AzureFileCopyV5/README.md create mode 100644 _generated/AzureFileCopyV5/Strings/resources.resjson/de-DE/resources.resjson create mode 100644 _generated/AzureFileCopyV5/Strings/resources.resjson/en-US/resources.resjson create mode 100644 _generated/AzureFileCopyV5/Strings/resources.resjson/es-ES/resources.resjson create mode 100644 _generated/AzureFileCopyV5/Strings/resources.resjson/fr-FR/resources.resjson create mode 100644 _generated/AzureFileCopyV5/Strings/resources.resjson/it-IT/resources.resjson create mode 100644 _generated/AzureFileCopyV5/Strings/resources.resjson/ja-JP/resources.resjson create mode 100644 _generated/AzureFileCopyV5/Strings/resources.resjson/ko-KR/resources.resjson create mode 100644 _generated/AzureFileCopyV5/Strings/resources.resjson/ru-RU/resources.resjson create mode 100644 _generated/AzureFileCopyV5/Strings/resources.resjson/zh-CN/resources.resjson create mode 100644 _generated/AzureFileCopyV5/Strings/resources.resjson/zh-TW/resources.resjson create mode 100644 _generated/AzureFileCopyV5/Tests/L0.ts create mode 100644 _generated/AzureFileCopyV5/Tests/L0AddAzureVMCustomScriptExtension.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0CheckContainerNameAndArgs.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0CopyFilesParallelyToAzureVMs.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0CopyFilesSequentiallyToAzureVMs.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0CopyFilesToAzureVMsFromStorageContainer.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0DoesAzureVMMatchTagFilter.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetAzureUtility.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetAzureVMResourcesProperties.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetAzureVMsCredentials.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetFilteredAzureRMVmsInResourceGroup.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetFilteredAzureVmsInResourceGroup.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetFrontEndPorts.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetMachineBasedFilteredAzureVMs.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetMachineNameFromId.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetMachinesFqdnForLB.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetRMVMConnectionDetailsInRG.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetStorageAccountType.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetStorageKey.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetTagBasedFilteredAzureVMs.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0GetblobStorageEndpoint.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0IsWinRMCustomScriptExtensionExists.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0UploadFilesToAzureContainer.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0UtilityThrowError.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0ValidateAzurePSVersion.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/L0ValidateCustomScriptExecutionStatus.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/MockHelper.ps1 create mode 100644 _generated/AzureFileCopyV5/Tests/MockVariable.ps1 create mode 100644 _generated/AzureFileCopyV5/ThirdPartyNotices.txt create mode 100644 _generated/AzureFileCopyV5/Utility.ps1 create mode 100644 _generated/AzureFileCopyV5/icon.png create mode 100644 _generated/AzureFileCopyV5/icon.svg create mode 100644 _generated/AzureFileCopyV5/make.json create mode 100644 _generated/AzureFileCopyV5/package-lock.json create mode 100644 _generated/AzureFileCopyV5/package.json create mode 100644 _generated/AzureFileCopyV5/task.json create mode 100644 _generated/AzureFileCopyV5/task.loc.json create mode 100644 _generated/AzureFileCopyV5/tsconfig.json diff --git a/Tasks/AzureFileCopyV1/task.json b/Tasks/AzureFileCopyV1/task.json index 76180ef9af45..a1bab18d030d 100644 --- a/Tasks/AzureFileCopyV1/task.json +++ b/Tasks/AzureFileCopyV1/task.json @@ -14,7 +14,7 @@ "version": { "Major": 1, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV1/task.loc.json b/Tasks/AzureFileCopyV1/task.loc.json index 53a73cd3db81..197da79081db 100644 --- a/Tasks/AzureFileCopyV1/task.loc.json +++ b/Tasks/AzureFileCopyV1/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 1, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV2/task.json b/Tasks/AzureFileCopyV2/task.json index b5eff00cf4d6..1b61be6b2152 100644 --- a/Tasks/AzureFileCopyV2/task.json +++ b/Tasks/AzureFileCopyV2/task.json @@ -14,7 +14,7 @@ "version": { "Major": 2, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV2/task.loc.json b/Tasks/AzureFileCopyV2/task.loc.json index b750d550b2c6..008365f189f1 100644 --- a/Tasks/AzureFileCopyV2/task.loc.json +++ b/Tasks/AzureFileCopyV2/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 2, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV3/task.json b/Tasks/AzureFileCopyV3/task.json index ffbafb180c0f..0e3ad94063b1 100644 --- a/Tasks/AzureFileCopyV3/task.json +++ b/Tasks/AzureFileCopyV3/task.json @@ -14,7 +14,7 @@ "version": { "Major": 3, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV3/task.loc.json b/Tasks/AzureFileCopyV3/task.loc.json index 01fe9fd04cad..fb512f360d7a 100644 --- a/Tasks/AzureFileCopyV3/task.loc.json +++ b/Tasks/AzureFileCopyV3/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 3, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV4/task.json b/Tasks/AzureFileCopyV4/task.json index c570a5dd4720..57cdc76f2541 100644 --- a/Tasks/AzureFileCopyV4/task.json +++ b/Tasks/AzureFileCopyV4/task.json @@ -14,7 +14,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 0 + "Patch": 2 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV4/task.loc.json b/Tasks/AzureFileCopyV4/task.loc.json index 95476cafe7b0..8fec6dee7060 100644 --- a/Tasks/AzureFileCopyV4/task.loc.json +++ b/Tasks/AzureFileCopyV4/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 0 + "Patch": 2 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV5/task.json b/Tasks/AzureFileCopyV5/task.json index 7ecf77a91ddf..34b21029a053 100644 --- a/Tasks/AzureFileCopyV5/task.json +++ b/Tasks/AzureFileCopyV5/task.json @@ -14,7 +14,7 @@ "version": { "Major": 5, "Minor": 274, - "Patch": 0 + "Patch": 2 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV5/task.loc.json b/Tasks/AzureFileCopyV5/task.loc.json index 823a7f2e5c1b..8fe0bc48311b 100644 --- a/Tasks/AzureFileCopyV5/task.loc.json +++ b/Tasks/AzureFileCopyV5/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 5, "Minor": 274, - "Patch": 0 + "Patch": 2 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV6/task.json b/Tasks/AzureFileCopyV6/task.json index eb44095e6b7a..53bd39114ad4 100644 --- a/Tasks/AzureFileCopyV6/task.json +++ b/Tasks/AzureFileCopyV6/task.json @@ -14,7 +14,7 @@ "version": { "Major": 6, "Minor": 274, - "Patch": 2 + "Patch": 4 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV6/task.loc.json b/Tasks/AzureFileCopyV6/task.loc.json index 2df67db7e2fc..cee763bd16a2 100644 --- a/Tasks/AzureFileCopyV6/task.loc.json +++ b/Tasks/AzureFileCopyV6/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 6, "Minor": 274, - "Patch": 2 + "Patch": 4 }, "demands": [ "azureps" diff --git a/Tasks/PowerShellOnTargetMachinesV3/task.json b/Tasks/PowerShellOnTargetMachinesV3/task.json index 7fd555e84e88..2413c9a3ad92 100644 --- a/Tasks/PowerShellOnTargetMachinesV3/task.json +++ b/Tasks/PowerShellOnTargetMachinesV3/task.json @@ -14,7 +14,7 @@ "version": { "Major": 3, "Minor": 273, - "Patch": 0 + "Patch": 1 }, "groups": [ { diff --git a/Tasks/PowerShellOnTargetMachinesV3/task.loc.json b/Tasks/PowerShellOnTargetMachinesV3/task.loc.json index 27af50d5dd4e..42b27192f2db 100644 --- a/Tasks/PowerShellOnTargetMachinesV3/task.loc.json +++ b/Tasks/PowerShellOnTargetMachinesV3/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 3, "Minor": 273, - "Patch": 0 + "Patch": 1 }, "groups": [ { diff --git a/Tasks/PowerShellV2/task.json b/Tasks/PowerShellV2/task.json index fbe6be2f57d1..16f16a29c89f 100644 --- a/Tasks/PowerShellV2/task.json +++ b/Tasks/PowerShellV2/task.json @@ -18,7 +18,7 @@ "version": { "Major": 2, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "releaseNotes": "Script task consistency. Added support for macOS and Linux.", "minimumAgentVersion": "2.115.0", diff --git a/Tasks/PowerShellV2/task.loc.json b/Tasks/PowerShellV2/task.loc.json index a4965a7e6ff4..68d8920b7f5f 100644 --- a/Tasks/PowerShellV2/task.loc.json +++ b/Tasks/PowerShellV2/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 2, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "releaseNotes": "ms-resource:loc.releaseNotes", "minimumAgentVersion": "2.115.0", diff --git a/Tasks/SqlAzureDacpacDeploymentV1/task.json b/Tasks/SqlAzureDacpacDeploymentV1/task.json index 558d8db7ad2c..646bb17cc076 100644 --- a/Tasks/SqlAzureDacpacDeploymentV1/task.json +++ b/Tasks/SqlAzureDacpacDeploymentV1/task.json @@ -17,7 +17,7 @@ "version": { "Major": 1, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "demands": [ "sqlpackage" diff --git a/Tasks/SqlAzureDacpacDeploymentV1/task.loc.json b/Tasks/SqlAzureDacpacDeploymentV1/task.loc.json index 8d04588a2e46..193d501a9ff1 100644 --- a/Tasks/SqlAzureDacpacDeploymentV1/task.loc.json +++ b/Tasks/SqlAzureDacpacDeploymentV1/task.loc.json @@ -17,7 +17,7 @@ "version": { "Major": 1, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "demands": [ "sqlpackage" diff --git a/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.json b/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.json index 729b14b45892..ac38a7c67497 100644 --- a/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.json +++ b/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.json @@ -17,7 +17,7 @@ "version": { "Major": 0, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "demands": [], "minimumAgentVersion": "1.102.0", diff --git a/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.loc.json b/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.loc.json index c47fe8fc75ca..0a242566a9dd 100644 --- a/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.loc.json +++ b/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.loc.json @@ -17,7 +17,7 @@ "version": { "Major": 0, "Minor": 274, - "Patch": 0 + "Patch": 1 }, "demands": [], "minimumAgentVersion": "1.102.0", diff --git a/Tasks/WindowsMachineFileCopyV1/task.json b/Tasks/WindowsMachineFileCopyV1/task.json index e6fff3e421c5..05647acbb191 100644 --- a/Tasks/WindowsMachineFileCopyV1/task.json +++ b/Tasks/WindowsMachineFileCopyV1/task.json @@ -14,7 +14,7 @@ "version": { "Major": 1, "Minor": 243, - "Patch": 0 + "Patch": 1 }, "minimumAgentVersion": "1.104.0", "groups": [ diff --git a/Tasks/WindowsMachineFileCopyV1/task.loc.json b/Tasks/WindowsMachineFileCopyV1/task.loc.json index 640d24c71474..b013c717fed2 100644 --- a/Tasks/WindowsMachineFileCopyV1/task.loc.json +++ b/Tasks/WindowsMachineFileCopyV1/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 1, "Minor": 243, - "Patch": 0 + "Patch": 1 }, "minimumAgentVersion": "1.104.0", "groups": [ diff --git a/Tasks/WindowsMachineFileCopyV2/task.json b/Tasks/WindowsMachineFileCopyV2/task.json index 92fbee4b37bb..24c0351004c6 100644 --- a/Tasks/WindowsMachineFileCopyV2/task.json +++ b/Tasks/WindowsMachineFileCopyV2/task.json @@ -14,7 +14,7 @@ "version": { "Major": 2, "Minor": 251, - "Patch": 0 + "Patch": 1 }, "releaseNotes": "What's new in Version 2.0:
  Proxy support is being added.
   Removed support of legacy DTL machines.", "minimumAgentVersion": "1.104.0", diff --git a/Tasks/WindowsMachineFileCopyV2/task.loc.json b/Tasks/WindowsMachineFileCopyV2/task.loc.json index 64be232fb1d9..86cb87ac2a81 100644 --- a/Tasks/WindowsMachineFileCopyV2/task.loc.json +++ b/Tasks/WindowsMachineFileCopyV2/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 2, "Minor": 251, - "Patch": 0 + "Patch": 1 }, "releaseNotes": "ms-resource:loc.releaseNotes", "minimumAgentVersion": "1.104.0", diff --git a/_generated/AzureFileCopyV4.versionmap.txt b/_generated/AzureFileCopyV4.versionmap.txt index d857aacbc808..84e4b86f9148 100644 --- a/_generated/AzureFileCopyV4.versionmap.txt +++ b/_generated/AzureFileCopyV4.versionmap.txt @@ -1,2 +1,2 @@ -Default|4.274.0 -Node24_1|4.274.1 +Default|4.274.2 +Node24_1|4.274.3 diff --git a/_generated/AzureFileCopyV4/.npmrc b/_generated/AzureFileCopyV4/.npmrc new file mode 100644 index 000000000000..d5c7fef620a3 --- /dev/null +++ b/_generated/AzureFileCopyV4/.npmrc @@ -0,0 +1,5 @@ +scripts-prepend-node-path=true + +registry=https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ + +always-auth=true \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/AzureFileCopy.ps1 b/_generated/AzureFileCopyV4/AzureFileCopy.ps1 new file mode 100644 index 000000000000..d2d159c487b7 --- /dev/null +++ b/_generated/AzureFileCopyV4/AzureFileCopy.ps1 @@ -0,0 +1,306 @@ +[CmdletBinding()] +param() + +$featureFlags = @{ + retireAzureRM = [System.Convert]::ToBoolean($env:RETIRE_AZURERM_POWERSHELL_MODULE) +} + +Trace-VstsEnteringInvocation $MyInvocation + +# Get inputs for the task +$sourcePath = Get-VstsInput -Name SourcePath -Require +$destination = Get-VstsInput -Name Destination -Require +$connectedServiceName = Get-VstsInput -Name ConnectedServiceNameARM -Require +$storageAccount = Get-VstsInput -Name StorageAccountRM +$containerName = Get-VstsInput -Name ContainerName +$blobPrefix = Get-VstsInput -Name BlobPrefix +$environmentName = Get-VstsInput -Name EnvironmentNameRM +$resourceFilteringMethod = Get-VstsInput -Name ResourceFilteringMethod +$machineNames = Get-VstsInput -Name MachineNames +$vmsAdminUserName = Get-VstsInput -Name VmsAdminUsername +$vmsAdminPassword = Get-VstsInput -Name VmsAdminPassword +$targetPath = Get-VstsInput -Name TargetPath +$additionalArgumentsForBlobCopy = Get-VstsInput -Name AdditionalArgumentsForBlobCopy +$additionalArgumentsForVMCopy = Get-VstsInput -Name AdditionalArgumentsForVMCopy +$cleanTargetBeforeCopy = Get-VstsInput -Name CleanTargetBeforeCopy -AsBool +$copyFilesInParallel = Get-VstsInput -Name CopyFilesInParallel -AsBool +$skipCACheck = Get-VstsInput -Name SkipCACheck -AsBool +$enableCopyPrerequisites = Get-VstsInput -Name EnableCopyPrerequisites -AsBool + + $sasTokenTimeOutInMinutes = 240 + +if ($destination -eq "AzureBlob"){ + $userGivenTimeOutInMinutes = Get-VstsInput -Name SasTokenTimeOutInMinutes + if($userGivenTimeOutInMinutes -ne ""){ + $sasTokenTimeOutInMinutes = $userGivenTimeOutInMinutes + } +} + +if ($destination -ne "AzureBlob") +{ + $blobPrefix = "" +} + +# Constants +$useHttpsProtocolOption = '' +$ErrorActionPreference = 'Stop' +$telemetrySet = $false +$isPremiumStorage = $false + +$sourcePath = $sourcePath.Trim('"') +$storageAccount = $storageAccount.Trim() +$containerName = $containerName.Trim().ToLower() + +$additionalArgumentsForBlobCopy = $additionalArgumentsForBlobCopy.Trim() +$additionalArgumentsForVMCopy = $additionalArgumentsForVMCopy.Trim() +$useDefaultArgumentsForBlobCopy = ($additionalArgumentsForBlobCopy -eq "") + +# azcopy location on automation agent +$azCopyExeLocation = 'AzCopy\AzCopy.exe' +$azCopyLocation = [System.IO.Path]::GetDirectoryName($azCopyExeLocation) + +# Import RemoteDeployer +Import-Module $PSScriptRoot\ps_modules\RemoteDeployer + +# Initialize Azure. +Import-Module $PSScriptRoot\ps_modules\VstsAzureHelpers_ + +$endpoint = Get-VstsEndpoint -Name $connectedServiceName -Require + +# Update PSModulePath for hosted agent +. "$PSScriptRoot\Utility.ps1" +CleanUp-PSModulePathForHostedAgent + +$vstsEndpoint = Get-VstsEndpoint -Name SystemVssConnection -Require +$vstsAccessToken = $vstsEndpoint.auth.parameters.AccessToken + + +if ($featureFlags.retireAzureRM) { + Write-Debug "Initializing Az Module" + $encryptedToken = ConvertTo-SecureString $vstsAccessToken -AsPlainText -Force + Initialize-AzModule -Endpoint $endpoint -connectedServiceNameARM $connectedServiceName -encryptedToken $encryptedToken +} else { + if (Get-Module Az.Accounts -ListAvailable) { + $encryptedToken = ConvertTo-SecureString $vstsAccessToken -AsPlainText -Force + Initialize-AzModule -Endpoint $endpoint -connectedServiceNameARM $connectedServiceName -encryptedToken $encryptedToken + } + else { + Initialize-AzureRMModule -Endpoint $endpoint + } +} + +# Import the loc strings. +Import-VstsLocStrings -LiteralPath $PSScriptRoot/Task.json + +# Load all dependent files for execution +. "$PSScriptRoot\AzureFileCopyRemoteJob.ps1" + +# Enabling detailed logging only when system.debug is true +$enableDetailedLogging = ($env:system_debug -eq "true") + +# Telemetry +Import-Module $PSScriptRoot\ps_modules\TelemetryHelper + +# Sanitizer +Import-Module $PSScriptRoot\ps_modules\Sanitizer +$useSanitizerCall = Get-SanitizerCallStatus +$useSanitizerActivate = Get-SanitizerActivateStatus + +if ($useSanitizerCall) { + $sanitizedArgumentsForBlobCopy = Protect-ScriptArguments -InputArgs $additionalArgumentsForBlobCopy -TaskName "AzureFileCopyV4" + $sanitizedArgumentsForVMCopy = Protect-ScriptArguments -InputArgs $additionalArgumentsForVMCopy -TaskName "AzureFileCopyV4" +} + +if ($useSanitizerActivate) { + $additionalArgumentsForBlobCopy = $sanitizedArgumentsForBlobCopy -join " " + $additionalArgumentsForVMCopy = $sanitizedArgumentsForVMCopy -join " " +} + +#### MAIN EXECUTION OF AZURE FILE COPY TASK BEGINS HERE #### +try { + try + { + # Importing required version of azure cmdlets according to azureps installed on machine + $azureUtility = Get-AzureUtility + + Write-Verbose -Verbose "Loading $azureUtility" + . "$PSScriptRoot/$azureUtility" + + # Telemetry for endpoint id + $telemetryJsonContent = "{`"endpointId`":`"$connectedServiceName`"}" + Write-Host "##vso[telemetry.publish area=TaskEndpointId;feature=AzureFileCopy]$telemetryJsonContent" + + # Getting storage key for the storage account + $storageKey = Get-StorageKey -storageAccountName $storageAccount -endpoint $endpoint -connectedServiceNameARM $connectedServiceName + + # creating storage context to be used while creating container, sas token, deleting container + $storageContext = Create-AzureStorageContext -StorageAccountName $storageAccount -StorageAccountKey $storageKey + + # Geting Azure Storage Account type + $storageAccountType = Get-StorageAccountType $storageAccount $endpoint $connectedServiceName + Write-Verbose "Obtained Storage Account type: $storageAccountType" + if(-not [string]::IsNullOrEmpty($storageAccountType) -and $storageAccountType.Contains('Premium')) + { + $isPremiumStorage = $true + } + + # creating temporary container for uploading files if no input is provided for container name + if([string]::IsNullOrEmpty($containerName) -or ($destination -ne "AzureBlob")) + { + $containerName = [guid]::NewGuid().ToString() + Write-Verbose "Container Name input not found. Creating Temporary container for uploading files." + Create-AzureContainer -containerName $containerName -storageContext $storageContext + } + else + { + #checking if the containerName provided exist or not + $containerPresent = Get-AzureContainer -containerName $containerName -storageContext $storageContext + + #creating container if the containerName provided does not exist + if($null -eq $containerPresent) + { + Write-Verbose "Creating container if the containerName provided does not exist" + Create-AzureContainer -containerName $containerName -storageContext $storageContext + } + } + + + # Getting Azure Blob Storage Endpoint + $blobStorageEndpoint = Get-blobStorageEndpoint -storageAccountName $storageAccount -endpoint $endpoint + + # Setting environment variable for tracking Azure Pipelines usage in AzCopy telemetry + $env:AZCOPY_USER_AGENT_PREFIX = "TFS_useragent" + } + catch + { + Write-Verbose $_.Exception.ToString() + Write-Telemetry "Task_InternalError" "TemporaryCopyingToBlobContainerFailed" + throw + } + + # Set optional arguments for azcopy blob upload + if ($useDefaultArgumentsForBlobCopy) + { + # Adding default optional arguments: + # log-level: Defines the log verbosity for the log file. Default is INFO(all requests/responses) + + Write-Verbose "Using default AzCopy arguments for uploading to blob storage" + + $additionalArgumentsForBlobCopy = "--log-level=INFO" + + # Add more arguments if required + + # Premium storage accounts only support page blobs + if($isPremiumStorage) + { + Write-Verbose "Setting BlobType to page for Premium Storage account." + $additionalArgumentsForBlobCopy += " --blob-type=PageBlob" + } + + # $root container does not support sub folders. So excluding recursive copy option for $root container. + if($containerName -ne '$root') + { + Write-Verbose "Adding argument for recursive copy" + $additionalArgumentsForBlobCopy += " --recursive" + } + } + + Check-ContainerNameAndArgs -containerName $containerName -additionalArguments $additionalArgumentsForBlobCopy + + $containerSasToken = "" + if ($useSanitizerActivate) { + Write-Verbose "Feature flag sanitizer is active (for sas token)" + $containerSasToken = Generate-AzureStorageContainerSASToken -containerName $containerName -storageContext $storageContext -tokenTimeOutInMinutes $sasTokenTimeOutInMinutes + } + + # Uploading files to container + Upload-FilesToAzureContainer -sourcePath $sourcePath ` + -endPoint $endpoint ` + -storageAccountName $storageAccount ` + -containerName $containerName ` + -blobPrefix $blobPrefix ` + -blobStorageEndpoint $blobStorageEndpoint ` + -azCopyLocation $azCopyLocation ` + -additionalArguments $additionalArgumentsForBlobCopy ` + -destinationType $destination ` + -useDefaultArguments $useDefaultArgumentsForBlobCopy ` + -containerSasToken $containerSasToken ` + -useSanitizerActivate $useSanitizerActivate + + # Complete the task if destination is azure blob + if ($destination -eq "AzureBlob") + { + # Get URI and SaSToken for output variable + $storageAccountContainerURI = $storageContext.BlobEndPoint + $containerName + "/" + Write-Host "##vso[task.setvariable variable=StorageContainerUri]$storageAccountContainerURI" + + + $storageContainerSaSToken = Generate-AzureStorageContainerSASToken -containerName $containerName -storageContext $storageContext -tokenTimeOutInMinutes $sasTokenTimeOutInMinutes + Write-Host "##vso[task.setvariable variable=StorageContainerSasToken]$storageContainerSasToken" + + Remove-EndpointSecrets + Write-Verbose "Completed Azure File Copy Task for Azure Blob Destination" + + return + } + + # Copying files to Azure VMs + try + { + # Normalize admin username + if($vmsAdminUserName -and (-not $vmsAdminUserName.StartsWith(".\")) -and ($vmsAdminUserName.IndexOf("\") -eq -1) -and ($vmsAdminUserName.IndexOf("@") -eq -1)) + { + $vmsAdminUserName = ".\" + $vmsAdminUserName + } + # getting azure vms properties(name, fqdn, winrmhttps port) + $azureVMResourcesProperties = Get-AzureVMResourcesProperties -resourceGroupName $environmentName ` + -resourceFilteringMethod $resourceFilteringMethod -machineNames $machineNames -enableCopyPrerequisites $enableCopyPrerequisites ` + -connectedServiceName $connectedServiceName + + $azureVMsCredentials = Get-AzureVMsCredentials -vmsAdminUserName $vmsAdminUserName -vmsAdminPassword $vmsAdminPassword + + # Get Invoke-RemoteScript parameters + $invokeRemoteScriptParams = Get-InvokeRemoteScriptParameters -azureVMResourcesProperties $azureVMResourcesProperties ` + -networkCredentials $azureVMsCredentials ` + -skipCACheck $skipCACheck + + # generate container sas token with full permissions + $containerSasToken = Generate-AzureStorageContainerSASToken -containerName $containerName -storageContext $storageContext -tokenTimeOutInMinutes $sasTokenTimeOutInMinutes + + # Copies files on azureVMs + Copy-FilesToAzureVMsFromStorageContainer -targetMachineNames $invokeRemoteScriptParams.targetMachineNames ` + -credential $invokeRemoteScriptParams.credential ` + -protocol $invokeRemoteScriptParams.protocol ` + -sessionOption $invokeRemoteScriptParams.sessionOption ` + -blobStorageEndpoint $blobStorageEndpoint ` + -containerName $containerName ` + -containerSasToken $containerSasToken ` + -targetPath $targetPath ` + -cleanTargetBeforeCopy $cleanTargetBeforeCopy ` + -copyFilesInParallel $copyFilesInParallel ` + -additionalArguments $additionalArgumentsForVMCopy ` + -azCopyToolLocation $azCopyLocation ` + -fileCopyJobScript $AzureFileCopyRemoteJob ` + -enableDetailedLogging $enableDetailedLogging ` + -useSanitizerActivate $useSanitizerActivate + + Write-Output (Get-VstsLocString -Key "AFC_CopySuccessful" -ArgumentList $sourcePath, $environmentName) + } + catch + { + Write-Verbose $_.Exception.ToString() + + Write-Telemetry "Task_InternalError" "CopyingToAzureVMFailed" + throw + } + finally + { + Remove-AzureContainer -containerName $containerName -storageContext $storageContext + Remove-EndpointSecrets + Write-Verbose "Completed Azure File Copy Task for Azure VMs Destination" -Verbose + Trace-VstsLeavingInvocation $MyInvocation + } +} +finally { + Disconnect-AzureAndClearContext -authScheme $endpoint.Auth.Scheme -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/AzureFileCopyRemoteJob.ps1 b/_generated/AzureFileCopyV4/AzureFileCopyRemoteJob.ps1 new file mode 100644 index 000000000000..de39e91642d7 --- /dev/null +++ b/_generated/AzureFileCopyV4/AzureFileCopyRemoteJob.ps1 @@ -0,0 +1,117 @@ +$AzureFileCopyRemoteJob = { + param( + [string]$containerURL, + [string]$targetPath, + [string]$containerSasToken, + [string]$additionalArguments, + [switch]$CleanTargetBeforeCopy, + [switch]$EnableDetailedLogging, + [switch]$useSanitizerActivate + ) + + function Write-DetailLogs + { + [CmdletBinding()] + param( + [string]$message + ) + + if($EnableDetailedLogging) + { + Write-Verbose $message + } + } + + try + { + $useDefaultArguments = ($additionalArguments -eq "") + + #argument to check whether azcopy.exe needs to be downloaded on VM or it is already present on VM + $shouldDownload = $false + + if($CleanTargetBeforeCopy) + { + if (Test-Path $targetPath -PathType Container) + { + Get-ChildItem -Path $targetPath -Recurse -Force | Remove-Item -Force -Recurse + Write-DetailLogs "Destination location cleaned" + } + else + { + Write-DetailLogs "Folder at path $targetPath not found for cleanup." + } + } + + try + { + $azCopyVersionCommand = azcopy --version + $azCopyVersion = $azCopyVersionCommand.split(' ')[2] + if([version]$azCopyVersion -lt [version]"10.8.0") + { + $shouldDownload = $true + } + } + catch + { + $shouldDownload = $true + } + + if($shouldDownload) + { + try + { + $azCopyFolderName = "ADO_AzCopyV10" + $azCopyFolderPath = Join-Path -Path $env:systemdrive -ChildPath $azCopyFolderName + + New-Item -ItemType Directory -Force -Path $azCopyFolderPath + $azCopyZipPath = Join-Path -Path $azCopyFolderPath -ChildPath "AzCopy.zip" + + # Downloading AzCopy from URL and copying it in $azcopyZipPath + $webclient = New-Object System.Net.WebClient + $webclient.DownloadFile('https://vstsagenttools.blob.core.windows.net/tools/azcopy/10.8/AzCopy.zip',$azCopyZipPath) + + #Unzipping the azcopy zip to $azcopyFolderPath + Expand-Archive $azCopyZipPath -DestinationPath $azCopyFolderPath -Force + + $azCopyFolderEnvPath = Join-Path -Path $azCopyFolderPath -ChildPath "AzCopy" + + #setting path at machine level so that when user again do copy on VM, there is no need to download the azcopy.exe again + [Environment]::SetEnvironmentVariable("Path", $azCopyFolderEnvPath + ';' + $env:Path, [System.EnvironmentVariableTarget]::Machine) + + #setting $env:Path at user level to include azcopy.exe path as the above command used do set the path at machine level and not at user level + $env:Path = $azCopyFolderEnvPath + ';' + $env:Path + } + catch + { + $exceptionMessage = $_.Exception.Message.ToString() + throw "Failed while downloading azcopy.exe from the URL with exception $exceptionMessage. Please download azcopy.exe 10.8.0 and set this extracted path in env:Path" + } + } + + if($useDefaultArguments) + { + # Adding default optional arguments: + # log-level: Defines the log verbosity for the log file. Default is INFO(all requests/responses) + # recursive: Recursive copy + + Write-DetailLogs "Using default AzCopy arguments for dowloading to VM" + $additionalArguments = "--recursive --log-level=INFO" + } + + if ($useSanitizerActivate) { + # Splitting arguments on space, but not on space inside quotes + $sanitizedArguments = [regex]::Split($additionalArguments, ' (?=(?:[^"]|"[^"]*")*$)') + Write-DetailLogs "##[command] & azcopy copy `"$containerURL*****`" `"$targetPath`" $sanitizedArguments" + & azcopy copy "$containerURL/*$containerSasToken" "$targetPath" $sanitizedArguments + } else { + Write-DetailLogs "##[command] & azcopy copy `"$containerURL*****`" `"$targetPath`" $additionalArguments" + $azCopyCommand = "& azcopy copy `"$containerURL/*$containerSasToken`" `"$targetPath`" $additionalArguments" + Invoke-Expression $azCopyCommand + } + } + catch + { + Write-Verbose "AzureFileCopyRemoteJob threw exception" + throw + } +} diff --git a/_generated/AzureFileCopyV4/AzureUtilityARM.ps1 b/_generated/AzureFileCopyV4/AzureUtilityARM.ps1 new file mode 100644 index 000000000000..4313603a7bbf --- /dev/null +++ b/_generated/AzureFileCopyV4/AzureUtilityARM.ps1 @@ -0,0 +1,504 @@ +# This file implements IAzureUtility for AzureRM PowerShell + +. "$PSScriptRoot/AzureUtilityRest.ps1" + +function Get-AzureStorageAccountResourceGroupName +{ + param([string]$storageAccountName) + + $ARMStorageAccountResourceType = "Microsoft.Storage/storageAccounts" + if (-not [string]::IsNullOrEmpty($storageAccountName)) + { + Write-Verbose "[Azure Call]Getting resource details for azure storage account resource: $storageAccountName with resource type: $ARMStorageAccountResourceType" + if ($featureFlags.retireAzureRM) + { + $azureStorageAccountResourceDetails = Get-AzStorageAccount -ErrorAction Stop | Where-Object { $_.StorageAccountName -eq $storageAccountName } + } + else + { + $azureStorageAccountResourceDetails = Get-AzureRmStorageAccount -ErrorAction Stop | Where-Object { $_.StorageAccountName -eq $storageAccountName } + } + Write-Verbose "[Azure Call]Retrieved resource details successfully for azure storage account resource: $storageAccountName with resource type: $ARMStorageAccountResourceType" + + $azureResourceGroupName = $azureStorageAccountResourceDetails.ResourceGroupName + if ([string]::IsNullOrEmpty($azureResourceGroupName)) + { + Write-Verbose "(ARM)Storage account: $storageAccountName not found" + Write-Telemetry "Task_InternalError" "RMStorageAccountNotFound" + Throw (Get-VstsLocString -Key "AFC_StorageAccountNotFound" -ArgumentList $storageAccountName) + } + + return $azureResourceGroupName + } +} + +function Create-AzureStorageContext +{ + param([string]$storageAccountName, + [string]$storageAccountKey) + + if(-not [string]::IsNullOrEmpty($storageAccountName) -and -not [string]::IsNullOrEmpty($storageAccountKey)) + { + Write-Verbose "[Azure Call]Creating AzureStorageContext for storage account: $storageAccountName" + if ($featureFlags.retireAzureRM) + { + $storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey -ErrorAction Stop + } + else + { + $storageContext = New-AzureStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey -ErrorAction Stop + } + Write-Verbose "[Azure Call]Created AzureStorageContext for storage account: $storageAccountName" + + return $storageContext + } +} + +function Create-AzureContainer +{ + param([string]$containerName, + [object]$storageContext) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Creating container: $containerName in storage account: $storageAccountName" + if ($featureFlags.retireAzureRM) + { + $container = New-AzStorageContainer -Name $containerName -Context $storageContext -Permission Off -ErrorAction Stop + } + else + { + $container = New-AzureStorageContainer -Name $containerName -Context $storageContext -Permission Off -ErrorAction Stop + } + Write-Verbose "[Azure Call]Created container: $containerName successfully in storage account: $storageAccountName" + } +} + +function Get-AzureContainer +{ + param([string]$containerName, + [object]$storageContext) + + $container = $null + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Getting container: $containerName in storage account: $storageAccountName" + try + { + if ($featureFlags.retireAzureRM) + { + $container = Get-AzStorageContainer -Name $containerName -Context $storageContext -ErrorAction Stop + } + else + { + $container = Get-AzureStorageContainer -Name $containerName -Context $storageContext -ErrorAction Stop + } + } + catch + { + Write-Verbose "Container: $containerName does not exist in storage account: $storageAccountName" + } + } + + return $container +} + +function Remove-AzureContainer +{ + param([string]$containerName, + [object]$storageContext) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Deleting container: $containerName in storage account: $storageAccountName" + if ($featureFlags.retireAzureRM) + { + Remove-AzStorageContainer -Name $containerName -Context $storageContext -Force -ErrorAction SilentlyContinue + } + else + { + Remove-AzureStorageContainer -Name $containerName -Context $storageContext -Force -ErrorAction SilentlyContinue + } + Write-Verbose "[Azure Call]Deleted container: $containerName in storage account: $storageAccountName" + } +} + +function Get-AzureRMVMsInResourceGroup +{ + param([string]$resourceGroupName) + + If(-not [string]::IsNullOrEmpty($resourceGroupName)) + { + try + { + Write-Verbose "[Azure Call]Getting resource group:$resourceGroupName RM virtual machines type resources" + if ($featureFlags.retireAzureRM) + { + $azureRMVMResources = Get-AzVM -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + else + { + $azureRMVMResources = Get-AzureRMVM -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Count of resource group:$resourceGroupName RM virtual machines type resource is $($azureRMVMResources.Count)" + + return $azureRMVMResources + } + catch [Hyak.Common.CloudException], [Microsoft.Rest.Azure.CloudException] + { + $exceptionMessage = $_.Exception.Message.ToString() + Write-Verbose "ExceptionMessage: $exceptionMessage" + + Write-Telemetry "Task_InternalError" "ResourceGroupNotFound" + throw (Get-VstsLocString -Key "AFC_ResourceGroupNotFound" -ArgumentList $resourceGroupName) + } + } +} + +function Get-AzureRMResourceGroupResourcesDetails +{ + param([string]$resourceGroupName, + [object]$azureRMVMResources) + + [hashtable]$azureRGResourcesDetails = @{} + [hashtable]$loadBalancerDetails = @{} + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and $azureRMVMResources) + { + Write-Verbose "[Azure Call]Getting network interfaces in resource group $resourceGroupName" + if ($featureFlags.retireAzureRM) + { + $networkInterfaceResources = Get-AzNetworkInterface -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + else + { + $networkInterfaceResources = Get-AzureRMNetworkInterface -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Got network interfaces in resource group $resourceGroupName" + $azureRGResourcesDetails.Add("networkInterfaceResources", $networkInterfaceResources) + + Write-Verbose "[Azure Call]Getting public IP Addresses in resource group $resourceGroupName" + if ($featureFlags.retireAzureRM) + { + $publicIPAddressResources = Get-AzPublicIpAddress -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + else + { + $publicIPAddressResources = Get-AzureRMPublicIpAddress -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Got public IP Addresses in resource group $resourceGroupName" + $azureRGResourcesDetails.Add("publicIPAddressResources", $publicIPAddressResources) + + Write-Verbose "[Azure Call]Getting load balancers in resource group $resourceGroupName" + if ($featureFlags.retireAzureRM) + { + $lbGroup = Get-AzLoadBalancer -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + else + { + $lbGroup = Get-AzureRMLoadBalancer -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Got load balancers in resource group $resourceGroupName" + + if($lbGroup) + { + foreach($lb in $lbGroup) + { + $lbDetails = @{} + Write-Verbose "[Azure Call]Getting load balancer in resource group $resourceGroupName" + if ($featureFlags.retireAzureRM) + { + $loadBalancer = Get-AzLoadBalancer -Name $lb.Name -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + else + { + $loadBalancer = Get-AzureRMLoadBalancer -Name $lb.Name -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Got load balancer in resource group $resourceGroupName" + + Write-Verbose "[Azure Call]Getting LoadBalancer Frontend Ip Config" + if ($featureFlags.retireAzureRM) + { + $frontEndIPConfigs = Get-AzLoadBalancerFrontendIpConfig -LoadBalancer $loadBalancer -ErrorAction Stop -Verbose + } + else + { + $frontEndIPConfigs = Get-AzureRMLoadBalancerFrontendIpConfig -LoadBalancer $loadBalancer -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Got LoadBalancer Frontend Ip Config" + + Write-Verbose "[Azure Call]Getting Azure LoadBalancer Inbound NatRule Config" + if ($featureFlags.retireAzureRM) + { + $inboundRules = Get-AzLoadBalancerInboundNatRuleConfig -LoadBalancer $loadBalancer -ErrorAction Stop -Verbose + } + else + { + $inboundRules = Get-AzureRMLoadBalancerInboundNatRuleConfig -LoadBalancer $loadBalancer -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Got Azure LoadBalancer Inbound NatRule Config" + + $lbDetails.Add("frontEndIPConfigs", $frontEndIPConfigs) + $lbDetails.Add("inboundRules", $inboundRules) + $loadBalancerDetails.Add($lb.Name, $lbDetails) + } + + $azureRGResourcesDetails.Add("loadBalancerResources", $loadBalancerDetails) + } + } + + return $azureRGResourcesDetails +} + +function Generate-AzureStorageContainerSASToken +{ + param([string]$containerName, + [object]$storageContext, + [System.Int32]$tokenTimeOutInMinutes) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Generating SasToken for container: $containerName in storage: $storageAccountName with expiry time: $tokenTimeOutInMinutes minutes" + if ($featureFlags.retireAzureRM) + { + $containerSasToken = New-AzStorageContainerSASToken -Name $containerName -ExpiryTime (Get-Date).AddMinutes($tokenTimeOutInMinutes) -Context $storageContext -Permission rwdl + } + else + { + $containerSasToken = New-AzureStorageContainerSASToken -Name $containerName -ExpiryTime (Get-Date).AddMinutes($tokenTimeOutInMinutes) -Context $storageContext -Permission rwdl + } + Write-Verbose "[Azure Call]Generated SasToken: $containerSasToken successfully for container: $containerName in storage: $storageAccountName" + + return $containerSasToken + } +} + +function Get-AzureMachineStatus +{ + param([string]$resourceGroupName, + [string]$name) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($name)) + { + Write-Host (Get-VstsLocString -Key "AFC_GetVMStatus" -ArgumentList $name) + if ($featureFlags.retireAzureRM) + { + $status = Get-AzVM -ResourceGroupName $resourceGroupName -Name $name -Status -ErrorAction Stop -Verbose + } + else + { + $status = Get-AzureRmVM -ResourceGroupName $resourceGroupName -Name $name -Status -ErrorAction Stop -Verbose + } + Write-Host (Get-VstsLocString -Key "AFC_GetVMStatusComplete" -ArgumentList $name) + } + + return $status +} + +function Set-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name, + [string[]]$fileUri, + [string]$run, + [string]$argument, + [string]$location) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName) -and -not [string]::IsNullOrEmpty($name)) + { + Write-Host (Get-VstsLocString -Key "AFC_SetCustomScriptExtension" -ArgumentList $name, $vmName) + Write-Verbose "Set-AzureRmVMCustomScriptExtension -ResourceGroupName $resourceGroupName -VMName $vmName -Name $name -FileUri $fileUri -Run $run -Argument $argument -Location $location -ErrorAction Stop -Verbose" + if ($featureFlags.retireAzureRM) + { + $result = Set-AzVMCustomScriptExtension -ResourceGroupName $resourceGroupName -VMName $vmName -Name $name -FileUri $fileUri -Run $run -Argument $argument -Location $location -ErrorAction Stop -Verbose + } + else + { + $result = Set-AzureRmVMCustomScriptExtension -ResourceGroupName $resourceGroupName -VMName $vmName -Name $name -FileUri $fileUri -Run $run -Argument $argument -Location $location -ErrorAction Stop -Verbose + } + Write-Host (Get-VstsLocString -Key "AFC_SetCustomScriptExtensionComplete" -ArgumentList $name, $vmName) + if($result.IsSuccessStatusCode -eq $true) + { + $responseJObject = [Newtonsoft.Json.Linq.JObject]::Parse(($result | ConvertTo-Json)) + $result = $responseJObject.ToObject([System.Collections.Hashtable]) + $result.Status = "Succeeded" + } + } + + return $result +} + +function Get-NetworkSecurityGroups +{ + param([string]$resourceGroupName, + [string]$vmId) + + $securityGroups = New-Object System.Collections.Generic.List[System.Object] + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmId)) + { + Write-Verbose "[Azure Call]Getting network interfaces in resource group $resourceGroupName for vm $vmId" + if ($featureFlags.retireAzureRM) + { + $networkInterfaces = Get-AzNetworkInterface -ResourceGroupName $resourceGroupName | Where-Object { $_.VirtualMachine.Id -eq $vmId } + } + else + { + $networkInterfaces = Get-AzureRmNetworkInterface -ResourceGroupName $resourceGroupName | Where-Object { $_.VirtualMachine.Id -eq $vmId } + } + Write-Verbose "[Azure Call]Got network interfaces in resource group $resourceGroupName" + + if($networkInterfaces) + { + $noOfNics = $networkInterfaces.Count + Write-Verbose "Number of network interface cards present in the vm: $noOfNics" + + foreach($networkInterface in $networkInterfaces) + { + $networkSecurityGroupEntry = $networkInterface.NetworkSecurityGroup + if($networkSecurityGroupEntry) + { + $nsId = $networkSecurityGroupEntry.Id + Write-Verbose "Network Security Group Id: $nsId" + + $securityGroupName = $nsId.Split('/')[-1] + $sgResourceGroup = $nsId.Split('/')[4] + Write-Verbose "Security Group name is $securityGroupName and the related resource group $sgResourceGroup" + + # Get the network security group object + Write-Verbose "[Azure Call]Getting network security group $securityGroupName in resource group $sgResourceGroup" + if ($featureFlags.retireAzureRM) + { + $securityGroup = Get-AzNetworkSecurityGroup -ResourceGroupName $sgResourceGroup -Name $securityGroupName + } + else + { + $securityGroup = Get-AzureRmNetworkSecurityGroup -ResourceGroupName $sgResourceGroup -Name $securityGroupName + } + Write-Verbose "[Azure Call]Got network security group $securityGroupName in resource group $sgResourceGroup" + + $securityGroups.Add($securityGroup) + } + } + } + else + { + throw (Get-VstsLocString -Key "AFC_NoNetworkInterface" -ArgumentList $vmid , $resourceGroupName) + } + } + else + { + throw (Get-VstsLocString -Key "AFC_NullOrEmptyResourceGroup") + } + + return $securityGroups +} + +function Add-NetworkSecurityRuleConfig +{ + param([string]$resourceGroupName, + [object]$securityGroups, + [string]$ruleName, + [string]$rulePriotity, + [string]$winrmHttpsPort) + + if($securityGroups.Count -gt 0) + { + foreach($securityGroup in $securityGroups) + { + $securityGroupName = $securityGroup.Name + try + { + $winRMConfigRule = $null + + Write-Verbose "[Azure Call]Getting network security rule config $ruleName under security group $securityGroupName" + if ($featureFlags.retireAzureRM) + { + $winRMConfigRule = Get-AzNetworkSecurityRuleConfig -NetworkSecurityGroup $securityGroup -Name $ruleName -EA SilentlyContinue + } + else + { + $winRMConfigRule = Get-AzureRmNetworkSecurityRuleConfig -NetworkSecurityGroup $securityGroup -Name $ruleName -EA SilentlyContinue + } + Write-Verbose "[Azure Call]Got network security rule config $ruleName under security group $securityGroupName" + } + catch + { + #Ignore the exception + } + + # Add the network security rule if it doesn't exists + if(-not $winRMConfigRule) + { + $maxRetries = 3 + for($retryCnt=1; $retryCnt -le $maxRetries; $retryCnt++) + { + try + { + Write-Verbose "[Azure Call]Adding inbound network security rule config $ruleName with priority $rulePriotity for port $winrmHttpsPort under security group $securityGroupName" + if ($featureFlags.retireAzureRM) + { + $securityGroup = Add-AzNetworkSecurityRuleConfig -NetworkSecurityGroup $securityGroup -Name $ruleName -Direction Inbound -Access Allow -SourceAddressPrefix '*' -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange $winrmHttpsPort -Protocol * -Priority $rulePriotity + } + else + { + $securityGroup = Add-AzureRmNetworkSecurityRuleConfig -NetworkSecurityGroup $securityGroup -Name $ruleName -Direction Inbound -Access Allow -SourceAddressPrefix '*' -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange $winrmHttpsPort -Protocol * -Priority $rulePriotity + } + Write-Verbose "[Azure Call]Added inbound network security rule config $ruleName with priority $rulePriotity for port $winrmHttpsPort under security group $securityGroupName" + + Write-Verbose "[Azure Call]Setting the azure network security group" + if ($featureFlags.retireAzureRM) + { + $result = Set-AzNetworkSecurityGroup -NetworkSecurityGroup $securityGroup + } + else + { + $result = Set-AzureRmNetworkSecurityGroup -NetworkSecurityGroup $securityGroup + } + Write-Verbose "[Azure Call]Set the azure network security group" + } + catch + { + Write-Verbose "Failed to add inbound network security rule config $ruleName with priority $rulePriotity for port $winrmHttpsPort under security group $securityGroupName : $_.Exception.Message" + + $newPort = [convert]::ToInt32($rulePriotity, 10) + 50; + $rulePriotity = $newPort.ToString() + + Write-Verbose "[Azure Call]Getting network security group $securityGroupName in resource group $resourceGroupName" + if ($featureFlags.retireAzureRM) + { + $securityGroup = Get-AzNetworkSecurityGroup -ResourceGroupName $resourceGroupName -Name $securityGroupName + } + else + { + $securityGroup = Get-AzureRmNetworkSecurityGroup -ResourceGroupName $resourceGroupName -Name $securityGroupName + } + Write-Verbose "[Azure Call]Got network security group $securityGroupName in resource group $resourceGroupName" + + + if($retryCnt -eq $maxRetries) + { + throw $_ + } + + continue + } + + Write-Verbose "Successfully added the network security group rule $ruleName with priority $rulePriotity for port $winrmHttpsPort" + break + } + } + } + } +} + diff --git a/_generated/AzureFileCopyV4/AzureUtilityAz1.0.ps1 b/_generated/AzureFileCopyV4/AzureUtilityAz1.0.ps1 new file mode 100644 index 000000000000..95adbf3b6d44 --- /dev/null +++ b/_generated/AzureFileCopyV4/AzureUtilityAz1.0.ps1 @@ -0,0 +1,380 @@ +# This file implements IAzureUtility for Az PowerShell + +. "$PSScriptRoot/AzureUtilityRest.ps1" + +function Get-AzureStorageAccountResourceGroupName +{ + param([string]$storageAccountName) + + $ARMStorageAccountResourceType = "Microsoft.Storage/storageAccounts" + if (-not [string]::IsNullOrEmpty($storageAccountName)) + { + Write-Verbose "[Azure Call]Getting resource details for azure storage account resource: $storageAccountName with resource type: $ARMStorageAccountResourceType" + $azureStorageAccountResourceDetails = (Get-AzResource -ErrorAction Stop) | Where-Object { ($_.ResourceType -eq $ARMStorageAccountResourceType) -and ($_.Name -eq $storageAccountName)} + + Write-Verbose "[Azure Call]Retrieved resource details successfully for azure storage account resource: $storageAccountName with resource type: $ARMStorageAccountResourceType" + + $azureResourceGroupName = $azureStorageAccountResourceDetails.ResourceGroupName + if ([string]::IsNullOrEmpty($azureResourceGroupName)) + { + Write-Verbose "(ARM)Storage account: $storageAccountName not found" + Write-Telemetry "Task_InternalError" "RMStorageAccountNotFound" + Throw (Get-VstsLocString -Key "AFC_StorageAccountNotFound" -ArgumentList $storageAccountName) + } + + return $azureResourceGroupName + } +} + +function Create-AzureStorageContext +{ + param([string]$storageAccountName, + [string]$storageAccountKey) + + if(-not [string]::IsNullOrEmpty($storageAccountName) -and -not [string]::IsNullOrEmpty($storageAccountKey)) + { + Write-Verbose "[Azure Call]Creating AzStorageContext for storage account: $storageAccountName" + $storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey -ErrorAction Stop + Write-Verbose "[Azure Call]Created AzStorageContext for storage account: $storageAccountName" + + return $storageContext + } +} + +function Create-AzureContainer +{ + param([string]$containerName, + [object]$storageContext) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Creating container: $containerName in storage account: $storageAccountName" + $container = New-AzStorageContainer -Name $containerName -Context $storageContext -Permission Off -ErrorAction Stop + Write-Verbose "[Azure Call]Created container: $containerName successfully in storage account: $storageAccountName" + } +} + +function Get-AzureContainer +{ + param([string]$containerName, + [object]$storageContext) + + $container = $null + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Getting container: $containerName in storage account: $storageAccountName" + try + { + $container = Get-AzStorageContainer -Name $containerName -Context $storageContext -ErrorAction Stop + } + catch + { + Write-Verbose "Container: $containerName does not exist in storage account: $storageAccountName" + } + } + + return $container +} + +function Remove-AzureContainer +{ + param([string]$containerName, + [object]$storageContext) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Deleting container: $containerName in storage account: $storageAccountName" + Remove-AzStorageContainer -Name $containerName -Context $storageContext -Force -ErrorAction SilentlyContinue + Write-Verbose "[Azure Call]Deleted container: $containerName in storage account: $storageAccountName" + } +} + +function Get-AzureRMVMsInResourceGroup +{ + param([string]$resourceGroupName) + + If(-not [string]::IsNullOrEmpty($resourceGroupName)) + { + try + { + Write-Verbose "[Azure Call]Getting resource group:$resourceGroupName RM virtual machines type resources" + $azureRMVMResources = Get-AzVM -ResourceGroupName $resourceGroupName -ErrorAction Stop -WarningAction SilentlyContinue -Verbose + Write-Verbose "[Azure Call]Count of resource group:$resourceGroupName RM virtual machines type resource is $($azureRMVMResources.Count)" + + return $azureRMVMResources + } + catch [Hyak.Common.CloudException], [Microsoft.Rest.Azure.CloudException] + { + $exceptionMessage = $_.Exception.Message.ToString() + Write-Verbose "ExceptionMessage: $exceptionMessage" + + Write-Telemetry "Task_InternalError" "ResourceGroupNotFound" + throw (Get-VstsLocString -Key "AFC_ResourceGroupNotFound" -ArgumentList $resourceGroupName) + } + } +} + +function Get-AzureRMResourceGroupResourcesDetails +{ + param([string]$resourceGroupName, + [object]$azureRMVMResources) + + [hashtable]$azureRGResourcesDetails = @{} + [hashtable]$loadBalancerDetails = @{} + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and $azureRMVMResources) + { + Write-Verbose "[Azure Call]Getting network interfaces in resource group $resourceGroupName" + $networkInterfaceResources = Get-AzNetworkInterface -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + Write-Verbose "[Azure Call]Got network interfaces in resource group $resourceGroupName" + $azureRGResourcesDetails.Add("networkInterfaceResources", $networkInterfaceResources) + + Write-Verbose "[Azure Call]Getting public IP Addresses in resource group $resourceGroupName" + $publicIPAddressResources = Get-AzPublicIpAddress -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + Write-Verbose "[Azure Call]Got public IP Addresses in resource group $resourceGroupName" + $azureRGResourcesDetails.Add("publicIPAddressResources", $publicIPAddressResources) + + Write-Verbose "[Azure Call]Getting load balancers in resource group $resourceGroupName" + $lbGroup = Get-AzLoadBalancer -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + Write-Verbose "[Azure Call]Got load balancers in resource group $resourceGroupName" + + if($lbGroup) + { + foreach($lb in $lbGroup) + { + $lbDetails = @{} + Write-Verbose "[Azure Call]Getting load balancer in resource group $resourceGroupName" + $loadBalancer = Get-AzLoadBalancer -Name $lb.Name -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + Write-Verbose "[Azure Call]Got load balancer in resource group $resourceGroupName" + + Write-Verbose "[Azure Call]Getting LoadBalancer Frontend Ip Config" + $frontEndIPConfigs = Get-AzLoadBalancerFrontendIpConfig -LoadBalancer $loadBalancer -ErrorAction Stop -Verbose + Write-Verbose "[Azure Call]Got LoadBalancer Frontend Ip Config" + + Write-Verbose "[Azure Call]Getting Azure LoadBalancer Inbound NatRule Config" + $inboundRules = Get-AzLoadBalancerInboundNatRuleConfig -LoadBalancer $loadBalancer -ErrorAction Stop -Verbose + Write-Verbose "[Azure Call]Got Azure LoadBalancer Inbound NatRule Config" + + $lbDetails.Add("frontEndIPConfigs", $frontEndIPConfigs) + $lbDetails.Add("inboundRules", $inboundRules) + $loadBalancerDetails.Add($lb.Name, $lbDetails) + } + + $azureRGResourcesDetails.Add("loadBalancerResources", $loadBalancerDetails) + } + } + + return $azureRGResourcesDetails +} + +function Generate-AzureStorageContainerSASToken +{ + param([string]$containerName, + [object]$storageContext, + [System.Int32]$tokenTimeOutInMinutes) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Generating SasToken for container: $containerName in storage: $storageAccountName with expiry time: $tokenTimeOutInMinutes minutes" + $containerSasToken = New-AzStorageContainerSASToken -Name $containerName -ExpiryTime (Get-Date).AddMinutes($tokenTimeOutInMinutes) -Context $storageContext -Permission rwdl + Write-Verbose "[Azure Call]Generated SasToken: $containerSasToken successfully for container: $containerName in storage: $storageAccountName" + + return $containerSasToken + } +} + +function Get-AzureMachineStatus +{ + param([string]$resourceGroupName, + [string]$name) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($name)) + { + Write-Host (Get-VstsLocString -Key "AFC_GetVMStatus" -ArgumentList $name) + $status = Get-AzVM -ResourceGroupName $resourceGroupName -Name $name -Status -ErrorAction Stop -WarningAction SilentlyContinue -Verbose + Write-Host (Get-VstsLocString -Key "AFC_GetVMStatusComplete" -ArgumentList $name) + } + + return $status +} + +function Set-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name, + [string[]]$fileUri, + [string]$run, + [string]$argument, + [string]$location) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName) -and -not [string]::IsNullOrEmpty($name)) + { + Write-Host (Get-VstsLocString -Key "AFC_SetCustomScriptExtension" -ArgumentList $name, $vmName) + Write-Verbose "Set-AzVMCustomScriptExtension -ResourceGroupName $resourceGroupName -VMName $vmName -Name $name -FileUri $fileUri -Run $run -Argument $argument -Location $location -ErrorAction Stop -Verbose" + $result = Set-AzVMCustomScriptExtension -ResourceGroupName $resourceGroupName -VMName $vmName -Name $name -FileUri $fileUri -Run $run -Argument $argument -Location $location -ErrorAction Stop -Verbose + Write-Host (Get-VstsLocString -Key "AFC_SetCustomScriptExtensionComplete" -ArgumentList $name, $vmName) + if($result.IsSuccessStatusCode -eq $true) + { + $responseJObject = [Newtonsoft.Json.Linq.JObject]::Parse(($result | ConvertTo-Json)) + $result = $responseJObject.ToObject([System.Collections.Hashtable]) + $result.Status = "Succeeded" + } + } + + return $result +} + +function Get-NetworkSecurityGroups +{ + param([string]$resourceGroupName, + [string]$vmId) + + $securityGroups = New-Object System.Collections.Generic.List[System.Object] + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmId)) + { + Write-Verbose "[Azure Call]Getting network interfaces in resource group $resourceGroupName for vm $vmId" + $networkInterfaces = Get-AzNetworkInterface -ResourceGroupName $resourceGroupName | Where-Object { $_.VirtualMachine.Id -eq $vmId } + Write-Verbose "[Azure Call]Got network interfaces in resource group $resourceGroupName" + + if($networkInterfaces) + { + $noOfNics = $networkInterfaces.Count + Write-Verbose "Number of network interface cards present in the vm: $noOfNics" + + foreach($networkInterface in $networkInterfaces) + { + $networkSecurityGroupEntry = $networkInterface.NetworkSecurityGroup + if($networkSecurityGroupEntry) + { + $nsId = $networkSecurityGroupEntry.Id + Write-Verbose "Network Security Group Id: $nsId" + + $securityGroupName = $nsId.Split('/')[-1] + $sgResourceGroup = $nsId.Split('/')[4] + Write-Verbose "Security Group name is $securityGroupName and the related resource group $sgResourceGroup" + + # Get the network security group object + Write-Verbose "[Azure Call]Getting network security group $securityGroupName in resource group $sgResourceGroup" + $securityGroup = Get-AzNetworkSecurityGroup -ResourceGroupName $sgResourceGroup -Name $securityGroupName + Write-Verbose "[Azure Call]Got network security group $securityGroupName in resource group $sgResourceGroup" + + $securityGroups.Add($securityGroup) + } + } + } + else + { + throw (Get-VstsLocString -Key "AFC_NoNetworkInterface" -ArgumentList $vmid , $resourceGroupName) + } + } + else + { + throw (Get-VstsLocString -Key "AFC_NullOrEmptyResourceGroup") + } + + return $securityGroups +} + +function Add-NetworkSecurityRuleConfig +{ + param([string]$resourceGroupName, + [object]$securityGroups, + [string]$ruleName, + [string]$rulePriotity, + [string]$winrmHttpsPort) + + if($securityGroups.Count -gt 0) + { + foreach($securityGroup in $securityGroups) + { + $securityGroupName = $securityGroup.Name + try + { + $winRMConfigRule = $null + + Write-Verbose "[Azure Call]Getting network security rule config $ruleName under security group $securityGroupName" + $winRMConfigRule = Get-AzNetworkSecurityRuleConfig -NetworkSecurityGroup $securityGroup -Name $ruleName -EA SilentlyContinue + Write-Verbose "[Azure Call]Got network security rule config $ruleName under security group $securityGroupName" + } + catch + { + #Ignore the exception + } + + # Add the network security rule if it doesn't exists + if(-not $winRMConfigRule) + { + $maxRetries = 3 + for($retryCnt=1; $retryCnt -le $maxRetries; $retryCnt++) + { + try + { + Write-Verbose "[Azure Call]Adding inbound network security rule config $ruleName with priority $rulePriotity for port $winrmHttpsPort under security group $securityGroupName" + $securityGroup = Add-AzNetworkSecurityRuleConfig -NetworkSecurityGroup $securityGroup -Name $ruleName -Direction Inbound -Access Allow -SourceAddressPrefix '*' -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange $winrmHttpsPort -Protocol * -Priority $rulePriotity + Write-Verbose "[Azure Call]Added inbound network security rule config $ruleName with priority $rulePriotity for port $winrmHttpsPort under security group $securityGroupName" + + Write-Verbose "[Azure Call]Setting the azure network security group" + $result = Set-AzNetworkSecurityGroup -NetworkSecurityGroup $securityGroup + Write-Verbose "[Azure Call]Set the azure network security group" + } + catch + { + Write-Verbose "Failed to add inbound network security rule config $ruleName with priority $rulePriotity for port $winrmHttpsPort under security group $securityGroupName : $_.Exception.Message" + + $newPort = [convert]::ToInt32($rulePriotity, 10) + 50; + $rulePriotity = $newPort.ToString() + + Write-Verbose "[Azure Call]Getting network security group $securityGroupName in resource group $resourceGroupName" + $securityGroup = Get-AzNetworkSecurityGroup -ResourceGroupName $resourceGroupName -Name $securityGroupName + Write-Verbose "[Azure Call]Got network security group $securityGroupName in resource group $resourceGroupName" + + + if($retryCnt -eq $maxRetries) + { + throw $_ + } + + continue + } + + Write-Verbose "Successfully added the network security group rule $ruleName with priority $rulePriotity for port $winrmHttpsPort" + break + } + } + } + } +} + +function Import-AzModule +{ + param([string]$moduleName) + + if (!(Get-Module $moduleName)) + { + $module = Get-Module -Name $moduleName -ListAvailable | Sort-Object Version -Descending | Select-Object -First 1 + if (!$module) { + Write-Verbose "No module found with name: $moduleName" + } + else { + # Import the module. + Write-Host "##[command]Import-Module -Name $($module.Path) -Global" + $module = Import-Module -Name $module.Path -Global -PassThru -Force + } + } +} + +Import-AzModule -moduleName "Az.Resources" +Import-AzModule -moduleName "Az.Storage" +Import-AzModule -moduleName "Az.Compute" +Import-AzModule -moduleName "Az.Network" diff --git a/_generated/AzureFileCopyV4/AzureUtilityRest.ps1 b/_generated/AzureFileCopyV4/AzureUtilityRest.ps1 new file mode 100644 index 000000000000..36befc173b47 --- /dev/null +++ b/_generated/AzureFileCopyV4/AzureUtilityRest.ps1 @@ -0,0 +1,154 @@ +Import-Module $PSScriptRoot\ps_modules\VstsAzureRestHelpers_ + +function Get-AzureStorageKeyFromARM +{ + param([string]$storageAccountName, + [object]$serviceEndpoint, + [string][Parameter(Mandatory=$false)]$connectedServiceNameARM) + + if (-not [string]::IsNullOrEmpty($storageAccountName)) + { + # get azure storage account resource group name + $azureResourceGroupName = Get-AzureStorageAccountResourceGroupName -storageAccountName $storageAccountName + + Write-Verbose "[Azure Call]Retrieving storage key for the storage account: $storageAccount in resource group: $azureResourceid" + + $storageKeyDetails = Get-AzRMStorageKeys $azureResourceGroupName $storageAccountName $serviceEndpoint $connectedServiceNameARM + $storageKey = $storageKeyDetails.Key1 + Write-Verbose "[Azure Call]Retrieved storage key successfully for the storage account: $storageAccount in resource group: $azureResourceGroupName" + + return $storageKey + } +} + +function Get-AzureBlobStorageEndpointFromARM +{ + param([string]$storageAccountName, + [object]$endpoint, + [string]$connectedServiceNameARM) + + if(-not [string]::IsNullOrEmpty($storageAccountName)) + { + # get azure storage account resource group name + $azureResourceGroupName = Get-AzureStorageAccountResourceGroupName -storageAccountName $storageAccountName + + Write-Verbose "[Azure Call]Retrieving storage account endpoint for the storage account: $storageAccount in resource group: $azureResourceGroupName" + + $storageAccountInfo = Get-AzRMStorageAccount $azureResourceGroupName $storageAccountName $endpoint $connectedServiceNameARM -ErrorAction Stop + $storageAccountEnpoint = $storageAccountInfo.PrimaryEndpoints[0].blob + Write-Verbose "[Azure Call]Retrieved storage account endpoint successfully for the storage account: $storageAccount in resource group: $azureResourceGroupName" + + return $storageAccountEnpoint + } +} + +function Get-AzureStorageAccountTypeFromARM +{ + param([string]$storageAccountName, + [object]$endpoint, + [string]$connectedServiceNameARM) + + if(-not [string]::IsNullOrEmpty($storageAccountName)) + { + # get azure storage account resource group name + $azureResourceGroupName = Get-AzureStorageAccountResourceGroupName -storageAccountName $storageAccountName + + Write-Verbose "[Azure Call]Retrieving storage account type for the storage account: $storageAccount in resource group: $azureResourceGroupName" + $storageAccountInfo = Get-AzRMStorageAccount $azureResourceGroupName $storageAccountName $endpoint $connectedServiceNameARM -ErrorAction Stop + $storageAccountType = $storageAccountInfo.sku.tier + Write-Verbose "[Azure Call]Retrieved storage account type successfully for the storage account: $storageAccount in resource group: $azureResourceGroupName" + + return $storageAccountType + } +} + +function Get-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name, + [object]$endpoint, + [string]$connectedServiceNameARM) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName)) + { + Write-Host (Get-VstsLocString -Key "AFC_GetCustomScriptExtension" -ArgumentList $name, $vmName) + $customScriptExtension = Get-AzRmVmCustomScriptExtension $resourceGroupName $vmName $name $endpoint $connectedServiceNameARM + Write-Host (Get-VstsLocString -Key "AFC_GetCustomScriptExtensionComplete" -ArgumentList $name, $vmName) + } + + return $customScriptExtension +} + +function Remove-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name, + [object]$endpoint, + [string]$connectedServiceNameARM) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName) -and -not [string]::IsNullOrEmpty($name)) + { + Write-Host (Get-VstsLocString -Key "AFC_RemoveCustomScriptExtension" -ArgumentList $name, $vmName) + $response = Remove-AzRmVMCustomScriptExtension $resourceGroupName $vmName $name $endpoint $connectedServiceNameARM + Write-Host (Get-VstsLocString -Key "AFC_RemoveCustomScriptExtensionComplete" -ArgumentList $name, $vmName) + } + + return $response +} + +function Get-AzureRMResourceGroupResourcesDetailsForAzureStack +{ + param([string]$resourceGroupName, + [object]$azureRMVMResources, + [object]$endpoint, + [string]$connectedServiceNameARM) + + [hashtable]$azureRGResourcesDetails = @{} + [hashtable]$loadBalancerDetails = @{} + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and $azureRMVMResources) + { + Write-Verbose "[Azure Call]Getting network interfaces in resource group $resourceGroupName" + $networkInterfaceResources = Get-AzureNetworkInterfaceDetails $resourceGroupName $endpoint $connectedServiceNameARM + Write-Verbose "[Azure Call]Got network interfaces in resource group $resourceGroupName" + $azureRGResourcesDetails.Add("networkInterfaceResources", $networkInterfaceResources) + + Write-Verbose "[Azure Call]Getting public IP Addresses in resource group $resourceGroupName" + $publicIPAddressResources = Get-AzurePublicIpAddressDetails $resourceGroupName $endpoint $connectedServiceNameARM + Write-Verbose "[Azure Call]Got public IP Addresses in resource group $resourceGroupName" + $azureRGResourcesDetails.Add("publicIPAddressResources", $publicIPAddressResources) + + Write-Verbose "[Azure Call]Getting load balancers in resource group $resourceGroupName" + $lbGroup = Get-AzureLoadBalancersDetails $resourceGroupName $endpoint $connectedServiceNameARM + Write-Verbose "[Azure Call]Got load balancers in resource group $resourceGroupName" + + if($lbGroup) + { + foreach($lb in $lbGroup) + { + $lbDetails = @{} + Write-Verbose "[Azure Call]Getting load balancer in resource group $resourceGroupName" + $loadBalancer = Get-AzureLoadBalancerDetails $resourceGroupName $lb.Name $endpoint $connectedServiceNameARM + Write-Verbose "[Azure Call]Got load balancer in resource group $resourceGroupName" + + Write-Verbose "[Azure Call]Getting LoadBalancer Frontend Ip Config" + $frontEndIPConfigs = Get-AzureRMLoadBalancerFrontendIpConfigDetails -LoadBalancer $loadBalancer + Write-Verbose "[Azure Call]Got LoadBalancer Frontend Ip Config" + + Write-Verbose "[Azure Call]Getting Azure LoadBalancer Inbound NatRule Config" + $inboundRules = Get-AzureRMLoadBalancerInboundNatRuleConfigDetails -LoadBalancer $loadBalancer + Write-Verbose "[Azure Call]Got Azure LoadBalancer Inbound NatRule Config" + + $lbDetails.Add("frontEndIPConfigs", $frontEndIPConfigs) + $lbDetails.Add("inboundRules", $inboundRules) + $loadBalancerDetails.Add($lb.Name, $lbDetails) + } + + $azureRGResourcesDetails.Add("loadBalancerResources", $loadBalancerDetails) + } + } + + return $azureRGResourcesDetails +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/PreJobExecutionAzureFileCopy.ts b/_generated/AzureFileCopyV4/PreJobExecutionAzureFileCopy.ts new file mode 100644 index 000000000000..f0bacc48a816 --- /dev/null +++ b/_generated/AzureFileCopyV4/PreJobExecutionAzureFileCopy.ts @@ -0,0 +1,54 @@ +import tl = require('azure-pipelines-task-lib/task'); +import path = require('path'); +import fs = require('fs') +import armStorage = require('azure-pipelines-tasks-azure-arm-rest/azure-arm-storage'); +import msRestAzure = require('azure-pipelines-tasks-azure-arm-rest/azure-arm-common'); +import { AzureRMEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; +import { AzureEndpoint, StorageAccount } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; + +function isNonEmpty(str: string): boolean { + return (!!str && !!str.trim()); +} + +function getResourceGroupNameFromUri(resourceUri: string): string { + if (isNonEmpty(resourceUri)) { + resourceUri = resourceUri.toLowerCase(); + return resourceUri.substring(resourceUri.indexOf("resourcegroups/") + "resourcegroups/".length, resourceUri.indexOf("/providers")); + } + + return ""; +} + +async function run(): Promise { + let tempDirectory: string = tl.getVariable('Agent.TempDirectory'); + let fileName: string = Math.random().toString(36).replace('0.', ''); + let file: string = path.resolve(tempDirectory, fileName); + try { + const taskManifestPath = path.join(__dirname, "task.json"); + tl.debug("Setting resource path to " + taskManifestPath); + tl.setResourcePath(taskManifestPath); + let connectionType = tl.getInput('ConnectedServiceNameSelector', false); + if(connectionType === 'ConnectedServiceNameARM') { + let connectedServiceName = tl.getInput('ConnectedServiceNameARM', true); + let storageAccountName = tl.getInput('StorageAccountRM', true); + var azureEndpoint: AzureEndpoint = await new AzureRMEndpoint(connectedServiceName).getEndpoint(); + const storageArmClient = new armStorage.StorageManagementClient(azureEndpoint.applicationTokenCredentials, azureEndpoint.subscriptionID); + let storageAccount: StorageAccount = await storageArmClient.storageAccounts.get(storageAccountName); + let storageAccountResourceGroupName = getResourceGroupNameFromUri(storageAccount.id); + let accessKeys = await storageArmClient.storageAccounts.listKeys(storageAccountResourceGroupName, storageAccountName, null); + let accessKey: string = accessKeys[0]; + let data: string = `/DestKey:\"${accessKey}\"`; + let options = { encoding : "utf8" } + fs.writeFileSync(file, data, options); + tl.setTaskVariable('AFC_V2_ARM_STORAGE_KEY_FILE', file); + tl.debug("Response file created"); + } + } catch(error) { + if (fs.existsSync(file)) { + fs.unlinkSync(file); + } + console.log(tl.loc("AFC_PreexecutionJob_UnableToGetStorageKey", error)); + } +} + +run() \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/README.md b/_generated/AzureFileCopyV4/README.md new file mode 100644 index 000000000000..81c8af8f201d --- /dev/null +++ b/_generated/AzureFileCopyV4/README.md @@ -0,0 +1,124 @@ +# Azure File Copy + +### Overview + +The task is used to copy application files and other artifacts that are required to install the application on Azure VMs like PowerShell scripts, PowerShell-DSC modules etc. The task provides the ability to copy files to an Azure blob or directly to Azure VMs. Even when the target is Azure VMs, Azure blobs are used as an intermediary and the files are copied to it first and then downloaded to the VMs. The tasks uses [AzCopy](https://azure.microsoft.com/en-in/documentation/articles/storage-use-azcopy/), the command-line utility built for fast copying of data from and into Azure storage accounts. + +### Contact Information + +Please report a problem at [Developer Community Forum](https://developercommunity.visualstudio.com/spaces/21/index.html) if you are facing problems in making this task work. You can also share feedback about the task like, what more functionality should be added to the task, what other tasks you would like to have, at the same place. + +### Prerequisite for the task + +**Azure Subscription** + +To deploy to Azure, an Azure subscription has to be linked to Team Foundation Server or to Azure Pipelines using the Services tab in the Account Administration section. Add the Azure subscription to use in the Build or Release Management definition by opening the Account Administration screen (gear icon on the top-right of the screen) and then click on the Services Tab. + + - Use 'Azure Resource Manager' endpoint type to create a ARM endpoint, for more details follow the steps listed in the link [here](https://go.microsoft.com/fwlink/?LinkID=623000&clcid=0x409). + - As this version of task uses AzCopy 10, service principal needs to have one of these `Storage Blob Data Contributor` or `Storage Blob Data Owner` roles assigned to access resources. + 1. Click on `Manage` link next to Azure Subscription + 2. Click `Manage Service Principal` which will redirect you to the Application Registration of the Service Principal. Copy the name. + 3. Go back and click `Manage service connection roles` which will redirect you to the IAM blade of the Azure Subscription. Here you need to assign a role to the service principal. Use name copied in previous step to search service principal + +**PowerShell** + +The task needs at least version 3.0 of Powershell on the target machine. + +**Azure PowerShell** + +The task needs the Azure PowerShell version to be installed on the automation agent, and that can be done easily using the [Azure PowerShell Installer v1.0.2] (https://github.com/Azure/azure-powershell/releases/tag/v1.0.2-December2015). Refer to "Supported Azure and AzureRM module versions" section below for recommended versions. + +**Azure Virtual Machines** + +The task can copy files to the Azure Virtual Machines that are created either using the [new azure portal](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-tutorial/). For copying the files to VMs, they are first copied to an automatically generated container in the Azure storage account, and then from there to the VMs. The container is deleted after the files are copied successfully to the VMs. + +To dynamically deploy Azure resource groups with virtual machines in them use the [Azure Resource Group Deployment](https://github.com/Microsoft/vsts-tasks/tree/master/Tasks/DeployAzureResourceGroup) task. The task has a sample template that can setup the WinRM HTTPS protocol on the virtual machines, open the 5986 port in the Firewall, and install the test certificate. After this the virtual machines are ready for use in the deployment task. + +If the VMs have been created without opening the WinRM HTTPS ports then follow the steps below to setup the machine for WinRM HTTPS: + +- In the target machine, the WinRM HTTPS port (default 5986) should be open in the Firewall. Disable [UAC remote restrictions](https://support.microsoft.com/en-us/kb/951016) and the credentials should be in the format of username like vmuser, where vmuser is the admin user of the VM. +- The trusted certificate should be installed in the Automation agent, and if the trusted certificate is not installed in the Automation agent, then ensure that the Test Certificate option is selected in the task for the application deployment to work. +- For more guidance refer this [blog](https://blogs.msdn.com/b/muthus_blog/archive/2015/11/04/pre-requisites-for-using-azure-vms-in-winrm-based-tasks-in-build-and-rm-workflows.aspx). + +### Parameters of the task: + +The parameters of the task are described in details, including examples, to show how to input the parameters. The parameters listed with a * are required parameters for the task: + +* **Azure Subscription**: The name of Azure subscription, where the Azure storage account is located. The storage account is accessed using the stored credentials of the Azure account in the Services tab. + +* **Source**: The source of the files. As described above using pre-defined system variables like $(Build.Repository.LocalPath) make it easy to specify the location of the build on the Build Automation Agent machine. The variables resolve to the working folder on the agent machine, when the task is run on it. Note that wild cards like *\.zip are not supported. + +* **Storage Account**: The name of an existing storage account in the Azure Subscription specified earlier. + +* **Destination**: The target for copying the files and is either an Azure blob or VMs. The section below details the parameters that need to be filled-out if the target is Azure VMs. + + * **Resource Group**: Name of the resource group that contains the Azure VMs. + + * **Select Machines By**: The parameter is used to copy the files to a subset of VMs and the subset can be specified by the host name of the VMs or the tags on them. [Tags](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) are supported for resources created via the Azure Resource Manager only. + + * **Filter Criteria**: If you are copying to a subset of VMs using machine names filter, you can provide a comma separated list of the VM host names for example, ffweb, ffdb1, ffdb2. If you are using tags then you can specify tags in the format “:, :” for example, role:web, db; OS:win7. The default behavior is to copy to all the VMs in the Resource Group. Note the delimiters used for tags are ,(comma), :(colon) and ;(semicolon). + + * **Admin Login**: Administrator Username for all the Azure VMs in the Resource Group. + + * **Password**: Administrator Username password for all the Azure VMs in the Resource Group. + + * **Destination Folder**: The folder in the Azure VMs where the files will be copied to. Environment variables are also supported like $env:windir, $env:systemroot etc. An example of the destination folder is $env:windir\FabrikamFibre\Web or c:\FabrikamFibre. + + * **Enable Copy Prerequisites**: Enabling this option configures Windows Remote Management (WinRM) listener over HTTPS protocol on port 5986, using a self-signed certificate. This configuration is required for performing copy operation on Azure machines. If the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). If the target Virtual Machines are associated with a Network security group (NSG), configure Inbound security rules for Destination port (5986). Applicable only for ARM VMs. + + * **Copy in Parallel**: Selecting this option will copy files to all the VMs in the Resource Group in-parallel, hence speeding up the process of copying. + + * **Clean Target**: Selecting this option will clean the destination folder prior to copying the files to it. + + * **Test Certificate**: This setting is required while copying the files from the blob containers to the Azure VMs. The copy operation is initiated over the WinRM HTTPS protocol and if the VM has a test certificate installed on it, then select this option to to skip the validation that the server certificate is signed by a trusted certificate authority (CA). + +* **Destination**: If the target is Azure blob then the following parameters need to be filled out. + + * **Container Name**: The name of the container where the files will be copied to. If the container does not exist then a new one will be created with the name provided in this parameter. + + * **Blob Prefix**: A prefix for the Blobs that can be used to filter the blobs like appending the Build number to the blobs, so that all the blobs with the same build number can be downloaded from the Container. + +* **Additional Arguments**: Additional [AzCopy.exe](https://azure.microsoft.com/en-us/documentation/articles/storage-use-azcopy/) arguments that will be applied for uploading to blob and same will be applied for downloading while copy to VM. + * **Blob Destination**: Supported additional arguments for copy to blob are /BlobType:, /Pattern:, /L, /Z, /XN, /A, /IA:, /XA:, /NC:, /DestType: and /SetContentType. + + * **VM Destination**: Supported additional parameters for copy to VM are /Pattern:, /L, /NC: and /XN. + +### Output Variables + +The task creates the following as output variables: +* **StorageContainerUri**: When copying files to an Azure container, this parameter returns the Uri of the container were the files were copied to. +* **StorageContainerSasToken**: When copying files to an Azure container, a SasToken is created and returned. By default, this token expires after 4 hours. + +Following the [output variables](https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#use-output-variables-from-tasks) documentation and naming the step, we can then reference the variables like so: + +```yaml +- task: AzureFileCopy@4 + inputs: + SourcePath: 'Readme.md' + azureSubscription: 'Azure' + Destination: 'AzureBlob' + storage: 'storageAccount' + ContainerName: 'containerName' + BlobPrefix: '' + name: AzureFileCopy + +- script: | + echo $(AzureFileCopy.StorageContainerUri) + echo $(AzureFileCopy.StorageContainerSasToken) +``` + +### Known Limitations : + +* If resource group contains both [resource manager](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-tutorial/) and [classic](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-tutorial-classic-portal/) VMs, then copy operation will be performed only on resource manager VMs. +* To use Premium storage account, which only support Azure page blobs, please pass /BlobType:Page as additional arguments. + +### Earlier Versions + +If you want to work with earlier version of this task, please refer README.md present at https://github.com/Microsoft/vsts-tasks/tree/releases/m94/Tasks/AzureFileCopy/. + +### Supported Azure and AzureRM module versions: +| Azure Pipelines/TFS Release | Recommended Azure Version +|:------------------:|:---------------------------:| +| Azure Pipelines | [v1.3.2] (https://github.com/Azure/azure-powershell/releases/tag/v1.3.2-April2016) | +| TFS 2015 Update 3 | [v1.3.2] (https://github.com/Azure/azure-powershell/releases/tag/v1.3.2-April2016) | +| TFS 2015 Update 2 | [v1.0.2] (https://github.com/Azure/azure-powershell/releases/tag/v1.0.2-December2015) | diff --git a/_generated/AzureFileCopyV4/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzureFileCopyV4/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..da7c2d073501 --- /dev/null +++ b/_generated/AzureFileCopyV4/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,93 @@ +{ + "loc.friendlyName": "Azure-Dateikopiervorgang", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Hiermit werden Dateien in Azure Blob Storage oder VMs kopiert.", + "loc.instanceNameFormat": "$(Destination)-Dateikopiervorgang", + "loc.releaseNotes": "Neuerungen in Version 4.0:
   Unterstützung von AzCopy.exe-Version 10.8.0", + "loc.input.label.SourcePath": "Quelle", + "loc.input.help.SourcePath": "Der absolute Pfad des Quellordners oder der Datei auf dem lokalen Computer oder eine UNC-Freigabe. Der Ausdruck muss einen einzelnen Ordner oder eine Datei zurückgeben. Das Platzhaltersymbol (*) wird an beliebiger Stelle im Dateipfad oder im Dateinamen unterstützt.", + "loc.input.label.ConnectedServiceNameARM": "Azure-Abonnement", + "loc.input.help.ConnectedServiceNameARM": "Azure Resource Manager-Abonnement, das als Ziel für den Kopiervorgang von Dateien dient.", + "loc.input.label.Destination": "Zieltyp", + "loc.input.help.Destination": "Wählen Sie als Ziel entweder Azure-Blob oder Azure-VMs aus.", + "loc.input.label.StorageAccountRM": "RM-Speicherkonto", + "loc.input.help.StorageAccountRM": "Geben Sie ein bereits vorhandenes ARM-Speicherkonto an. Es wird auch als Zwischenspeicher zum Kopieren von Dateien in virtuelle Azure-Maschinen verwendet.", + "loc.input.label.ContainerName": "Containername", + "loc.input.help.ContainerName": "Der Name des Containers zum Hochladen der Dateien. Wenn im angegebenen Speicherkonto kein Container mit dem angegebenen Namen vorhanden ist, wird er automatisch erstellt.
Wenn Sie ein virtuelles Verzeichnis innerhalb des Containers erstellen möchten, verwenden Sie die unten aufgeführte Blobpräfixeingabe.
Beispiel: Wenn der Zielort https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/ lautet, geben Sie mycontainer als Containername und vd1/vd2 als Blobpräfix an.", + "loc.input.label.BlobPrefix": "Blobpräfix", + "loc.input.help.BlobPrefix": "Nützlich zum Filtern von Dateien, z. B. das Anfügen der Buildnummer an alle Blobs, um nur Dateien aus diesem Build herunterzuladen. Beispiel: Wenn Sie das Blobpräfix als myvd1/ angeben, wird innerhalb des Containers ein virtuelles Verzeichnis mit diesem Namen erstellt. Das Blobpräfix mit dem nachstehenden \"/\" wird als virtuelles Verzeichnis betrachtet. Andernfalls wird es als Datei behandelt, es sei denn, das Element, das kopiert wird, ist selbst ein Ordner. Die Quelldateien werden in https://myaccount.blob.core.windows.net/mycontainer/myvd1/ kopiert.", + "loc.input.label.EnvironmentNameRM": "Ressourcengruppe", + "loc.input.help.EnvironmentNameRM": "Der Name der Zielressourcengruppe, in die Dateien kopiert werden sollen.", + "loc.input.label.ResourceFilteringMethod": "Computer auswählen nach", + "loc.input.help.ResourceFilteringMethod": "Wählen Sie optional eine Teilmenge der virtuellen Maschinen in der Ressourcengruppe durch Angeben des Hostnamens oder der Tags der virtuellen Maschinen aus. [Tags](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) werden nur für Ressourcen unterstützt, die über den Azure Resource Manager erstellt werden.", + "loc.input.label.MachineNames": "Filterkriterien", + "loc.input.help.MachineNames": "Stellen Sie eine Liste der VM-Hostnamen (z. B. \"ffweb\", \"ffdb\") oder Tags (z. B. \"Role:DB\", \"Web; OS:Win8.1\" bereit. Beachten Sie, dass die für Tags verwendeten Trennzeichen \",\" (Komma), \":\" (Doppelpunkt) und \";\" (Semikolon) sind. Wenn mehrere Tags angegeben werden, wird der Task auf allen virtuellen Maschinen mit den angegebenen Tags ausgeführt. Standardmäßig wird der Task auf allen virtuellen Maschinen ausgeführt.", + "loc.input.label.vmsAdminUserName": "Administratoranmeldung", + "loc.input.help.vmsAdminUserName": "Der Benutzername des Administrators der virtuellen Maschinen.", + "loc.input.label.vmsAdminPassword": "Kennwort", + "loc.input.help.vmsAdminPassword": "Das Administratorkennwort der VMs.
Die in den Build- oder Releasepipelines als \"$(passwordVariable)\" festgelegten Variablen werden akzeptiert.
Sie können die Variable als \"secret\" markieren, um sie abzusichern.", + "loc.input.label.TargetPath": "Zielordner", + "loc.input.help.TargetPath": "Lokaler Pfad auf den Zielcomputern zum Kopieren der Dateien aus der Quelle. Die Umgebungsvariable kann wie folgt verwendet werden: $env:windir\\BudgetIT\\Web.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "Optionale Argumente (für das Hochladen von Dateien in das Blob)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Optionale AzCopy.exe-Argumente, die beim Hochladen in ein Blob angewendet werden, z. B. --check-length=true. Werden hier keine optionalen Argumente angegeben, werden standardmäßig die folgenden optionalen Argumente hinzugefügt.
--log-level=INFO (verwenden Sie bei Ausführung der Pipeline im Debugmodus \"--log-level=DEBUG\"),
--recursive (nur, wenn der Containername nicht \"$root\" lautet),
--blob-type=PageBlob (nur, wenn das angegebene Speicherkonto ein Premium-Konto ist)", + "loc.input.label.AdditionalArgumentsForVMCopy": "Optionale Argumente (für das Herunterladen von Dateien auf die VM)", + "loc.input.help.AdditionalArgumentsForVMCopy": "Optionale AzCopy.exe-Argumente, die beim Herunterladen auf eine VM angewendet werden, z. B. --check-length=true. Werden hier keine optionalen Argumente angegeben, werden standardmäßig die folgenden optionalen Argumente hinzugefügt.
--log-level=INFO (verwenden Sie bei Ausführung der Pipeline im Debugmodus \"--log-level=DEBUG\"),
--recursive ", + "loc.input.label.sasTokenTimeOutInMinutes": "Gültigkeitsdauer des SAS-Tokens in Minuten", + "loc.input.help.sasTokenTimeOutInMinutes": "Geben Sie die Zeit in Minuten an, nach der das SAS-Token für den Container abläuft. Dieses Token läuft standardmäßig nach 4 Stunden ab.", + "loc.input.label.enableCopyPrerequisites": "Kopiervoraussetzungen aktivieren", + "loc.input.help.enableCopyPrerequisites": "Durch das Aktivieren dieser Option wird der Listener der Windows-Remoteverwaltung (Windows Remote Management, WinRM) über das HTTPS-Protokoll an Port 5986 mithilfe eines selbstsignierten Zertifikats konfiguriert. Diese Konfiguration ist zum Ausführen des Kopiervorgangs auf Azure-Computern erforderlich. Wenn die virtuellen Zielcomputer durch Lastenausgleich gesichert werden, stellen Sie sicher, dass die Regeln für eingehenden NAT-Datenverkehr für den Zielport (5986) konfiguriert sind. Gilt nur für virtuelle ARM-Computer.", + "loc.input.label.CopyFilesInParallel": "Parallel kopieren", + "loc.input.help.CopyFilesInParallel": "Wenn diese Option auf \"True\" festgelegt ist, werden Dateien parallel auf die Zielcomputer kopiert.", + "loc.input.label.CleanTargetBeforeCopy": "Ziel bereinigen", + "loc.input.help.CleanTargetBeforeCopy": "Wenn diese Option auf \"True\" festgelegt ist, wird der Zielordner vor dem Kopieren der Dateien bereinigt.", + "loc.input.label.skipCACheck": "Testzertifikat", + "loc.input.help.skipCACheck": "Wenn diese Option ausgewählt wird, überspringt der Client die Überprüfung, ob das Serverzertifikat von einer vertrauenswürdigen Zertifizierungsstelle (CA) signiert wurde, wenn eine Verbindung über HTTPS (Hypertext Transfer Protocol über Secure Socket Layer) hergestellt wird.", + "loc.messages.AFC_StorageAccountNotFound": "Das Speicherkonto \"{0}\" wurde nicht gefunden. Die ausgewählte Dienstverbindung \"Dienstprinzipal\" unterstützt nur Speicherkonten des Azure Resource Manager-Typs.", + "loc.messages.AFC_ResourceGroupNotFound": "Die angegebene Ressourcengruppe \"{0}\" ist nicht vorhanden.", + "loc.messages.AFC_GetVMStatus": "[Azure-Aufruf]Der Status für den virtuellen Computer \"{0}\" wird abgerufen.", + "loc.messages.AFC_GetVMStatusComplete": "[Azure-Aufruf]Der Status für den virtuellen Computer \"{0}\" wurde abgerufen.", + "loc.messages.AFC_GetCustomScriptExtension": "[Azure-Aufruf]Die benutzerdefinierte Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\" wird abgerufen.", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Azure-Aufruf]Die benutzerdefinierte Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\" wurde abgerufen.", + "loc.messages.AFC_SetCustomScriptExtension": "[Azure-Aufruf]Die benutzerdefinierte Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\" wird festgelegt.", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Azure-Aufruf]Die benutzerdefinierte Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\" wird festgelegt.", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Azure-Aufruf]Die benutzerdefinierte Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\" wird entfernt.", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Azure-Aufruf]Die benutzerdefinierte Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\" wurde entfernt.", + "loc.messages.AFC_NoNetworkInterface": "[Azure-Aufruf]Es wurde keine Netzwerkschnittstelle mit der ID {0} des virtuellen Computers unter der Ressourcengruppe \"{1}\" gefunden.", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Azure-Aufruf]Der Name der Ressourcengruppe und die ID des virtuellen Computers dürfen nicht NULL oder leer sein.", + "loc.messages.AFC_AzurePSNotInstalled": "Die erforderliche Mindestversion {0} der Azure PowerShell-Cmdlets ist nicht installiert. Sie können die Anweisungen unter https://azure.microsoft.com/en-in/documentation/articles/powershell-install-configure/ befolgen, um das aktuellste Azure PowerShell-Modul abzurufen.", + "loc.messages.AFC_ClassicStorageAccountNotFound": "Das Speicherkonto \"{0}\" wurde nicht gefunden. Die ausgewählte Dienstverbindung \"Zertifikat\" unterstützt nur Speicherkonten des Typs \"Azure klassisch\".", + "loc.messages.AFC_GenericStorageAccountNotFound": "Das Speicherkonto \"{0}\" wurde nicht gefunden. Bitte geben Sie ein vorhandenes Speicherkonto an.", + "loc.messages.AFC_AzureFileCopyMoreHelp": "Weitere Informationen finden Sie unter {0}.", + "loc.messages.AFC_UploadFilesStorageAccount": "Dateien werden aus dem Quellpfad \"{0}\" in das Speicherkonto \"{1}\" im Container \"{2}\" mit dem Blobpräfix \"{3}\" hochgeladen.", + "loc.messages.AFC_UploadContainerStorageAccount": "Fehler beim Hochladen in den Container \"{0}\" im Speicherkonto \"{1}\" mit dem Blobpräfix \"{2}\": \"{3}\"", + "loc.messages.AFC_UploadFileSuccessful": "Dateien wurden aus dem Quellpfad \"{0}\" in das Speicherkonto \"{1}\" im Container \"{2}\" mit dem Blobpräfix \"{3}\" erfolgreich hochgeladen.", + "loc.messages.AFC_IncorrectTags": "Tags wurden falsch angegeben. Sie müssen das folgende Format aufweisen: \"Role:Web,DB;Location:East US;Dept.:Finance,HR\".", + "loc.messages.AFC_MachineDoesNotExist": "Die folgenden Computer sind in der Ressourcengruppe nicht vorhanden, oder ihre Namen wurde nicht richtig angegeben: {0}. Geben Sie die genauen Namen der Computer an, die in der Ressourcengruppe vorhanden sind. Verwenden Sie Kommas, um mehrere Computernamen zu trennen.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "{0} für alle Ressourcen in der folgenden ResourceGroup können nicht abgerufen werden: \"{1}\"", + "loc.messages.AFC_MachineNameFromIdError": "{0} für {1}-Ressourcen in der folgenden ResourceGroup können nicht abgerufen werden: \"{2}\"", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "Die Ressource \"{1}\" kann mithilfe der ausgewählten Dienstverbindung \"{0}\" nicht gefunden werden. Die ausgewählte Dienstverbindung \"{0}\" unterstützt nur klassische Ressourcen (Dienstverwaltungsmodell).", + "loc.messages.AFC_NoClassicVMResources": "Unter der Ressourcengruppe \"{0}\" ist kein Computer zum Kopieren vorhanden. Die ausgewählte Dienstverbindung \"{1}\" unterstützt nur virtuelle Computer des Typs \"Azure klassisch\".", + "loc.messages.AFC_NoARMVMResources": "Unter der Ressourcengruppe \"{0}\" ist kein Computer zum Kopieren vorhanden. Die ausgewählte Dienstverbindung \"{1}\" unterstützt nur virtuelle Computer des Typs \"Azure Resource Manager\".", + "loc.messages.AFC_NoGenericVMResources": "Unter der Ressourcengruppe \"{0}\" ist kein Computer zum Kopieren vorhanden.", + "loc.messages.AFC_FilteringNoVMResources": "Unter der Ressourcengruppe ist kein Computer vorhanden: \"{0}\" mit den folgenden {1} \"{2}\".", + "loc.messages.AFC_CopyStarted": "Der Kopiervorgang wurde für den Computer gestartet: \"{0}\"", + "loc.messages.AFC_CopyCompleted": "Kopierstatus für den Computer \"{0}\": \"{1}\"", + "loc.messages.AFC_WinRMHelpMessage": "Wählen Sie zum Beheben von Problemen, die sich auf die WinRM-Dienstverbindung beziehen, die Option \"Kopiervoraussetzungen aktivieren\" in der Aufgabe aus. Wenn diese Einstellung bereits festgelegt ist und die virtuellen Zielcomputer durch einen Lastenausgleich gesichert sind, stellen Sie sicher, dass die Regeln für eingehenden NAT-Datenverkehr für den Zielport (5986) konfiguriert sind. Gilt nur für virtuelle ARM-Computer.", + "loc.messages.AFC_CopyFailed": "Fehler beim Kopieren auf dem Computer \"{0}\". Weitere Informationen finden Sie in den Protokollen.", + "loc.messages.AFC_ParallelCopyFailed": "Fehler beim Kopieren auf mindestens einen Computer. Weitere Informationen finden Sie in den Protokollen.", + "loc.messages.AFC_CopySuccessful": "Dateien wurden erfolgreich aus dem Quellpfad \"{0}\" auf virtuelle Azure-Zielcomputer in der Ressourcengruppe \"{1}\" kopiert.", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "Fehler beim Festlegen der benutzerdefinierten Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\": {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "Fehler beim Hinzufügen der Netzwerksicherheitsregel: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "Die benutzerdefinierte Skripterweiterung \"{0}\" kann nicht für den virtuellen Computer \"{1}\" festgelegt werden: {2}", + "loc.messages.AFC_CopyPrereqsFailed": "Fehler beim Aktivieren der Kopiervoraussetzungen. {0}", + "loc.messages.AFC_BlobStorageNotFound": "Das Speicherkonto \"{0}\" wurde nicht gefunden. Bitte geben Sie ein vorhandenes Speicherkonto an.", + "loc.messages.AFC_RootContainerAndDirectory": "Die Option \"/S\" gilt nicht für \"$root\"-Container.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "Der HTTP-Antwortcode \"{0}\" ist kein gültiger Umleitungsstatuscode.", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "Der Adressheader der Umleitungsantwort ist NULL.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "\"AzCopy.exe\" wurde mit einem Exitcode ungleich null beendet, während Dateien in den Blobspeicher hochgeladen wurden.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "Der Speicherkontoschlüssel konnte nicht abgerufen werden. Fehler: {0}", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "Deinstallieren Sie das benutzerdefinierte WinRM-Skript manuell, und wiederholen Sie die Bereitstellung.", + "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", + "loc.messages.UnsupportedAuthScheme": "Nicht unterstütztes Authentifizierungsschema \"{0}\" für Endpunkt.", + "loc.messages.ServicePrincipalError": "Fehler im für die Bereitstellung verwendeten Dienstprinzipal." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzureFileCopyV4/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..150213a6401e --- /dev/null +++ b/_generated/AzureFileCopyV4/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,93 @@ +{ + "loc.friendlyName": "Azure file copy", + "loc.helpMarkDown": "[Learn more about this task](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Copy files to Azure Blob Storage or virtual machines", + "loc.instanceNameFormat": "$(Destination) File Copy", + "loc.releaseNotes": "What's new in Version 4.0:
   Support AzCopy.exe version 10.8.0", + "loc.input.label.SourcePath": "Source", + "loc.input.help.SourcePath": "Absolute path of the source folder, or file on the local machine, or a UNC share. Expression should return a single folder or a file. Wild card symbol (*) is supported anywhere in the file path or file name.", + "loc.input.label.ConnectedServiceNameARM": "Azure Subscription", + "loc.input.help.ConnectedServiceNameARM": "Azure Resource Manager subscription to target for copying the files.", + "loc.input.label.Destination": "Destination Type", + "loc.input.help.Destination": "Select the destination, either Azure Blob or Azure VMs.", + "loc.input.label.StorageAccountRM": "RM Storage Account", + "loc.input.help.StorageAccountRM": "Specify a pre-existing ARM storage account. It is also used as an intermediary for copying files to Azure VMs", + "loc.input.label.ContainerName": "Container Name", + "loc.input.help.ContainerName": "Name of the Container for uploading the files. If a container with the given name does not exist in the specified storage account, it will automatically be created.
If you need to create a virtual directory inside the container, use the blob prefix input below.
Example: If your target location is https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/, then specify mycontainer as container name and vd1/vd2/ as blob prefix.", + "loc.input.label.BlobPrefix": "Blob Prefix", + "loc.input.help.BlobPrefix": "Useful for filtering files, for example, append build number to all the blobs to download files from that build only. Example: If you specify blob prefix as myvd1/, a virtual directory with this name will be created inside the container. Blob prefix with a trailing '/' will be considered a virtual directory. Otherwise, it will be treated as a file, unless the item being copied is itself a folder. The source files will be copied to https://myaccount.blob.core.windows.net/mycontainer/myvd1/.", + "loc.input.label.EnvironmentNameRM": "Resource Group", + "loc.input.help.EnvironmentNameRM": "Name of the target Resource Group for copying files to.", + "loc.input.label.ResourceFilteringMethod": "Select Machines By", + "loc.input.help.ResourceFilteringMethod": "Optionally, select a subset of VMs in resource group either by providing VMs host name or tags. [Tags](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) are supported for resources created via the Azure Resource Manager only.", + "loc.input.label.MachineNames": "Filter Criteria", + "loc.input.help.MachineNames": "Provide a list of VMs host name like ffweb, ffdb, or tags like Role:DB, Web; OS:Win8.1. Note the delimiters used for tags are ,(comma), :(colon) and ;(semicolon). If multiple tags are provided, then the task will run in all the VMs with the specified tags. The default is to run the task in all the VMs.", + "loc.input.label.vmsAdminUserName": "Admin Login", + "loc.input.help.vmsAdminUserName": "Administrator Username of the VMs.", + "loc.input.label.vmsAdminPassword": "Password", + "loc.input.help.vmsAdminPassword": "The administrator password of the VMs.
It can accept variable defined in build or release pipelines as '$(passwordVariable)'.
You may mark variable as 'secret' to secure it.", + "loc.input.label.TargetPath": "Destination Folder", + "loc.input.help.TargetPath": "Local path on the target machines for copying the files from the source. Environment variable can be used like $env:windir\\BudgetIT\\Web.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "Optional Arguments (for uploading files to blob)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Optional AzCopy.exe arguments that will be applied when uploading to blob like, --check-length=true. If no optional arguments are specified here, the following optional arguments will be added by default.
--log-level=INFO (if the pipeline is running in debug mode set --log-level=DEBUG),
--recursive (only if container name is not $root),
--blob-type=PageBlob (only if specified storage account is a premium account).", + "loc.input.label.AdditionalArgumentsForVMCopy": "Optional Arguments (for downloading files to VM)", + "loc.input.help.AdditionalArgumentsForVMCopy": "Optional AzCopy.exe arguments that will be applied when downloading to VM like, --check-length=true. If no optional arguments are specified here, the following optional arguments will be added by default.
--log-level=INFO (if the pipeline is running in debug mode set --log-level=DEBUG),
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "SAS Token Expiration Period In Minutes", + "loc.input.help.sasTokenTimeOutInMinutes": "Provide the time in minutes after which SAS token for the container will expire. By default, this token expires after 4 hours.", + "loc.input.label.enableCopyPrerequisites": "Enable Copy Prerequisites", + "loc.input.help.enableCopyPrerequisites": "Enabling this option configures Windows Remote Management (WinRM) listener over HTTPS protocol on port 5986, using a self-signed certificate. This configuration is required for performing copy operation on Azure machines. If the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). Applicable only for ARM VMs.", + "loc.input.label.CopyFilesInParallel": "Copy in Parallel", + "loc.input.help.CopyFilesInParallel": "Setting it to true will copy files in parallel to the target machines.", + "loc.input.label.CleanTargetBeforeCopy": "Clean Target", + "loc.input.help.CleanTargetBeforeCopy": "Setting it to true will clean-up the destination folder before copying the files.", + "loc.input.label.skipCACheck": "Test Certificate", + "loc.input.help.skipCACheck": "If this option is selected, client skips the validation that the server certificate is signed by a trusted certificate authority (CA) when connecting over Hypertext Transfer Protocol over Secure Socket Layer (HTTPS).", + "loc.messages.AFC_StorageAccountNotFound": "Storage account: {0} not found. The selected service connection 'Service Principal' supports storage accounts of Azure Resource Manager type only.", + "loc.messages.AFC_ResourceGroupNotFound": "Provided resource group '{0}' does not exist.", + "loc.messages.AFC_GetVMStatus": "[Azure Call]Getting the status for vm '{0}'", + "loc.messages.AFC_GetVMStatusComplete": "[Azure Call]Got the status for vm '{0}'", + "loc.messages.AFC_GetCustomScriptExtension": "[Azure Call]Getting the custom script extension '{0}' for vm '{1}'", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Azure Call]Got the custom script extension '{0}' for vm '{1}'", + "loc.messages.AFC_SetCustomScriptExtension": "[Azure Call]Setting the custom script extension '{0}' for vm '{1}'", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Azure Call]Set the custom script extension '{0}' for vm '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Azure Call]Removing the custom script extension '{0}' for vm '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Azure Call]Removed the custom script extension '{0}' for vm '{1}'", + "loc.messages.AFC_NoNetworkInterface": "[Azure Call]No network interface found with virtual machine ID {0} under resource group {1}", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Azure Call]Resource group name and virtual machine ID should not be null or empty", + "loc.messages.AFC_AzurePSNotInstalled": "The required minimum version {0} of the Azure Powershell Cmdlets are not installed. You can follow the instructions at https://azure.microsoft.com/en-in/documentation/articles/powershell-install-configure/ to get the latest Azure powershell", + "loc.messages.AFC_ClassicStorageAccountNotFound": "Storage account: {0} not found. The selected service connection 'Certificate' supports storage accounts of Azure Classic type only.", + "loc.messages.AFC_GenericStorageAccountNotFound": "Storage account: {0} not found. Please specify existing storage account", + "loc.messages.AFC_AzureFileCopyMoreHelp": "For more info please refer to {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "Uploading files from source path: '{0}' to storage account: '{1}' in container: '{2}' with blob prefix: '{3}'", + "loc.messages.AFC_UploadContainerStorageAccount": "Upload to container: '{0}' in storage account: '{1}' with blob prefix: '{2}' failed with error: '{3}'", + "loc.messages.AFC_UploadFileSuccessful": "Uploaded files successfully from source path: '{0}' to storage account: '{1}' in container: '{2}' with blob prefix: '{3}'", + "loc.messages.AFC_IncorrectTags": "Tags have been incorrectly specified. They have to be in the format Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "The following machines either do not exist in the resource group or their names have not been specified correctly: {0}. Provide the exact same machine names present in the resource group. Use comma to separate multiple machine names.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "Unable to get {0} for all resources in ResourceGroup : '{1}'", + "loc.messages.AFC_MachineNameFromIdError": "Unable to get {0} for '{1}' resources in ResourceGroup : '{2}'", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "Unable to find the resource '{1}' using selected service connection '{0}'. Selected service connection '{0}' supports classic resources only (Service Management model).", + "loc.messages.AFC_NoClassicVMResources": "No machine exists under resource group: '{0}' for copy. Selected service connection '{1}' supports Virtual Machines of Azure Classic type only.", + "loc.messages.AFC_NoARMVMResources": "No machine exists under resource group: '{0}' for copy. Selected service connection '{1}' supports Virtual Machines of Azure Resource Manager type only.", + "loc.messages.AFC_NoGenericVMResources": "No machine exists under resource group: '{0}' for copy.", + "loc.messages.AFC_FilteringNoVMResources": "No machine exists under resource group: '{0}' with the following {1} '{2}'.", + "loc.messages.AFC_CopyStarted": "Copy started for machine: '{0}'", + "loc.messages.AFC_CopyCompleted": "Copy status for machine '{0}' : '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "To fix WinRM service connection related issues, select the 'Enable Copy Prerequisites' option in the task. If set already, and the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). Applicable only for ARM VMs.", + "loc.messages.AFC_CopyFailed": "Copy failed on machine '{0}'. Refer logs for more details.", + "loc.messages.AFC_ParallelCopyFailed": "Copy to one or more machines failed. Refer logs for more details.", + "loc.messages.AFC_CopySuccessful": "Copied files from source path: '{0}' to target azure VMs in resource group: '{1}' successfully", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "Setting the custom script extension '{0}' for virtual machine '{1}' failed with error : {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "Failed to add the network security rule: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "Unable to set the custom script extension '{0}' for virtual machine '{1}': {2}", + "loc.messages.AFC_CopyPrereqsFailed": "Failed to enable copy prerequisites. {0}", + "loc.messages.AFC_BlobStorageNotFound": "Storage account: {0} not found. Please specify existing storage account", + "loc.messages.AFC_RootContainerAndDirectory": "'/S' option is not valid for $root containers.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "The HTTP response code: '{0}' is not a valid redirect status code", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "Redirect response location header is null.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "AzCopy.exe exited with non-zero exit code while uploading files to blob storage.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "Unable to fetch storage account key. Error: '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "Uninstall WinRM custom script manually and retry deployment.", + "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "loc.messages.UnsupportedAuthScheme": "Unsupported authentication scheme '{0}' for endpoint.", + "loc.messages.ServicePrincipalError": "There was an error with the service principal used for the deployment." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzureFileCopyV4/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..d4913efa571a --- /dev/null +++ b/_generated/AzureFileCopyV4/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,93 @@ +{ + "loc.friendlyName": "Copia de archivos de Azure", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Copiar archivos en Azure Blob Storage o en máquinas virtuales", + "loc.instanceNameFormat": "$(Destination) File Copy", + "loc.releaseNotes": "Novedades de la versión 4.0:
   Compatibilidad con AzCopy.exe versión 10.8.0", + "loc.input.label.SourcePath": "Origen", + "loc.input.help.SourcePath": "Ruta de acceso absoluta de la carpeta de origen, archivo en la máquina local o recurso compartido UNC. La expresión debe devolver un único archivo o carpeta. El uso del símbolo de comodín (*) se admite en cualquier parte de la ruta de acceso del archivo o del nombre de este.", + "loc.input.label.ConnectedServiceNameARM": "Suscripción a Azure", + "loc.input.help.ConnectedServiceNameARM": "Suscripción de Azure Resource Manager de destino para la copia de los archivos.", + "loc.input.label.Destination": "Tipo de destino", + "loc.input.help.Destination": "Seleccione un destino, ya sea el blob de Azure o las VM de Azure.", + "loc.input.label.StorageAccountRM": "Cuenta de almacenamiento del Administrador de recursos", + "loc.input.help.StorageAccountRM": "Especifique una cuenta de almacenamiento del Administrador de recursos de Azure preexistente. Se utiliza también como agente intermedio para copiar archivos a máquinas virtuales de Azure", + "loc.input.label.ContainerName": "Nombre del contenedor", + "loc.input.help.ContainerName": "Nombre del contenedor para cargar los archivos. Si no existe un contenedor con el nombre especificado en la cuenta de almacenamiento especificada, se creará automáticamente.
Si necesita crear un directorio virtual dentro del contenedor, use la entrada de prefijo de blob siguiente.
Ejemplo: Si la ubicación de destino es https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/, especifique mycontainer como nombre de contenedor y vd1/vd2/ como prefijo de blob.", + "loc.input.label.BlobPrefix": "Prefijo de blob", + "loc.input.help.BlobPrefix": "Es útil para filtrar archivos, por ejemplo, anexar el número de compilación a todos los blobs para descargar solo los archivos de esa compilación. Ejemplo: Si especifica el prefijo de blob como myvd1/, se creará un directorio virtual con este nombre dentro del contenedor. El prefijo de blob con un \"/\" final se considerará un directorio virtual. De lo contrario, se tratará como un archivo, a menos que el elemento que se copia sea en sí una carpeta. Los archivos de origen se copiarán en https://myaccount.blob.core.windows.net/mycontainer/myvd1/.", + "loc.input.label.EnvironmentNameRM": "Grupo de recursos", + "loc.input.help.EnvironmentNameRM": "Nombre del Grupo de recursos de destino en el que copiar los archivos.", + "loc.input.label.ResourceFilteringMethod": "Seleccionar máquinas por", + "loc.input.help.ResourceFilteringMethod": "También puede seleccionar un subconjunto de máquinas virtuales del grupo de recursos si proporciona las etiquetas o el nombre de host de las máquinas virtuales. Las [etiquetas](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) solo son compatibles con los recursos creados mediante Azure Resource Manager.", + "loc.input.label.MachineNames": "Criterios de filtro", + "loc.input.help.MachineNames": "Proporcione una lista de nombres de host de las máquinas virtuales, como ffweb o ffdb, o etiquetas, como Role:DB, Web; OS:Win8.1. Tenga en cuenta que los delimitadores usados para las etiquetas son ,(coma), :(dos puntos) y ;(punto y coma). Si se proporcionan varias etiquetas, la tarea se ejecutará en todas las máquinas virtuales que tengan las etiquetas especificadas. La opción predeterminada es ejecutar la tarea en todas las máquinas virtuales.", + "loc.input.label.vmsAdminUserName": "Inicio de sesión del administrador", + "loc.input.help.vmsAdminUserName": "Nombre de usuario del administrador de las máquinas virtuales.", + "loc.input.label.vmsAdminPassword": "Contraseña", + "loc.input.help.vmsAdminPassword": "La contraseña del administrador de las máquinas virtuales.
Puede aceptar una variable definida en las canalizaciones de compilación o versión como \"$(passwordVariable)\".
Marque el tipo de variable como \"secret\" para protegerlo.", + "loc.input.label.TargetPath": "Carpeta de destino", + "loc.input.help.TargetPath": "La ruta de acceso local de las máquinas de destino para copiar los archivos del origen. Puede usarse una variable de entorno, por ejemplo, $env:windir\\BudgetIT\\Web.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "Argumentos opcionales (para cargar archivos en el blob)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Argumentos opcionales de AzCopy.exe que se aplicarán al cargar en blob, como --check-length=true. Si no se especifican argumentos opcionales aquí, se agregarán los siguientes de forma predeterminada.
--log-level=INFO (si la canalización se ejecuta en modo de depuración, establezca --log-level=DEBUG);
--recursive (solo si el nombre del contenedor no es $root);
--blob-type=PageBlob (solo si la cuenta de almacenamiento especificada es una cuenta Premium)", + "loc.input.label.AdditionalArgumentsForVMCopy": "Argumentos opcionales (para descargar archivos en la máquina virtual)", + "loc.input.help.AdditionalArgumentsForVMCopy": "Argumentos opcionales de AzCopy.exe que se aplicarán al descargar en una instancia de VM, como --check-length=true. Si no se especifican argumentos opcionales aquí, se agregarán los siguientes de forma predeterminada.
--log-level=INFO (si la canalización se ejecuta en modo de depuración, establezca --log-level=DEBUG);
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "Período de expiración del token de SAS en minutos", + "loc.input.help.sasTokenTimeOutInMinutes": "Especifique el tiempo, en minutos, transcurrido el cual expirará el token de SAS del contenedor. De forma predeterminada, este token expira después de cuatro horas.", + "loc.input.label.enableCopyPrerequisites": "Habilitar los requisitos previos de copia", + "loc.input.help.enableCopyPrerequisites": "Al habilitar esta opción, se configura el agente de escucha de Administración remota de Windows (WinRM) a través del protocolo HTTPS en el puerto 5986, mediante un certificado autofirmado. Esta configuración es necesaria para realizar operaciones de copia en máquinas de Azure. Si las máquinas virtuales de destino están respaldadas por un equilibrador de carga, asegúrese de que haya reglas NAT de entrada configuradas para el puerto de destino (5986). Si las máquinas virtuales de destino están asociadas a un grupo de seguridad de red (NSG), configure reglas de seguridad de entrada para el puerto de destino (5986). Solo se aplica a máquinas virtuales de ARM.", + "loc.input.label.CopyFilesInParallel": "Copiar en paralelo", + "loc.input.help.CopyFilesInParallel": "Si se establece en true, copiará los archivos en paralelo en las máquinas de destino.", + "loc.input.label.CleanTargetBeforeCopy": "Limpiar destino", + "loc.input.help.CleanTargetBeforeCopy": "Si se establece en true, limpiará la carpeta de destino antes de copiar los archivos.", + "loc.input.label.skipCACheck": "Certificado de prueba", + "loc.input.help.skipCACheck": "Si esta opción está seleccionada, el cliente omite la validación relativa a si el certificado del servidor está firmado por una entidad de certificación de confianza al conectar a través del Protocolo de transferencia de hipertexto con cifrado de Capa de sockets seguros (HTTPS).", + "loc.messages.AFC_StorageAccountNotFound": "No se encontró la cuenta de almacenamiento {0}. La conexión de servicio seleccionada \"Entidad de servicio\" admite solo cuentas de almacenamiento del tipo Azure Resource Manager.", + "loc.messages.AFC_ResourceGroupNotFound": "El grupo de recursos proporcionado '{0}' no existe.", + "loc.messages.AFC_GetVMStatus": "[Llamada de Azure]Obteniendo el estado de la máquina virtual '{0}'\t", + "loc.messages.AFC_GetVMStatusComplete": "[Llamada de Azure]Se ha obtenido el estado de la máquina virtual '{0}'", + "loc.messages.AFC_GetCustomScriptExtension": "[Llamada de Azure]Obteniendo la extensión de script personalizada '{0}' para la máquina virtual '{1}'", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Llamada de Azure]Se ha obtenido la extensión de script personalizada '{0}' para la máquina virtual '{1}'", + "loc.messages.AFC_SetCustomScriptExtension": "[Llamada de Azure]Estableciendo la extensión de script personalizada '{0}' para la máquina virtual '{1}'", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Llamada de Azure]Establecer la extensión de script personalizada '{0}' para la máquina virtual '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Llamada de Azure]Quitando la extensión de script personalizada '{0}' para la máquina virtual '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Llamada de Azure]Se ha quitado la extensión de script personalizada '{0}' para la máquina virtual '{1}'", + "loc.messages.AFC_NoNetworkInterface": "[Llamada de Azure]No se encontró ninguna interfaz de red con el id. de máquina virtual {0} en el grupo de recursos {1}", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Llamada de Azure]El nombre del grupo de recursos y el id. de máquina virtual no debe ser un valor nulo ni quedarse vacío", + "loc.messages.AFC_AzurePSNotInstalled": "No está instalada la versión mínima requerida {0} de los cmdlets de Azure PowerShell. Puede seguir las instrucciones de https://azure.microsoft.com/en-in/documentation/articles/powershell-install-configure/ para obtener la versión más reciente de Azure PowerShell", + "loc.messages.AFC_ClassicStorageAccountNotFound": "No se encontró la cuenta de almacenamiento {0}. La conexión de servicio seleccionada \"Certificate\" admite solo cuentas de almacenamiento del tipo Azure clásico.", + "loc.messages.AFC_GenericStorageAccountNotFound": "No se encontró la cuenta de almacenamiento: {0}. Especifique una cuenta de almacenamiento existente", + "loc.messages.AFC_AzureFileCopyMoreHelp": "Para obtener más información, consulte {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "Cargando archivos de la ruta de acceso de origen \"{0}\" en el contenedor \"{2}\" de la cuenta de almacenamiento \"{1}\" con el prefijo de blob \"{3}\"", + "loc.messages.AFC_UploadContainerStorageAccount": "No se pudo realizar la carga en el contenedor \"{0}\" de la cuenta de almacenamiento \"{1}\" con el prefijo de blob \"{2}\" debido al siguiente error: \"{3}\"", + "loc.messages.AFC_UploadFileSuccessful": "Se han cargado correctamente los archivos de la ruta de acceso de origen \"{0}\" en el contenedor \"{2}\" de la cuenta de almacenamiento \"{1}\" con el prefijo de blob \"{3}\"", + "loc.messages.AFC_IncorrectTags": "Las etiquetas se han especificado incorrectamente. Tienen que estar en el formato Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "Las siguientes máquinas no existen en el grupo de recursos o sus nombres no se han especificado correctamente: {0}. Especifique los nombres exactos de las máquinas tal como están en el grupo de recursos, separados por comas.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "No se puede obtener {0} para todos los recursos en el grupo ResourceGroup: '{1}'", + "loc.messages.AFC_MachineNameFromIdError": "No se puede obtener {0} para '{1}' recursos del ResourceGroup: '{2}'", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "No se puede encontrar el recurso \"{1}\" con la conexión de servicio seleccionada \"{0}\". La conexión de servicio seleccionada \"{0}\" admite solo recursos clásicos (modelo de Service Management).", + "loc.messages.AFC_NoClassicVMResources": "No hay ninguna máquina en el grupo de recursos \"{0}\" para copiar. La conexión de servicio \"{1}\" seleccionada admite solo máquinas virtuales de tipo Azure clásico.", + "loc.messages.AFC_NoARMVMResources": "No hay ninguna máquina en el grupo de recursos \"{0}\" para copiar. La conexión de servicio \"{1}\" seleccionada admite solo máquinas virtuales de tipo Azure Resource Manager.", + "loc.messages.AFC_NoGenericVMResources": "No existe ninguna máquina en el grupo de recursos '{0}' para copiar.", + "loc.messages.AFC_FilteringNoVMResources": "No existe ninguna máquina en el grupo de recursos: '{0}' con el siguiente {1} '{2}'.", + "loc.messages.AFC_CopyStarted": "Se inició la copia para el equipo: '{0}'", + "loc.messages.AFC_CopyCompleted": "Estado de copia de la máquina '{0}': '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "Para solucionar problemas relacionados con la conexión de servicio de WinRM, seleccione la opción \"Habilitar los requisitos previos de copia\" en la tarea. Si ya están establecidos, y las máquinas virtuales de destino están respaldadas por un equilibrador de carga, asegúrese de que las reglas NAT de entrada están configuradas para el puerto de destino (5986). Solo es aplicable a las máquinas virtuales de ARM.", + "loc.messages.AFC_CopyFailed": "No se pudo copiar en la máquina \"{0}\". Consulte los registros para obtener más detalles.", + "loc.messages.AFC_ParallelCopyFailed": "No se pudo copiar en una o varias máquinas. Consulte los registros para obtener más detalles.", + "loc.messages.AFC_CopySuccessful": "Archivos copiados correctamente desde la ruta de origen: '{0}' a las máquinas virtuales de Azure de destino en el grupo de recursos: '{1}'", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "Error al establecer la extensión de script personalizada '{0}' para la máquina virtual '{1}' de tipo: {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "Error al agregar la red de seguridad de red: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "No se puede establecer el script personalizado '{0}' para la máquina virtual '{1}': {2}", + "loc.messages.AFC_CopyPrereqsFailed": "Error al habilitar los requisitos previos de copia. {0}", + "loc.messages.AFC_BlobStorageNotFound": "No se encontró la cuenta de almacenamiento: {0}. Especifique una cuenta de almacenamiento existente", + "loc.messages.AFC_RootContainerAndDirectory": "La opción \"/S\" no es válida para contenedores $root.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "El código de respuesta HTTP \"{0}\" no es un código de estado de redireccionamiento válido.", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "El encabezado de ubicación de la respuesta de redireccionamiento es NULL.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "AzCopy.exe terminó con el código de salida distinto de cero al cargar archivos en el almacenamiento de blobs.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "No se puede recuperar la clave de la cuenta de almacenamiento. Error: \"{0}\"", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "Desinstale el script personalizado de WinRM de forma manual y reintente la implementación.", + "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", + "loc.messages.UnsupportedAuthScheme": "Esquema de autenticación \"{0}\" no admitido para el punto de conexión.", + "loc.messages.ServicePrincipalError": "Error con la entidad de servicio que se usó para la implementación." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzureFileCopyV4/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..8d88025a239d --- /dev/null +++ b/_generated/AzureFileCopyV4/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,93 @@ +{ + "loc.friendlyName": "Copie de fichiers Azure", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Copier des fichiers sur le Stockage Blob Azure ou des machines virtuelles", + "loc.instanceNameFormat": "$(Destination) Copie de fichiers", + "loc.releaseNotes": "Nouveautés de la version 4.0 :
   Prise en charge d'AzCopy.exe version 10.8.0", + "loc.input.label.SourcePath": "Source", + "loc.input.help.SourcePath": "Chemin absolu du dossier ou fichier source sur la machine locale, ou partage UNC. L'expression doit retourner un seul dossier ou fichier. Le symbole de caractère générique (*) est pris en charge n'importe où dans le chemin ou le nom de fichier.", + "loc.input.label.ConnectedServiceNameARM": "Abonnement Azure", + "loc.input.help.ConnectedServiceNameARM": "Abonnement Azure Resource Manager à cibler pour la copie des fichiers.", + "loc.input.label.Destination": "Type de destination", + "loc.input.help.Destination": "Sélectionnez la destination, objet blob ou machines virtuelles Azure.", + "loc.input.label.StorageAccountRM": "Compte de stockage RM", + "loc.input.help.StorageAccountRM": "Spécifiez un compte de stockage ARM préexistant. Il sert également d'intermédiaire pour la copie de fichiers vers des machines virtuelles Azure", + "loc.input.label.ContainerName": "Nom du conteneur", + "loc.input.help.ContainerName": "Nom du conteneur pour le chargement des fichiers. Si un conteneur portant le nom indiqué n'existe pas dans le compte de stockage spécifié, il est automatiquement créé.
Si vous devez créer un répertoire virtuel dans le conteneur, utilisez l'entrée de préfixe d'objet blob ci-dessous.
Exemple : Si votre emplacement cible est https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/, spécifiez mycontainer comme nom de conteneur et vd1/vd2 comme préfixe d’objet blob.", + "loc.input.label.BlobPrefix": "Préfixe Blob", + "loc.input.help.BlobPrefix": "Utile pour filtrer les fichiers, par exemple, ajouter le numéro de build à tous les objets blob pour télécharger les fichiers à partir de cette build uniquement. Exemple : si vous spécifiez le préfixe d’objet blob myvd1/, un répertoire virtuel portant ce nom est créé dans le conteneur. Le préfixe d’objet blob avec un '/' de fin sera considéré comme un répertoire virtuel. Sinon, il sera traité comme un fichier, sauf si l’élément en cours de copie est lui-même un dossier. Les fichiers sources seront copiés dans https://myaccount.blob.core.windows.net/mycontainer/myvd1/.", + "loc.input.label.EnvironmentNameRM": "Groupe de ressources", + "loc.input.help.EnvironmentNameRM": "Nom du groupe de ressources cible où copier les fichiers.", + "loc.input.label.ResourceFilteringMethod": "Sélectionner les machines par", + "loc.input.help.ResourceFilteringMethod": "Vous pouvez également sélectionner un sous-ensemble de machines virtuelles dans le groupe de ressources, en indiquant les noms d’hôtes ou les balises des machines virtuelles. Les [balises](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) sont prises en charge pour les ressources créées via Azure Resource Manager uniquement.", + "loc.input.label.MachineNames": "Critères de filtre", + "loc.input.help.MachineNames": "Indiquez une liste de noms d'hôtes de machines virtuelles, par exemple ffweb, ffdb, ou utilisez des balises telles que Role:DB, Web; OS:Win8.1. Notez que les délimiteurs employés pour les balises sont ,(virgule), :(deux-points) et ;(point-virgule). Si plusieurs balises sont indiquées, la tâche s'exécute sur toutes les machines virtuelles correspondant aux balises spécifiées. Par défaut, la tâche s'exécute sur toutes les machines virtuelles.", + "loc.input.label.vmsAdminUserName": "Informations de connexion d'administrateur", + "loc.input.help.vmsAdminUserName": "Nom d'utilisateur d'administrateur des machines virtuelles.", + "loc.input.label.vmsAdminPassword": "Mot de passe", + "loc.input.help.vmsAdminPassword": "Mot de passe d'administrateur des machines virtuelles.
Il peut accepter une variable définie dans les pipelines de build ou de mise en production sous la forme '$(passwordVariable)'.
Vous pouvez marquer la variable comme étant de type 'secret' pour la sécuriser.", + "loc.input.label.TargetPath": "Dossier de destination", + "loc.input.help.TargetPath": "Chemin d'accès local sur les machines cibles pour la copie des fichiers à partir de la source. Une variable d'environnement peut être utilisée, par ex., $env:windir\\BudgetIT\\Web.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "Arguments facultatifs (pour le chargement des fichiers vers un objet blob)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Arguments AzCopy.exe facultatifs copiés durant le chargement dans l'objet blob, par exemple --check-length=true. Si aucun argument facultatif n'est spécifié ici, les arguments facultatifs suivants sont ajoutés par défaut.
--log-level=INFO (si le pipeline s'exécute en mode de débogage défini --log-level=DEBUG),
--recursive (uniquement si le nom du conteneur n'est pas $root),
--blob-type=PageBlob (uniquement si le compte de stockage spécifié est un compte premium).", + "loc.input.label.AdditionalArgumentsForVMCopy": "Arguments facultatifs (pour le téléchargement des fichiers sur une machine virtuelle)", + "loc.input.help.AdditionalArgumentsForVMCopy": "Arguments AzCopy.exe facultatifs appliqués durant le téléchargement sur une machine virtuelle, par exemple --check-length=true. Si aucun argument facultatif n'est spécifié ici, les arguments facultatifs suivants sont ajoutés par défaut.
--log-level=INFO (si le pipeline s'exécute en mode de débogage défini --log-level=DEBUG),
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "Délai d'expiration du jeton SAP en minutes", + "loc.input.help.sasTokenTimeOutInMinutes": "Indiquez la durée en minutes à partir de laquelle le jeton SAS du conteneur doit expirer. Par défaut, ce jeton expire au bout de 4 heures.", + "loc.input.label.enableCopyPrerequisites": "Activer les conditions préalables à la copie", + "loc.input.help.enableCopyPrerequisites": "L'activation de cette option configure l'écouteur Windows Remote Management (WinRM) via le protocole HTTPS sur le port 5986, à l'aide d'un certificat auto-signé. Cette configuration est obligatoire pour effectuer une opération de copie sur des machines Azure. Si les machines virtuelles cibles sont associées à un équilibreur de charge, vérifiez que des règles NAT entrantes sont configurées pour le port cible (5986). S'applique uniquement aux machines virtuelles ARM.", + "loc.input.label.CopyFilesInParallel": "Copier en parallèle", + "loc.input.help.CopyFilesInParallel": "Si la valeur est true, les fichiers sont copiés en parallèle sur les machines cibles.", + "loc.input.label.CleanTargetBeforeCopy": "Nettoyer la cible", + "loc.input.help.CleanTargetBeforeCopy": "Si la valeur est true, le dossier de destination est nettoyé avant la copie des fichiers.", + "loc.input.label.skipCACheck": "Certificat de test", + "loc.input.help.skipCACheck": "Si cette option est sélectionnée, le client ignore la validation permettant de vérifier que le certificat du serveur est signé par une autorité de certification approuvée lors de la connexion via HTTP ou Secure Socket Layer (HTTPS).", + "loc.messages.AFC_StorageAccountNotFound": "Le compte de stockage {0} est introuvable. La connexion de service sélectionnée, 'Principal du service', prend uniquement en charge les comptes de stockage de type Azure Resource Manager.", + "loc.messages.AFC_ResourceGroupNotFound": "Le groupe de ressources indiqué '{0}' n'existe pas.", + "loc.messages.AFC_GetVMStatus": "[Appel Azure]Obtention de l'état de la machine virtuelle '{0}'", + "loc.messages.AFC_GetVMStatusComplete": "[Appel Azure]Obtention réussie de l'état de la machine virtuelle '{0}'", + "loc.messages.AFC_GetCustomScriptExtension": "[Appel Azure]Obtention de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Appel Azure]Obtention réussie de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'", + "loc.messages.AFC_SetCustomScriptExtension": "[Appel Azure]Définition de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Appel Azure]Définition réussie de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Appel Azure]Suppression de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Appel Azure]Suppression réussie de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'", + "loc.messages.AFC_NoNetworkInterface": "[Appel Azure]Interface réseau introuvable pour l'ID de machine virtuelle {0} dans le groupe de ressources {1}", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Appel Azure]Le nom du groupe de ressources et l'ID de machine virtuelle ne doivent pas avoir la valeur Null ou être vides", + "loc.messages.AFC_AzurePSNotInstalled": "La version minimale nécessaire {0} pour les applets de commande Azure PowerShell n'est pas installée. Vous pouvez suivre les instructions fournies sur https://azure.microsoft.com/fr-fr/documentation/articles/powershell-install-configure/ pour obtenir la dernière version d'Azure PowerShell", + "loc.messages.AFC_ClassicStorageAccountNotFound": "Le compte de stockage {0} est introuvable. La connexion de service sélectionnée, 'Certificat', prend uniquement en charge les comptes de stockage de type Azure Classic.", + "loc.messages.AFC_GenericStorageAccountNotFound": "Le compte de stockage {0} est introuvable. Spécifiez un compte de stockage existant", + "loc.messages.AFC_AzureFileCopyMoreHelp": "Pour plus d'informations, consultez {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "Chargement des fichiers à partir du chemin source '{0}' vers le compte de stockage '{1}' dans le conteneur '{2}' ayant pour préfixe blob '{3}'", + "loc.messages.AFC_UploadContainerStorageAccount": "Échec du chargement vers le conteneur '{0}' dans le compte de stockage '{1}' ayant pour préfixe blob '{2}'. Erreur : '{3}'", + "loc.messages.AFC_UploadFileSuccessful": "Les fichiers ont été chargés correctement du chemin source '{0}' vers le compte de stockage '{1}' dans le conteneur '{2}' ayant pour préfixe blob '{3}'", + "loc.messages.AFC_IncorrectTags": "Les étiquettes ont été spécifiées de manière incorrecte. Elles doivent être au format Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "Les machines suivantes n'existent pas dans le groupe de ressources, ou leurs noms n'ont pas été spécifiés correctement : {0}. Indiquez les noms exacts des machines présentes dans le groupe de ressources. Utilisez une virgule pour séparer plusieurs noms de machines.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "Impossible d'obtenir {0} pour l'ensemble des ressources dans le ResourceGroup '{1}'", + "loc.messages.AFC_MachineNameFromIdError": "Impossible d'obtenir {0} pour les ressources '{1}' dans le ResourceGroup '{2}'", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "La ressource '{1}' est introuvable à l'aide de la connexion de service sélectionnée '{0}'. La connexion de service sélectionnée '{0}' prend en charge uniquement les ressources classiques (modèle de gestion des services).", + "loc.messages.AFC_NoClassicVMResources": "Il n'existe aucune machine à copier dans le groupe de ressources '{0}'. La connexion de service sélectionnée '{1}' prend uniquement en charge les machines virtuelles de type Azure Classic.", + "loc.messages.AFC_NoARMVMResources": "Il n'existe aucune machine à copier dans le groupe de ressources '{0}'. La connexion de service sélectionnée '{1}' prend uniquement en charge les machines virtuelles de type Azure Resource Manager.", + "loc.messages.AFC_NoGenericVMResources": "Il n'existe aucune machine à copier dans le groupe de ressources '{0}'.", + "loc.messages.AFC_FilteringNoVMResources": "Il n'existe aucune machine dans le groupe de ressources '{0}' avec pour {1} '{2}'.", + "loc.messages.AFC_CopyStarted": "Copie démarrée pour la machine '{0}'", + "loc.messages.AFC_CopyCompleted": "État de la copie pour la machine '{0}' : '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "Pour corriger les problèmes de connexion de service de WinRM, sélectionnez la tâche 'Activer les conditions préalables à la copie' dans la tâche. Si cela est déjà fait, et si les machines virtuelles cibles sont associées à un équilibreur de charge, vérifiez que des règles NAT entrantes sont configurées pour le port cible (5986). Ceci est applicable uniquement aux machines virtuelles ARM.", + "loc.messages.AFC_CopyFailed": "Échec de la copie sur la machine '{0}'. Pour plus d'informations, consultez les journaux.", + "loc.messages.AFC_ParallelCopyFailed": "Échec de la copie vers une ou plusieurs machines. Pour plus d'informations, consultez les journaux.", + "loc.messages.AFC_CopySuccessful": "Fichiers correctement copiés du chemin source '{0}' vers les machines virtuelles Azure cibles du groupe de ressources '{1}'", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "Échec de la définition de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'. Erreur : {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "Échec de l'ajout de la règle de sécurité réseau : {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "Impossible de définir l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}' : {2}", + "loc.messages.AFC_CopyPrereqsFailed": "Échec de l'activation des conditions préalables de copie. {0}", + "loc.messages.AFC_BlobStorageNotFound": "Le compte de stockage {0} est introuvable. Spécifiez un compte de stockage existant", + "loc.messages.AFC_RootContainerAndDirectory": "L'option '/S' est non valide pour les conteneurs $root.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "Le code de réponse HTTP '{0}' n'est pas un code d'état de redirection valide", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "L'en-tête d'emplacement pour la réponse de redirection a une valeur null.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "AzCopy.exe s'est arrêté avec un code de sortie différent de zéro durant le chargement des fichiers vers le Stockage Blob.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "Impossible de récupérer (fetch) la clé du compte de stockage. Erreur : '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "Désinstallez manuellement le script personnalisé WinRM, puis réessayez d'effectuer le déploiement.", + "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", + "loc.messages.UnsupportedAuthScheme": "Schéma d'authentification '{0}' non pris en charge pour le point de terminaison.", + "loc.messages.ServicePrincipalError": "Erreur liée au principal du service utilisé pour le déploiement." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzureFileCopyV4/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..c38d89f3e23c --- /dev/null +++ b/_generated/AzureFileCopyV4/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,93 @@ +{ + "loc.friendlyName": "Copia dei file di Azure", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Copia i file in Archiviazione BLOB di Azure nelle macchine virtuali", + "loc.instanceNameFormat": "Copia dei file $(Destination)", + "loc.releaseNotes": "Novità della versione 4.0:
   Supporto di AzCopy.exe versione 10.8.0", + "loc.input.label.SourcePath": "Origine", + "loc.input.help.SourcePath": "Percorso assoluto della cartella o del file di origine nel computer locale oppure condivisione UNC. L'espressione deve restituire una sola cartella o file. Il simbolo del carattere jolly (*) è supportato in qualsiasi punto del percorso o del nome file.", + "loc.input.label.ConnectedServiceNameARM": "Sottoscrizione di Azure", + "loc.input.help.ConnectedServiceNameARM": "Sottoscrizione di Azure Resource Manager usata come destinazione per la copia dei file.", + "loc.input.label.Destination": "Tipo di destinazione", + "loc.input.help.Destination": "Consente di selezionare la destinazione, nel BLOB o nelle macchine virtuali di Azure.", + "loc.input.label.StorageAccountRM": "Account di archiviazione di Gestione risorse", + "loc.input.help.StorageAccountRM": "Consente di specificare un account di archiviazione di Gestione risorse di Azure preesistente. Viene usato anche come intermediario per la copia dei file nelle macchine virtuali di Azure", + "loc.input.label.ContainerName": "Nome contenitore", + "loc.input.help.ContainerName": "Nome del contenitore per il caricamento dei file. Se nell'account di archiviazione non esiste un contenitore con il nome specificato, verrà creato automaticamente.
Se è necessario creare una directory virtuale all'interno del contenitore, usare il valore di input seguente come prefisso BLOB.
Esempio: se il percorso di destinazione è https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/, specificare contenitore come nome del contenitore e vd1/vd2/ come prefisso BLOB.", + "loc.input.label.BlobPrefix": "Prefisso BLOB", + "loc.input.help.BlobPrefix": "Utile per filtrare i file, ad esempio aggiungere il numero di build a tutti i BLOB per scaricare i file solo da quella build. Esempio: se si specifica il prefisso BLOB come myvd1/, all'interno del contenitore verrà creata una directory virtuale con questo nome. Il prefisso BLOB con '/' finale verrà considerato una directory virtuale. In caso contrario, verrà considerato come file, a meno che l'elemento da copiare non sia di per sé una cartella. I file di origine verranno copiati in https://myaccount.blob.core.windows.net/mycontainer/myvd1/.", + "loc.input.label.EnvironmentNameRM": "Gruppo di risorse", + "loc.input.help.EnvironmentNameRM": "Nome del gruppo di risorse di destinazione in cui copiare i file.", + "loc.input.label.ResourceFilteringMethod": "Seleziona computer per", + "loc.input.help.ResourceFilteringMethod": "Facoltativamente, selezionare un sottoinsieme di macchine virtuali nel gruppo di risorse specificando il nome host o i tag delle macchine virtuali. I [tag](https://learn.microsoft.com/it-it/azure/virtual-machines/tag-template/) sono supportati solo per le risorse create tramite Azure Resource Manager.", + "loc.input.label.MachineNames": "Criteri di filtro", + "loc.input.help.MachineNames": "Consente di specificare un elenco di nomi host di macchine virtuali, come ffweb, ffdb o tag come Role:DB, Web; OS:Win8.1. Nota: i delimitatori usati per i tag sono ,(virgola), :(due punti) e ;(punto e virgola). Se si specificano più tag, l'attività verrà eseguita in tutte le macchine virtuali con i tag specificati. Per impostazione predefinita, l'attività viene eseguita in tutte le macchine virtuali.", + "loc.input.label.vmsAdminUserName": "Account di accesso amministratore", + "loc.input.help.vmsAdminUserName": "Nome utente dell'amministratore delle macchine virtuali.", + "loc.input.label.vmsAdminPassword": "Password", + "loc.input.help.vmsAdminPassword": "Password dell'amministratore per le macchine virtuali.
Può accettare la variabile definita nelle pipeline di compilazione o versione come '$(passwordVariable)'.
Per proteggere la variabile, è possibile contrassegnarla come 'secret'.", + "loc.input.label.TargetPath": "Cartella di destinazione", + "loc.input.help.TargetPath": "Percorso locale nei computer di destinazione per la copia dei file dall'origine. È possibile usare una variabile di ambiente come $env:windir\\BudgetIT\\Web.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "Argomenti facoltativi (per il caricamento dei file nel BLOB)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Argomenti facoltativi di AzCopy.exe, come --check-length=true, che verranno applicati durante il caricamento nel BLOB. Se non si specifica alcun argomento facoltativo, gli argomenti facoltativi seguenti verranno aggiunti per impostazione predefinita.
--log-level=INFO (se la pipeline è in esecuzione nella modalità di debug impostata --log-level=DEBUG)
--recursive (solo se il nome del contenitore non è $root)
--blob-type=PageBlob (solo se l'account di archiviazione specificato è un account Premium).", + "loc.input.label.AdditionalArgumentsForVMCopy": "Argomenti facoltativi (per il download dei file nella macchina virtuale)", + "loc.input.help.AdditionalArgumentsForVMCopy": "Argomenti facoltativi di AzCopy.exe, come --check-length=true, che verranno applicati durante il download nella macchina virtuale. Se non si specifica alcun argomento facoltativo, gli argomenti facoltativi seguenti verranno aggiunti per impostazione predefinita.
--log-level=INFO (se la pipeline è in esecuzione nella modalità di debug impostata --log-level=DEBUG)
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "Periodo di scadenza del token di firma di accesso condiviso in minuti", + "loc.input.help.sasTokenTimeOutInMinutes": "Specificare il tempo in minuti dopo il quale il token di firma di accesso condiviso per il contenitore scadrà. Per impostazione predefinita, questo token scade dopo quattro ore.", + "loc.input.label.enableCopyPrerequisites": "Abilita prerequisiti di copia", + "loc.input.help.enableCopyPrerequisites": "Se si abilita questa opzione, il listener di Gestione remota Windows (WinRM) verrà configurato con il protocollo HTTPS sulla porta 5986 usando un certificato autofirmato. Questa configurazione è necessaria per eseguire l'operazione di copia su computer Azure. Se le macchine virtuali di destinazione sono supportate da un servizio Load Balancer, assicurarsi che le regole NAT in ingresso siano configurate per la porta di destinazione (5986). Applicabile solo per le macchine virtuali ARM.", + "loc.input.label.CopyFilesInParallel": "Copia in parallelo", + "loc.input.help.CopyFilesInParallel": "Se è impostato su true, i file verranno copiati in parallelo nei computer di destinazione.", + "loc.input.label.CleanTargetBeforeCopy": "Pulisci destinazione", + "loc.input.help.CleanTargetBeforeCopy": "Se è impostato su true, la cartella di destinazione verrà pulita prima della copia dei file.", + "loc.input.label.skipCACheck": "Certificato di test", + "loc.input.help.skipCACheck": "Se questa opzione è selezionata, il client non esegue la convalida per verificare che il certificato server sia firmato da un'Autorità di certificazione (CA) attendibile quando si connette tramite il protocollo HTTPS (Hypertext Transfer Protocol over Secure Socket Layer).", + "loc.messages.AFC_StorageAccountNotFound": "L'account di archiviazione {0} non è stato trovato. La connessione al servizio selezionata 'Entità servizio' supporta solo account di archiviazione di tipo Azure Resource Manager.", + "loc.messages.AFC_ResourceGroupNotFound": "Il gruppo di risorse specificato '{0}' non esiste.", + "loc.messages.AFC_GetVMStatus": "[Chiamata di Azure]Recupero dello stato per la macchina virtuale '{0}'", + "loc.messages.AFC_GetVMStatusComplete": "[Chiamata di Azure]Lo stato della macchina virtuale '{0}' è stato recuperato", + "loc.messages.AFC_GetCustomScriptExtension": "[Chiamata di Azure]Recupero dell'estensione script personalizzata '{0}' per la macchina virtuale '{1}'", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Chiamata di Azure]L'estensione script personalizzata '{0}' per la macchina virtuale '{1}' è stata recuperata", + "loc.messages.AFC_SetCustomScriptExtension": "[Chiamata di Azure]Impostazione dell'estensione script personalizzata '{0}' per la macchina virtuale '{1}'", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Chiamata di Azure]L'estensione script personalizzata '{0}' per la macchina virtuale '{1}' è stata impostata", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Chiamata di Azure]Rimozione dell'estensione script personalizzata '{0}' per la macchina virtuale '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Chiamata di Azure]L'estensione script personalizzata '{0}' per la macchina virtuale '{1}' è stata rimossa", + "loc.messages.AFC_NoNetworkInterface": "[Chiamata di Azure]Nel gruppo di risorse {1} non è stata trovata alcuna interfaccia di rete con l'ID macchina virtuale {0}", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Chiamata di Azure]Il nome del gruppo di risorse e l'ID macchina virtuale non devono essere Null o vuoti", + "loc.messages.AFC_AzurePSNotInstalled": "La versione minima richiesta {0} dei cmdlet di Azure Powershell non è installata. Per scaricare la versione più recente di Azure Powershell, seguire le istruzioni disponibili all'indirizzo https://azure.microsoft.com/it-it/documentation/articles/powershell-install-configure/", + "loc.messages.AFC_ClassicStorageAccountNotFound": "L'account di archiviazione {0} non è stato trovato. La connessione al servizio selezionata 'Certificato' supporta solo account di archiviazione di tipo Azure classico.", + "loc.messages.AFC_GenericStorageAccountNotFound": "L'account di archiviazione {0} non è stato trovato. Specificarne uno esistente", + "loc.messages.AFC_AzureFileCopyMoreHelp": "Per altre informazioni, vedere {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "Il caricamento dei file dal percorso di origine '{0}' nell'account di archiviazione '{1}' nel contenitore '{2}' con prefisso BLOB '{3}' è in corso", + "loc.messages.AFC_UploadContainerStorageAccount": "Il caricamento nel contenitore '{0}' nell'account di archiviazione '{1}' con prefisso BLOB '{2}' non è riuscito. Errore: '{3}'", + "loc.messages.AFC_UploadFileSuccessful": "Il caricamento dei file dal percorso di origine '{0}' nell'account di archiviazione '{1}' nel contenitore '{2}' con prefisso BLOB '{3}' è riuscito", + "loc.messages.AFC_IncorrectTags": "I tag specificati non sono corretti. Specificarli nel formato Ruolo:Web,DB;Località:Stati Uniti orientali;Reparto:Finanza,HR", + "loc.messages.AFC_MachineDoesNotExist": "I computer seguenti non esistono nel gruppo di risorse oppure i relativi nomi non sono stati specificati correttamente: {0}. Specificare gli stessi nomi di computer presenti nel gruppo di risorse e usare la virgola come delimitatore tra più nomi di computer.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "Non è possibile ottenere {0} per tutte le risorse nel gruppo di risorse '{1}'", + "loc.messages.AFC_MachineNameFromIdError": "Non è possibile ottenere {0} per le risorse '{1}' nel gruppo di risorse '{2}'", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "La risorsa '{1}' non è stata trovata usando la connessione al servizio selezionata '{0}'. La connessione al servizio selezionata '{0}' supporta solo risorse classiche (modello di gestione servizi).", + "loc.messages.AFC_NoClassicVMResources": "Nel gruppo di risorse '{0}' non esistono computer per la copia. La connessione al servizio selezionata '{1}' supporta solo macchine virtuali di tipo Azure classico.", + "loc.messages.AFC_NoARMVMResources": "Nel gruppo di risorse '{0}' non esistono computer per la copia. La connessione al servizio selezionata '{1}' supporta solo macchine virtuali di tipo Azure Resource Manager.", + "loc.messages.AFC_NoGenericVMResources": "Nel gruppo di risorse '{0}' non esiste alcun computer per la copia.", + "loc.messages.AFC_FilteringNoVMResources": "Nel gruppo di risorse '{0}' non esiste alcun computer con l'elemento {1} '{2}'.", + "loc.messages.AFC_CopyStarted": "Copia avviata per il computer: '{0}'", + "loc.messages.AFC_CopyCompleted": "Stato della copia per il computer '{0}': '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "Per risolvere i problemi correlati alla connessione al servizio WinRM, selezionare l'opzione 'Abilita prerequisiti di copia' nell'attività. Se l'opzione è già impostata e le macchine virtuali di destinazione sono supportate da un servizio di bilanciamento del carico, assicurarsi che le regole NAT in ingresso siano configurate per la porta di destinazione (5986). Applicabile solo per le macchine virtuali ARM.", + "loc.messages.AFC_CopyFailed": "La copia nel computer '{0}' non è riuscita. Per maggiori dettagli, vedere i log.", + "loc.messages.AFC_ParallelCopyFailed": "La copia in uno o più computer non è riuscita. Per maggiori dettagli, vedere i log.", + "loc.messages.AFC_CopySuccessful": "La copia dei file dal percorso di origine '{0}' alle macchine virtuali di Azure di destinazione nel gruppo di risorse '{1}' è stata completata", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "L'impostazione dell'estensione script personalizzata '{0}' per la macchina virtuale '{1}' non è riuscita. Errore: {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "Non è stato possibile aggiungere la regola di sicurezza di rete: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "Non è possibile impostare l'estensione script personalizzata '{0}' per la macchina virtuale '{1}': {2}", + "loc.messages.AFC_CopyPrereqsFailed": "Non è stato possibile abilitare i prerequisiti di copia. {0}", + "loc.messages.AFC_BlobStorageNotFound": "L'account di archiviazione {0} non è stato trovato. Specificarne uno esistente", + "loc.messages.AFC_RootContainerAndDirectory": "L'opzione '/S' non è valida per i contenitori $root.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "Il codice di risposta HTTP '{0}' non è un codice di stato di reindirizzamento valido", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "Intestazione del percorso della risposta di reindirizzamento è Null.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "AzCopy.exe è stato terminato con il codice di uscita diverso da zero durante il caricamento dei file nell'archivio BLOB.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "Non è possibile recuperare la chiave dell'account di archiviazione. Errore: '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "Disinstallare manualmente lo script personalizzato di WinRM e ripetere la distribuzione.", + "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", + "loc.messages.UnsupportedAuthScheme": "Lo schema di autenticazione '{0}' non è supportato per l'endpoint.", + "loc.messages.ServicePrincipalError": "Si è verificato un errore con l'entità servizio usata per la distribuzione." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzureFileCopyV4/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..3afe45350f05 --- /dev/null +++ b/_generated/AzureFileCopyV4/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,93 @@ +{ + "loc.friendlyName": "Azure ファイル コピー", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Azure Blob Storage または仮想マシンにファイルをコピーします", + "loc.instanceNameFormat": "$(Destination) ファイル コピー", + "loc.releaseNotes": "バージョン 4.0 の新機能:
   AzCopy.exe バージョン 10.8.0 のサポート", + "loc.input.label.SourcePath": "ソース", + "loc.input.help.SourcePath": "ソース フォルダーまたはローカル コンピューター上のファイルの絶対パス、もしくは UNC 共有。式は単一のフォルダーまたはファイルを返す必要があります。ワイルド カード記号 (*) はファイル パスまたはファイル名の任意の場所で使用できます。", + "loc.input.label.ConnectedServiceNameARM": "Azure サブスクリプション", + "loc.input.help.ConnectedServiceNameARM": "ファイルをコピーする対象の Azure Resource Manager サブスクリプション。", + "loc.input.label.Destination": "宛先の種類", + "loc.input.help.Destination": "Azure BLOB または Azure VM のいずれかをコピー先として選択します。", + "loc.input.label.StorageAccountRM": "RM ストレージ アカウント", + "loc.input.help.StorageAccountRM": "既存の ARM ストレージ アカウントを指定します。Azure VM にファイルをコピーするための仲介役としても使用されます", + "loc.input.label.ContainerName": "コンテナー名 ", + "loc.input.help.ContainerName": "ファイルをアップロードするためのコンテナーの名前です。指定した名前のコンテナーが指定したストレージ アカウントに存在しない場合、自動的に作成されます。
そのコンテナー内に仮想ディレクトリを作成する必要がある場合は、BLOB プレフィックスの入力を以下のように使用します。
例: 対象の場所が https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/ であれば、コンテナー名を mycontainer と指定し、BLOB プレフィックスを vd1/vd2/ と指定します。", + "loc.input.label.BlobPrefix": "BLOB プレフィックス ", + "loc.input.help.BlobPrefix": "ファイルをフィルター処理する場合に便利です。たとえば、すべての BLOB にビルド番号を追加して、そのビルドのみからファイルをダウンロードします。例: BLOB プレフィックスを myvd1/ として指定すると、この名前の仮想ディレクトリがコンテナー内に作成されます。末尾に '/' が付いた BLOB プレフィックスは、仮想ディレクトリとみなされます。それ以外の場合、コピーするアイテム自体がフォルダーでない限り、ファイルとして取り扱われます。ソース ファイルは https://myaccount.blob.core.windows.net/mycontainer/myvd1/ にコピーされます。", + "loc.input.label.EnvironmentNameRM": "リソース グループ", + "loc.input.help.EnvironmentNameRM": "ファイルのコピー先のターゲット リソース グループの名前。", + "loc.input.label.ResourceFilteringMethod": "以下の条件でコンピューターを選択", + "loc.input.help.ResourceFilteringMethod": "必要に応じて、VM ホスト名またはタグを指定してリソース グループ内での VM のサブセットを選びます。[タグ](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) は、Azure Resource Manager を通して作成されたリソースでのみサポートされています。", + "loc.input.label.MachineNames": "フィルター条件", + "loc.input.help.MachineNames": "VM ホスト名 (ffweb, ffdb) またはタグ (Role:DB, Web; OS:Win8.1) のリストをご指定ください。タグに使用される区切り文字が ,(コンマ)、:(コロン) および ;(セミコロン) であることにご注意ください。複数のタグが指定されている場合、指定されたタグを含むすべての VM でタスクが実行されます。既定値ではすべての VM でタスクが実行されます。", + "loc.input.label.vmsAdminUserName": "管理者ログイン", + "loc.input.help.vmsAdminUserName": "VM の管理者ユーザー名。", + "loc.input.label.vmsAdminPassword": "パスワード", + "loc.input.help.vmsAdminPassword": "VM の管理者パスワード。
ビルドまたはリリース パイプラインで '$(passwordVariable)' として定義された変数を入力することができます。
変数を 'シークレット' とマークしてセキュリティで保護することもできます。", + "loc.input.label.TargetPath": "宛先フォルダー", + "loc.input.help.TargetPath": "ソースからのファイルのコピー先となるターゲット コンピューター上のローカル パス。$env:windir\\BudgetIT\\Web のように、環境変更を使用できます。", + "loc.input.label.AdditionalArgumentsForBlobCopy": "オプションの引数 (BLOB へのファイルのアップロード用)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "BLOB にアップロードするときに適用される、オプションの AzCopy.exe 引数。例: --check-length=true。こちらにオプション引数を指定しない場合、既定で、次のオプション引数が追加されます。
--log-level=INFO (パイプラインがデバッグ モードで実行されている場合は、--log-level=DEBUG が設定されます)
--recursive (コンテナー名が $root 以外の場合のみ)
--blob-type=PageBlob (指定されたストレージ アカウントが Premium アカウントの場合のみ)。", + "loc.input.label.AdditionalArgumentsForVMCopy": "オプションの引数 (VM へのファイルのダウンロード用)", + "loc.input.help.AdditionalArgumentsForVMCopy": "VM にダウンロードするときに適用される、オプションの AzCopy.exe 引数。例: --check-length=true。こちらにオプション引数を指定しない場合、既定で、次のオプション引数が追加されます。
--log-level=INFO (パイプラインがデバッグ モードで実行されている場合は、--log-level=DEBUG が設定されます)
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "SAS トークンの有効期間 (分)", + "loc.input.help.sasTokenTimeOutInMinutes": "コンテナーの SAS トークンの有効期限が切れるまでの時間を分単位で指定します。既定では、このトークンは 4 時間後に有効期限が切れます。", + "loc.input.label.enableCopyPrerequisites": "コピーの前提条件を有効にする", + "loc.input.help.enableCopyPrerequisites": "このオプションを有効にすると、自己署名証明書を使って、Windows リモート管理 (WinRM) リスナーをポート 5986 の HTTPS プロトコル経由で構成できます。この構成は Azure コンピューター上でコピー操作を実行するために必要です。ターゲットの仮想マシンがロード バランサーでバックアップされている場合は、受信 NAT 規則がターゲット ポート (5986) に対して構成されていることを確認します。ARM VM にのみ適用されます。", + "loc.input.label.CopyFilesInParallel": "並列でのコピー", + "loc.input.help.CopyFilesInParallel": "true に設定すると、ファイルを並列でターゲット コンピューターにコピーします。", + "loc.input.label.CleanTargetBeforeCopy": "ターゲットの内容消去 ", + "loc.input.help.CleanTargetBeforeCopy": "true に設定すると、ファイルをコピーする前に宛先フォルダーの内容を消去します。", + "loc.input.label.skipCACheck": "テスト証明書", + "loc.input.help.skipCACheck": "このオプションを選ぶと、クライアントは HTTPS (Hypertext Transfer Protocol over Secure Socket Layer) を介して接続するときに、サーバー証明書が信頼できる証明機関 (CA) によって署名されていることの検証をスキップします。", + "loc.messages.AFC_StorageAccountNotFound": "ストレージ アカウント: {0} は見つかりません。選択されたサービス接続 'Service Principal' は、種類が Azure Resource Manager のストレージ アカウントのみをサポートします。", + "loc.messages.AFC_ResourceGroupNotFound": "指定されたリソース グループ '{0}' が存在しません。", + "loc.messages.AFC_GetVMStatus": "[Azure の呼び出し]VM '{0}' の状態を取得しています", + "loc.messages.AFC_GetVMStatusComplete": "[Azure の呼び出し]VM '{0}' の状態を取得しました", + "loc.messages.AFC_GetCustomScriptExtension": "[Azure の呼び出し]VM '{1}' のカスタム スクリプト拡張機能 '{0}' を取得しています", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Azure の呼び出し]VM '{1}' のカスタム スクリプト拡張機能 '{0}' を取得しました", + "loc.messages.AFC_SetCustomScriptExtension": "[Azure の呼び出し]VM '{1}' のカスタム スクリプト拡張機能 '{0}' を設定しています", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Azure の呼び出し]VM '{1}' のカスタム スクリプト拡張機能 '{0}' を設定しました", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Azure の呼び出し]VM '{1}' のカスタム スクリプト拡張機能 '{0}' を削除しています", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Azure の呼び出し]VM '{1}' のカスタム スクリプト拡張機能 '{0}' を削除しました", + "loc.messages.AFC_NoNetworkInterface": "[Azure の呼び出し]リソース グループ {1} の下に仮想マシン ID が {0} のネットワーク インターフェイスが見つかりませんでした", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Azure の呼び出し]リソース グループ名と仮想マシン ID を null または空白にすることはできません", + "loc.messages.AFC_AzurePSNotInstalled": "Azure PowerShell コマンドレットの必須の最小バージョン {0} がインストールされていません。https://azure.microsoft.com/ja-jp/documentation/articles/powershell-install-configure/ にある指示に従って、最新の Azure PowerShell を入手できます", + "loc.messages.AFC_ClassicStorageAccountNotFound": "ストレージ アカウント: {0} は見つかりません。選択されたサービス接続 'Certificate' は、Azure クラシック タイプのストレージ アカウントのみをサポートします。", + "loc.messages.AFC_GenericStorageAccountNotFound": "ストレージ アカウント {0} は見つかりません。既存のストレージ アカウントを指定してください", + "loc.messages.AFC_AzureFileCopyMoreHelp": "詳細については、{0} を参照してください", + "loc.messages.AFC_UploadFilesStorageAccount": "ソース パス '{0}' から BLOB プレフィックス '{3}' を持つコンテナー '{2}' のストレージ アカウント '{1}' にファイルをアップロードしています", + "loc.messages.AFC_UploadContainerStorageAccount": "エラー '{3}' が発生し、BLOB プレフィックス '{2}' を持つストレージ アカウント '{1}' のコンテナー '{0}' へのアップロードが失敗しました", + "loc.messages.AFC_UploadFileSuccessful": "ソース パス '{0}' から BLOB プレフィックス '{3}' を持つコンテナー '{2}' のストレージ アカウント '{1}' にファイルが正常にアップロードされました", + "loc.messages.AFC_IncorrectTags": "タグが正しく指定されていません。次の形式にする必要があります: Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "次のコンピューターが、リソース グループ内に見つからないか、名前の指定が正しくありません: {0}。リソース グループ内に存在するコンピューター名と正確に同じコンピューター名を指定してください。複数のコンピューター名を区切るにはコンマを使用します。", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "ResourceGroup '{1}' のすべてのリソースに対して {0} を取得できません", + "loc.messages.AFC_MachineNameFromIdError": "ResourceGroup '{2}' の '{1}' つのリソースに対して {0} を取得できません", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "選択されたサービス接続 '{0}' を使用して、リソース '{1}' を見つけることができません。選択されたサービス接続 '{0}' は、従来のリソース (Service Management モデル) のみをサポートします。", + "loc.messages.AFC_NoClassicVMResources": "リソース グループ '{0}' の下にコピー対象のマシンは存在しません。選択したサービス接続 '{1}' は Azure クラシック タイプの仮想マシンのみをサポートします。", + "loc.messages.AFC_NoARMVMResources": "リソース グループ '{0}' の下にコピー対象のマシンは存在しません。選択したサービス接続 '{1}' は Azure Resource Manager タイプの仮想マシンのみをサポートします。", + "loc.messages.AFC_NoGenericVMResources": "リソース グループ '{0}' の下にコピー対象のコンピューターは存在しません。", + "loc.messages.AFC_FilteringNoVMResources": "次の {1} '{2}' を持つリソース グループ '{0}' の下にコンピューターは存在しません。", + "loc.messages.AFC_CopyStarted": "コンピューター '{0}' のコピーが開始しました", + "loc.messages.AFC_CopyCompleted": "コンピューター '{0}' のコピーの状態: '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "WinRM サービス接続に関連する問題を修正するには、タスクで [コピーの前提条件を有効にする] オプションを選びます。既に設定されており、対象の仮想マシンがロード バランサーの対象となっている場合は、受信 NAT 規則がターゲット ポート (5986) 用に構成されていることを確認してください。ARM VM にのみ適用されます。", + "loc.messages.AFC_CopyFailed": "マシン '{0}' でコピーに失敗しました。詳細についてはログを参照してください。", + "loc.messages.AFC_ParallelCopyFailed": "1 台または複数のマシンへのコピーが失敗しました。詳細についてはログを参照してください。", + "loc.messages.AFC_CopySuccessful": "ソース パス '{0}' からリソース グループ '{1}' 内のターゲット Azure VM へのファイルのコピーが正常に完了しました", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "仮想マシン '{1}' のカスタム スクリプト拡張機能 '{0}' の設定がエラーで失敗しました: {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "ネットワークのセキュリティ規則を追加できませんでした: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "仮想マシン '{1}' のカスタム スクリプト拡張機能 '{0}' を設定できません: {2}", + "loc.messages.AFC_CopyPrereqsFailed": "コピーの前提条件を有効にすることができませんでした。{0}", + "loc.messages.AFC_BlobStorageNotFound": "ストレージ アカウント {0} は見つかりません。既存のストレージ アカウントを指定してください", + "loc.messages.AFC_RootContainerAndDirectory": "$root コンテナーには、'/S' オプションは無効です。", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "HTTP 応答コード: '{0}' は無効なリダイレクト状態コードです", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "リダイレクト応答の場所ヘッダーが null です。", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "AzCopy.exe が Blob Storage にファイルをアップロードしている間に、ゼロ以外の終了コードで終了しました。", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "ストレージ アカウント キーをフェッチできません。エラー: '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "WinRM カスタム スクリプトを手動でアンインストールしてから、配置を再試行してください。", + "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", + "loc.messages.UnsupportedAuthScheme": "'{0}' はエンドポイントではサポートされていない認証スキームです。", + "loc.messages.ServicePrincipalError": "配置に使用したサービス プリンシパルにエラーがありました。" +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzureFileCopyV4/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..fbf9fcf7c32c --- /dev/null +++ b/_generated/AzureFileCopyV4/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,93 @@ +{ + "loc.friendlyName": "Azure 파일 복사", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Azure Blob Storage 또는 가상 머신에 파일을 복사합니다.", + "loc.instanceNameFormat": "$(Destination) 파일 복사", + "loc.releaseNotes": "버전 4.0의 새로운 기능:
   AzCopy.exe 버전 10.8.0 지원", + "loc.input.label.SourcePath": "소스", + "loc.input.help.SourcePath": "소스 폴더, 로컬 머신의 파일 또는 UNC 공유에 대한 절대 경로입니다. 식은 단일 폴더 또는 파일을 반환해야 합니다. 와일드카드 기호(*)는 파일 경로 또는 파일 이름의 모든 위치에서 지원됩니다.", + "loc.input.label.ConnectedServiceNameARM": "Azure 구독", + "loc.input.help.ConnectedServiceNameARM": "파일 복사를 위한 대상으로 지정할 Azure Resource Manager 구독입니다.", + "loc.input.label.Destination": "대상 형식", + "loc.input.help.Destination": "대상으로 Azure Blob 또는 Azure VM 중 하나를 선택합니다.", + "loc.input.label.StorageAccountRM": "RM 저장소 계정", + "loc.input.help.StorageAccountRM": "기존 ARM 저장소 계정을 지정합니다. 파일을 Azure VM에 복사하기 위한 중간자로도 사용됩니다.", + "loc.input.label.ContainerName": "컨테이너 이름", + "loc.input.help.ContainerName": "파일을 업로드하기 위한 컨테이너의 이름입니다. 지정한 스토리지 계정에 지정된 이름을 가진 컨테이너가 없을 경우 자동으로 만들어집니다.
컨테이너 안에 가상 디렉터리를 만들어야 하는 경우 아래 Blob 접두사 입력을 사용하세요.
예: 대상 위치가 https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/인 경우 mycontainer를 컨테이너 이름으로, vd1/vd2/를 Blob 접두사로 지정하세요.", + "loc.input.label.BlobPrefix": "Blob 접두사", + "loc.input.help.BlobPrefix": "파일을 필터링하는 데 유용합니다. 예를 들어 모든 Blob에 빌드 번호를 추가하여 해당 빌드에서만 파일을 다운로드할 수 있습니다. 예: Blob 접두사를 myvd1/로 지정하면 이 이름의 가상 디렉터리가 컨테이너 내부에 만들어집니다. 후행 '/'가 있는 Blob 접두사는 가상 디렉터리로 간주됩니다. 후행 '/'가 없으면 복사되는 항목 자체가 폴더가 아니라면 파일로 처리됩니다. 원본 파일이 https://myaccount.blob.core.windows.net/mycontainer/myvd1/로 복사됩니다.", + "loc.input.label.EnvironmentNameRM": "리소스 그룹", + "loc.input.help.EnvironmentNameRM": "파일을 복사할 대상 리소스 그룹의 이름입니다.", + "loc.input.label.ResourceFilteringMethod": "컴퓨터 선택 기준", + "loc.input.help.ResourceFilteringMethod": "필요한 경우 VM 호스트 이름이나 태그를 제공하여 리소스 그룹에서 VM의 하위 집합을 선택합니다. [태그](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/)는 Azure Resource Manager를 통해 만든 리소스에만 지원됩니다.", + "loc.input.label.MachineNames": "필터 조건", + "loc.input.help.MachineNames": "ffweb, ffdb 등과 같은 VMs 호스트 이름이나 Role:DB, Web; OS:Win8.1 등과 같은 태그의 목록을 지정하세요. 태그에 사용되는 구분 기호는 ,(쉼표), :(콜론) 및 ;(세미콜론)입니다. 여러 태그를 지정하는 경우 작업이 지정된 태그가 있는 모든 VM에서 실행됩니다. 기본값은 모든 VM에서 작업을 실행하는 것입니다.", + "loc.input.label.vmsAdminUserName": "관리자 로그인", + "loc.input.help.vmsAdminUserName": "VM의 관리자 사용자 이름입니다.", + "loc.input.label.vmsAdminPassword": "암호", + "loc.input.help.vmsAdminPassword": "VM의 관리자 암호입니다.
빌드 또는 릴리스 파이프라인에서 '$(passwordVariable)'(으)로 정의된 변수를 사용할 수 있습니다.
변수를 'secret'으로 표시하여 보호할 수도 있습니다.", + "loc.input.label.TargetPath": "대상 폴더", + "loc.input.help.TargetPath": "소스에서 파일을 복사하기 위한 대상 컴퓨터의 로컬 경로입니다. $env:windir\\BudgetIT\\Web과 같은 환경 변수를 사용할 수 있습니다.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "선택적 인수(Blob에 파일을 업로드하는 경우)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Blob으로 업로드할 때 적용되는 선택적 AzCopy.exe 인수(예: --check-length=true)입니다. 여기에서 선택적 인수를 지정하지 않으면 다음과 같은 선택적 인수가 기본적으로 추가됩니다.
--log-level=INFO(파이프라인이 디버그 모드에서 실행되는 경우 --log-level=DEBUG 설정),
--recursive(컨테이너 이름이 $root가 아닌 경우에만),
--blob-type=PageBlob(지정한 스토리지 계정이 프리미엄 계정인 경우에만)", + "loc.input.label.AdditionalArgumentsForVMCopy": "선택적 인수(VM에 파일을 다운로드하는 경우)", + "loc.input.help.AdditionalArgumentsForVMCopy": "VM으로 다운로드할 때 적용되는 선택적 AzCopy.exe 인수(예: --check-length=true)입니다. 여기에서 선택적 인수를 지정하지 않으면 다음과 같은 선택적 인수가 기본적으로 추가됩니다.
--log-level=INFO(파이프라인이 디버그 모드에서 실행되는 경우 --log-level=DEBUG 설정),
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "SAS 토큰 만료 기간(분)", + "loc.input.help.sasTokenTimeOutInMinutes": "컨테이너에 대한 SAS 토큰이 만료되기까지의 시간(분)을 제공합니다. 기본적으로 이 토큰은 4시간 후에 만료됩니다.", + "loc.input.label.enableCopyPrerequisites": "복사 필수 구성 요소 사용", + "loc.input.help.enableCopyPrerequisites": "이 옵션을 사용하도록 설정하면 자체 서명된 인증서를 사용하여 포트 5986의 HTTP 프로토콜에서 WinRM(Windows 원격 관리) 수신기가 구성됩니다. 이 구성은 Azure 컴퓨터에서 복사 작업을 수행하는 데 필요합니다. 대상 가상 머신이 Load Balancer에서 지원되는 경우 인바운드 NAT 규칙이 대상 포트(5986)에 대해 구성되었는지 확인하세요. ARM VM에 대해서만 적용할 수 있습니다.", + "loc.input.label.CopyFilesInParallel": "동시 복사", + "loc.input.help.CopyFilesInParallel": "true로 설정하면 파일이 대상 컴퓨터에 동시에 복사됩니다.", + "loc.input.label.CleanTargetBeforeCopy": "클린 대상", + "loc.input.help.CleanTargetBeforeCopy": "true로 설정하면 파일을 복사하기 전에 대상 폴더가 정리됩니다.", + "loc.input.label.skipCACheck": "테스트 인증서", + "loc.input.help.skipCACheck": "이 옵션을 선택하면 클라이언트에서 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)를 통해 연결할 때 서버 인증서에 신뢰할 수 있는 CA(인증 기관)의 서명이 있는지 확인하는 단계를 건너뜁니다.", + "loc.messages.AFC_StorageAccountNotFound": "스토리지 계정 {0}을(를) 찾을 수 없습니다. 선택한 서비스 연결 'Service Principal'은 Azure Resource Manager 유형의 스토리지 계정만 지원합니다.", + "loc.messages.AFC_ResourceGroupNotFound": "제공된 리소스 그룹 '{0}'이(가) 없습니다.", + "loc.messages.AFC_GetVMStatus": "[Azure 호출]VM '{0}'의 상태를 가져오는 중", + "loc.messages.AFC_GetVMStatusComplete": "[Azure 호출]VM '{0}'의 상태를 가져왔습니다.", + "loc.messages.AFC_GetCustomScriptExtension": "[Azure 호출]VM '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 가져오는 중", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Azure 호출]VM '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 가져왔습니다.", + "loc.messages.AFC_SetCustomScriptExtension": "[Azure 호출]VM '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 설정하는 중", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Azure 호출]VM '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 설정했습니다.", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Azure 호출]VM '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 제거하는 중", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Azure 호출]VM '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 제거했습니다.", + "loc.messages.AFC_NoNetworkInterface": "[Azure 호출]리소스 그룹 {1}에 가상 머신 ID가 {0}인 네트워크 인터페이스가 없습니다.", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Azure 호출]리소스 그룹 이름 및 가상 머신 ID는 null이거나 비워 둘 수 없습니다.", + "loc.messages.AFC_AzurePSNotInstalled": "필요한 Azure PowerShell Cmdlet의 최소 버전 {0}이(가) 설치되어 있지 않습니다. https://azure.microsoft.com/ko-kr/documentation/articles/powershell-install-configure/의 지침에 따라 최신 Azure PowerShell을 다운로드할 수 있습니다.", + "loc.messages.AFC_ClassicStorageAccountNotFound": "스토리지 계정 {0}을(를) 찾을 수 없습니다. 선택한 서비스 연결 'Certificate'는 Azure 클래식 유형의 스토리지 계정만 지원합니다.", + "loc.messages.AFC_GenericStorageAccountNotFound": "저장소 계정 {0}을(를) 찾을 수 없습니다. 기존 저장소 계정을 지정하세요.", + "loc.messages.AFC_AzureFileCopyMoreHelp": "자세한 내용은 {0}을(를) 참조하세요.", + "loc.messages.AFC_UploadFilesStorageAccount": "Blob 접두사 '{3}'(으)로 소스 경로 '{0}'의 파일을 '{2}' 컨테이너의 저장소 계정 '{1}'에 업로드하는 중", + "loc.messages.AFC_UploadContainerStorageAccount": "Blob 접두사 '{2}'(으)로 저장소 계정 '{1}'에 '{0}' 컨테이너를 업로드하지 못했습니다. 오류: '{3}'", + "loc.messages.AFC_UploadFileSuccessful": "Blob 접두사 '{3}'(으)로 소스 경로 '{0}'의 파일을 '{2}' 컨테이너의 저장소 계정 '{1}'에 업로드했습니다.", + "loc.messages.AFC_IncorrectTags": "태그가 잘못 지정되었습니다. 태그는 Role:Web,DB;Location:East US;Dept.:Finance,HR 형식이어야 합니다.", + "loc.messages.AFC_MachineDoesNotExist": "다음 컴퓨터는 리소스 그룹에 없거나 해당 이름이 올바르게 지정되지 않았습니다. {0}. 리소스 그룹에 있는 그대로 정확하게 같은 컴퓨터 이름을 제공하세요. 여러 컴퓨터 이름을 구분하려면 쉼표를 사용하세요.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "ResourceGroup '{1}'에서 모든 리소스에 대한 {0}을(를) 가져올 수 없습니다.", + "loc.messages.AFC_MachineNameFromIdError": "ResourceGroup '{2}'에서 '{1}' 리소스에 대한 {0}을(를) 가져올 수 없습니다.", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "선택한 서비스 연결 '{0}'을(를) 사용하여 '{1}' 리소스를 찾을 수 없습니다. 선택한 서비스 연결 '{0}'은(는) 클래식 리소스만 지원합니다(서비스 관리 모델).", + "loc.messages.AFC_NoClassicVMResources": "복사에 사용할 머신이 리소스 그룹 '{0}'에 없습니다. 선택한 서비스 연결 '{1}'은(는) Azure 클래식 유형의 Virtual Machines만 지원합니다.", + "loc.messages.AFC_NoARMVMResources": "복사에 사용할 머신이 리소스 그룹 '{0}'에 없습니다. 선택한 서비스 연결 '{1}'은(는) Azure Resource Manager 유형의 Virtual Machines만 지원합니다.", + "loc.messages.AFC_NoGenericVMResources": "복사에 사용할 컴퓨터가 리소스 그룹 '{0}'에 없습니다.", + "loc.messages.AFC_FilteringNoVMResources": "다음의 {1} '{2}'을(를) 포함하는 컴퓨터가 리소스 그룹 '{0}'에 없습니다.", + "loc.messages.AFC_CopyStarted": "다음 컴퓨터에 대한 복사 시작됨: '{0}'", + "loc.messages.AFC_CopyCompleted": "'{0}' 컴퓨터의 상태 복사: '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "WinRM 서비스 연결 관련 문제를 해결하려면 작업에서 '복사 필수 구성 요소 사용' 옵션을 선택하세요. 이미 설정되어 있고 대상 가상 머신이 부하 분산 장치로 지원되면 대상 포트(5986)에 대해 인바운드 NAT 규칙이 구성되어 있는지 확인합니다. ARM VM에만 적용됩니다.", + "loc.messages.AFC_CopyFailed": "'{0}' 머신에 복사하지 못했습니다. 자세한 내용은 로그를 참조하세요.", + "loc.messages.AFC_ParallelCopyFailed": "하나 이상의 머신에 복사하지 못했습니다. 자세한 내용은 로그를 참조하세요.", + "loc.messages.AFC_CopySuccessful": "소스 경로 '{0}'의 파일을 리소스 그룹의 대상 Azure VM '{1}'에 복사했습니다.", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "가상 머신 '{0}'의 사용자 지정 스크립트 확장 '{1}'을(를) 설정하지 못했습니다. 오류: {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "네트워크 보안 규칙을 추가하지 못했습니다. {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "가상 머신 '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 설정할 수 없습니다. {2}", + "loc.messages.AFC_CopyPrereqsFailed": "복사 필수 구성 요소를 사용하도록 설정하지 못했습니다. {0}", + "loc.messages.AFC_BlobStorageNotFound": "저장소 계정 {0}을(를) 찾을 수 없습니다. 기존 저장소 계정을 지정하세요.", + "loc.messages.AFC_RootContainerAndDirectory": "$root 컨테이너에 대해 '/S' 옵션이 잘못되었습니다.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "HTTP 응답 코드: '{0}'은(는) 유효한 리디렉션 상태 코드가 아닙니다.", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "리디렉션 응답 위치 헤더가 null입니다.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "Blob Storage에 파일을 업로드하는 중 AzCopy.exe가 0이 아닌 종료 코드로 종료되었습니다.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "스토리지 계정 키를 페치할 수 없습니다. 오류: '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "WinRM 사용자 지정 스크립트를 수동으로 제거하고 배포를 다시 시도하세요.", + "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", + "loc.messages.UnsupportedAuthScheme": "엔드포인트에 대해 인증 체계 '{0}'은(는) 지원되지 않습니다.", + "loc.messages.ServicePrincipalError": "배포에 사용되는 서비스 사용자에 오류가 발생했습니다." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzureFileCopyV4/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..243225eb5e77 --- /dev/null +++ b/_generated/AzureFileCopyV4/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,93 @@ +{ + "loc.friendlyName": "Копирование файлов Azure", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Копировать файлы в хранилище BLOB-объектов Azure или виртуальные машины", + "loc.instanceNameFormat": "Копирование файлов $(Destination)", + "loc.releaseNotes": "Новые возможности версии 4.0:
   поддержка AzCopy.exe версии 10.8.0", + "loc.input.label.SourcePath": "Источник", + "loc.input.help.SourcePath": "Абсолютный путь к исходной папке или файлу на локальном компьютере или общему ресурсу UNC. Выражение должно возвращать одну папку или один файл. Подстановочный знак (*) поддерживается в любом месте пути к файлу или имени файла.", + "loc.input.label.ConnectedServiceNameARM": "Подписка Azure", + "loc.input.help.ConnectedServiceNameARM": "Подписка на Azure Resource Manager, предназначенная для копирования файлов.", + "loc.input.label.Destination": "Целевой тип", + "loc.input.help.Destination": "Выберите назначение: BLOB-объект Azure или виртуальные машины Azure.", + "loc.input.label.StorageAccountRM": "Учетная запись хранения Диспетчера ресурсов", + "loc.input.help.StorageAccountRM": "Укажите существующую учетную запись хранения ARM. Она также используется в качестве промежуточной для копирования файлов на виртуальные машины Azure", + "loc.input.label.ContainerName": "Имя контейнера", + "loc.input.help.ContainerName": "Имя контейнера для отправки файлов. Если контейнер с данным именем не существует в указанной учетной записи хранения, он будет создан автоматически.
Для создания виртуального каталога внутри контейнера используйте приведенный ниже входной префикс BLOB-объекта.
Пример. Если конечным расположением является https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/, укажите mycontainer в качестве имени контейнера и vd1/vd2/ в качестве префикса BLOB-объекта.", + "loc.input.label.BlobPrefix": "Префикс BLOB-объекта", + "loc.input.help.BlobPrefix": "Удобно для фильтрации файлов, например добавьте номер сборки ко всем BLOB-объектам для скачивания файлов только из этой сборки. Пример. Если префикс BLOB-объекта указан как myvd1/, в контейнере будет создан виртуальный каталог с таким именем. Префикс BLOB-объекта с конечным \"/\" будет считаться виртуальным каталогом. В противном случае он будет рассматриваться как файл, если копируемый элемент не является папкой. Исходные файлы будут скопированы в https://myaccount.blob.core.windows.net/mycontainer/myvd1/.", + "loc.input.label.EnvironmentNameRM": "Группа ресурсов", + "loc.input.help.EnvironmentNameRM": "Название целевой группы ресурсов, в которую копируются файлы.", + "loc.input.label.ResourceFilteringMethod": "Выбор компьютеров по", + "loc.input.help.ResourceFilteringMethod": "Можно также выбрать подмножество виртуальных машин в группе ресурсов, указав имя узла виртуальных машин или теги. [Теги](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) поддерживаются только для ресурсов, созданных в Azure Resource Manager.", + "loc.input.label.MachineNames": "Условия фильтра", + "loc.input.help.MachineNames": "Укажите список имен узлов виртуальных машин (например, ffweb, ffdb) или тегов (например, Role:DB, Web; OS:Win8.1). Для тегов используются следующие разделители: , (запятая), : (двоеточие) и ; (точка с запятой). Если указывается несколько тегов, задача будет обрабатывать все виртуальные машины с указанными тегами. По умолчанию задача запускается на всех виртуальных машинах.", + "loc.input.label.vmsAdminUserName": "Имя для входа администратора", + "loc.input.help.vmsAdminUserName": "Имя администратора виртуальных машин.", + "loc.input.label.vmsAdminPassword": "Пароль", + "loc.input.help.vmsAdminPassword": "Пароль администратора для виртуальных машин.
Допустимы переменные, заданные в конвейерах сборки или выпуска как \"$(passwordVariable)\".
Чтобы защитить переменную, пометьте ее как secret.", + "loc.input.label.TargetPath": "Папка назначения", + "loc.input.help.TargetPath": "Локальный путь на целевых компьютерах для копирования файлов из источника. Переменную среды можно использовать как $env:windir\\BudgetIT\\Web.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "Необязательные аргументы (для отправки файлов в большой двоичный объект)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Необязательные аргументы AzCopy.exe, которые будут применены при отправке в BLOB-объект, например --check-length=true. Если здесь не указаны дополнительные аргументы, по умолчанию будут добавлены указанные ниже необязательные аргументы.
--log-level=INFO (если конвейер находится в режиме отладки, укажите --log-level=DEBUG),
--recursive (только если имя контейнера отличается от $root),
--blob-type=PageBlob (только если указанная учетная запись хранения относится к ценовой категории \"Премиум\").", + "loc.input.label.AdditionalArgumentsForVMCopy": "Необязательные аргументы (для скачивания файлов в виртуальную машину)", + "loc.input.help.AdditionalArgumentsForVMCopy": "Необязательные аргументы AzCopy.exe, которые будут применены при скачивании на виртуальную машину, например --check-length=true. Если здесь не указаны дополнительные аргументы, по умолчанию будут добавлены указанные ниже необязательные аргументы.
--log-level=INFO (если конвейер находится в режиме отладки, укажите --log-level=DEBUG),
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "Период истечения срока действия маркера SAS в минутах", + "loc.input.help.sasTokenTimeOutInMinutes": "Укажите время в минутах, по истечении которого закончится срок действия маркера SAS для контейнера. По умолчанию срок действия маркера истекает через 4 часа.", + "loc.input.label.enableCopyPrerequisites": "Включить необходимые компоненты для копирования", + "loc.input.help.enableCopyPrerequisites": "При включении этого параметра настраивается прослушиватель службы удаленного управления Windows (WinRM) по протоколу HTTPS на порте 5986 с использованием самозаверяющего сертификата. Эта конфигурация требуется для выполнения копирования на виртуальных машинах Azure. Если целевые виртуальные машины поддерживаются средствами Load Balancer, убедитесь, что правила NAT для входящего трафика настроены для целевого порта (5986). Применимо только для виртуальных машин ARM.", + "loc.input.label.CopyFilesInParallel": "Копировать параллельно", + "loc.input.help.CopyFilesInParallel": "Если задано значение \"true\", будет выполнено параллельное копирование файлов на целевые компьютеры.", + "loc.input.label.CleanTargetBeforeCopy": "Очистить целевую папку", + "loc.input.help.CleanTargetBeforeCopy": "Если задано значение \"true\", конечная папка будет очищена до копирования файлов.", + "loc.input.label.skipCACheck": "Тестовый сертификат", + "loc.input.help.skipCACheck": "Если выбрать этот параметр, клиент пропускает проверку того, подписан ли сертификат сервера доверенным центром сертификации при подключении по протоколу HTTP через SSL (HTTPS).", + "loc.messages.AFC_StorageAccountNotFound": "Учетная запись хранения \"{0}\" не найдена. Выбранное подключение к службе \"Субъект-служба\" поддерживает учетные записи хранения только типа Azure Resource Manager.", + "loc.messages.AFC_ResourceGroupNotFound": "Указанная группа ресурсов \"{0}\" не существует.", + "loc.messages.AFC_GetVMStatus": "[Вызов Azure] Идет получение состояния виртуальной машины \"{0}\"", + "loc.messages.AFC_GetVMStatusComplete": "[Вызов Azure] Состояние виртуальной машины \"{0}\" получено", + "loc.messages.AFC_GetCustomScriptExtension": "[Вызов Azure] Идет получение расширения настраиваемого скрипта \"{0}\" для виртуальной машины \"{1}\"", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Вызов Azure] Расширение настраиваемого скрипта \"{0}\" для виртуальной машины \"{1}\" получено", + "loc.messages.AFC_SetCustomScriptExtension": "[Вызов Azure] Идет задание расширения настраиваемого скрипта \"{0}\" для виртуальной машины \"{1}\"", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Вызов Azure] Расширение настраиваемого скрипта \"{0}\" для виртуальной машины \"{1}\" задано", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Вызов Azure] Идет удаление расширения настраиваемого скрипта \"{0}\" для виртуальной машины \"{1}\"", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Вызов Azure] Расширение настраиваемого скрипта \"{0}\" для виртуальной машины \"{1}\" удалено", + "loc.messages.AFC_NoNetworkInterface": "[Вызов Azure] Сетевые интерфейсы с идентификатором виртуальной машины {0} не найдены в группе ресурсов {1}", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Вызов Azure] ИД виртуальной машины и имя группы ресурсов не должны иметь значение NULL или быть пустыми", + "loc.messages.AFC_AzurePSNotInstalled": "Минимальная требуемая версия ({0}) командлетов Azure PowerShell не установлена. Для получения последней версии Azure PowerShell можно выполнить инструкции на странице https://azure.microsoft.com/ru-ru/documentation/articles/powershell-install-configure/.", + "loc.messages.AFC_ClassicStorageAccountNotFound": "Учетная запись хранения \"{0}\" не найдена. Выбранное подключение к службе \"Сертификат\" поддерживает учетные записи хранения только типа \"классическая Azure\".", + "loc.messages.AFC_GenericStorageAccountNotFound": "Учетная запись хранения \"{0}\" не найдена. Укажите существующую учетную запись хранения.", + "loc.messages.AFC_AzureFileCopyMoreHelp": "Дополнительные сведения см. в {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "Идет отправка файлов из исходного пути \"{0}\" в учетную запись хранения \"{1}\" в контейнере \"{2}\" с префиксом BLOB-объекта \"{3}\"", + "loc.messages.AFC_UploadContainerStorageAccount": "Сбой отправки в контейнер \"{0}\" в учетной записи хранения \"{1}\" с префиксом BLOB-объекта \"{2}\". Ошибка: \"{3}\"", + "loc.messages.AFC_UploadFileSuccessful": "Файлы успешно отправлены из исходного пути \"{0}\" в учетную запись хранения \"{1}\" в контейнере \"{2}\" с префиксом BLOB-объекта \"{3}\"", + "loc.messages.AFC_IncorrectTags": "Теги указаны неправильно. Они должны быть в следующем формате: Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "Следующие компьютеры не существуют в группе ресурсов, или их имена указаны неправильно: {0}. Укажите именно те имена компьютеров, которые содержатся в группе ресурсов. Используйте запятые для разделения нескольких имен.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "Не удается получить {0} для всех ресурсов в группе ресурсов: \"{1}\"", + "loc.messages.AFC_MachineNameFromIdError": "Не удается получить {0} для ресурсов \"{1}\" в группе ресурсов: \"{2}\"", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "Не удается найти ресурс \"{1}\", используя выбранное подключение к службе (\"{0}\"). Выбранное подключение к службе (\"{0}\") поддерживает только классические ресурсы (модель управления службами).", + "loc.messages.AFC_NoClassicVMResources": "В группе ресурсов \"{0}\" нет компьютеров для копирования. Выбранное подключение к службе, \"{1}\", поддерживает виртуальные машины только типа \"классическая Azure\".", + "loc.messages.AFC_NoARMVMResources": "В группе ресурсов \"{0}\" нет компьютеров для копирования. Выбранное подключение к службе, \"{1}\", поддерживает виртуальные машины только типа Azure Resource Manager.", + "loc.messages.AFC_NoGenericVMResources": "В группе ресурсов \"{0}\" нет компьютеров для копирования.", + "loc.messages.AFC_FilteringNoVMResources": "В группе ресурсов \"{0}\" нет компьютеров со следующим: {1} \"{2}\".", + "loc.messages.AFC_CopyStarted": "Началось копирование для компьютера: \"{0}\"", + "loc.messages.AFC_CopyCompleted": "Копирование состояния для компьютера \"{0}\": \"{1}\"", + "loc.messages.AFC_WinRMHelpMessage": "Чтобы исправить проблемы, связанные с подключением к службе WinRM, выберите в задаче параметр \"Включить необходимые компоненты для копирования\". Если этот параметр уже задан и целевые виртуальные машины поддерживаются балансировщиком нагрузки, необходимо настроить правила NAT для входящего трафика для целевого порта (5986). Применимо только к виртуальным машинам ARM.", + "loc.messages.AFC_CopyFailed": "Сбой копирования на компьютере \"{0}\". Дополнительные сведения см. в журналах.", + "loc.messages.AFC_ParallelCopyFailed": "Сбой копирования на один или несколько компьютеров. Дополнительные сведения см. в журналах.", + "loc.messages.AFC_CopySuccessful": "Файлы успешно скопированы из исходного пути \"{0}\" на целевые виртуальные машины Azure в группе ресурсов \"{1}\"", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "Сбой задания расширения настраиваемого скрипта \"{0}\" для виртуальной машины \"{1}\" с ошибкой: \"{2}\".", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "Не удалось добавить правило безопасности сети: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "Не удается задать расширение настраиваемого скрипта \"{0}\" для виртуальной машины \"{1}\": {2}", + "loc.messages.AFC_CopyPrereqsFailed": "Не удалось включить необходимые компоненты для копирования. {0}", + "loc.messages.AFC_BlobStorageNotFound": "Учетная запись хранения \"{0}\" не найдена. Укажите существующую учетную запись хранения.", + "loc.messages.AFC_RootContainerAndDirectory": "Параметр \"/S\" является недопустимым для контейнеров $root.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "Код ответа HTTP \"{0}\" не является допустимым кодом состояния перенаправления.", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "Заголовок расположения ответа перенаправления равен NULL.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "Программа AzCopy.exe завершила работу с ненулевым кодом выхода при отправке файлов в хранилище BLOB-объектов.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "Не удалось получить ключ учетной записи хранения. Ошибка: \"{0}\"", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "Удалите пользовательский скрипт WinRM вручную и повторите попытку развертывания.", + "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", + "loc.messages.UnsupportedAuthScheme": "Схема проверки подлинности \"{0}\" не поддерживается для конечной точки.", + "loc.messages.ServicePrincipalError": "Произошла ошибка с субъектом-службой, используемой для развертывания." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzureFileCopyV4/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..d4b9c1a36311 --- /dev/null +++ b/_generated/AzureFileCopyV4/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,93 @@ +{ + "loc.friendlyName": "Azure 文件复制", + "loc.helpMarkDown": "[详细了解此任务](https://aka.ms/azurefilecopyreadme)", + "loc.description": "将文件复制到 Azure Blob 存储或虚拟机", + "loc.instanceNameFormat": "$(Destination) 文件复制", + "loc.releaseNotes": "版本 4.0 中的新增功能:
    支持 AzCopy.exe 版本 10.8.0", + "loc.input.label.SourcePath": "源", + "loc.input.help.SourcePath": "源文件夹、本地计算机上的文件或 UNC 共享的绝对路径。表达式应返回单个文件夹或文件。支持在文件路径或文件名的任何位置使用通配符(*)。", + "loc.input.label.ConnectedServiceNameARM": "Azure 订阅", + "loc.input.help.ConnectedServiceNameARM": "用于复制文件的目标帐户的 Azure 资源管理器订阅。", + "loc.input.label.Destination": "目标类型", + "loc.input.help.Destination": "选择目标,即 Azure Blob 或 Azure VM。", + "loc.input.label.StorageAccountRM": "RM 存储帐户", + "loc.input.help.StorageAccountRM": "指定预先存在的 ARM 存储帐户。它还用作将文件复制到 Azure VM 的中间帐户", + "loc.input.label.ContainerName": "容器名", + "loc.input.help.ContainerName": "用于上载文件的容器的名称。如果指定存储帐户中不存在具有给定名称的容器,将自动创建该容器。
如果需要在容器中创建虚拟目录,请使用下面的 blob 前缀输入。
示例: 如果目标位置是 https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/,则指定 mycontainer 作为容器名称,vd1/vd2/ 作为 blob 前缀。", + "loc.input.label.BlobPrefix": "Blob 前缀", + "loc.input.help.BlobPrefix": "用于筛选文件,例如,将生成号追加到所有 blob 以仅从该生成下载文件。示例: 如果将 blob 前缀指定为 myvd1/,则将在容器内创建具有此名称的虚拟目录。带有尾随“/”的 Blob 前缀将被视为虚拟目录。否则,除非要复制的项本身是文件夹,否则它将被视为文件。源文件将被复制到 https://myaccount.blob.core.windows.net/mycontainer/myvd1/。", + "loc.input.label.EnvironmentNameRM": "资源组", + "loc.input.help.EnvironmentNameRM": "要将文件复制到的目标资源组的名称。", + "loc.input.label.ResourceFilteringMethod": "计算机选择依据", + "loc.input.help.ResourceFilteringMethod": "(可选)通过提供 VM 主机名或标记选择资源组中 VM 的子集。仅通过 Azure 资源管理器创建的资源支持 [标记](https://learn.microsoft.com/zh-cn/azure/virtual-machines/tag-template/)。", + "loc.input.label.MachineNames": "筛选条件", + "loc.input.help.MachineNames": "提供 VM 主机名(ffweb、ffdb等)或标记(Role:DB、Web; OS:Win8.1等)的列表。请注意,标记所用的分隔符为 ,(冒号)、:(句点)和 ;(分号)。如果提供了多个标记,则任务将使用指定标记在所有 VM 中运行。默认为在所有 VM 中运行任务。", + "loc.input.label.vmsAdminUserName": "管理员登录名", + "loc.input.help.vmsAdminUserName": "VM 的管理员用户名。", + "loc.input.label.vmsAdminPassword": "密码", + "loc.input.help.vmsAdminPassword": "VM 的管理员密码。
可接受在生成/发布管道中定义为 \"$(passwordVariable)\" 的变量。
可将变量类型标记为“机密”来保护它。", + "loc.input.label.TargetPath": "目标文件夹", + "loc.input.help.TargetPath": "用于从源复制文件的目标计算机上的本地路径。可以使用环境变量,如 $env: windir\\BudgetIT\\Web。", + "loc.input.label.AdditionalArgumentsForBlobCopy": "可选参数(用于将文件上载到 blob)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "上传到 blob 时将应用的可选 AzCopy.exe 参数,如 --check-length=true。如果此处未指定任何可选参数,将默认添加以下可选参数。
--log-level=INFO (如果管道以调试模式运行,则设为 --log-level=DEBUG)、
--recursive (仅当容器名称不是 $root 时)、
--blob-type=PageBlob (仅当指定的存储帐户为高级帐户时)。", + "loc.input.label.AdditionalArgumentsForVMCopy": "可选参数(用于将文件下载到 VM)", + "loc.input.help.AdditionalArgumentsForVMCopy": "下载到 VM 时将应用的可选 AzCopy.exe 参数,如 --check-length=true。如果此处未指定任何可选参数,将默认添加以下可选参数。
--log-level=INFO (如果管道以调试模式运行,则设为 --log-level=DEBUG)、
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "SAS 令牌有效期(分钟)", + "loc.input.help.sasTokenTimeOutInMinutes": "提供容器的 SAS 令牌过期前的时间(分钟)。默认情况下,此令牌将在 4 小时后过期。", + "loc.input.label.enableCopyPrerequisites": "启用复制先决条件", + "loc.input.help.enableCopyPrerequisites": "使用自签名证书启用此选项将在端口 5986 上配置针对 HTTPS 协议的 Windows 远程管理(WinRM)侦听器。需要此配置才能在 Azure 计算机上执行复制操作。如果目标虚拟机受 Load Balancer 支持,请确保为目标端口(5986)配置了入站 NAT 规则。仅适用于 ARM VM。", + "loc.input.label.CopyFilesInParallel": "并行复制", + "loc.input.help.CopyFilesInParallel": "将其设置为 true 会将文件并行复制到目标计算机。", + "loc.input.label.CleanTargetBeforeCopy": "清理目标", + "loc.input.help.CleanTargetBeforeCopy": "将其设置为 true 会在复制文件之前清理目标文件夹。", + "loc.input.label.skipCACheck": "测试证书", + "loc.input.help.skipCACheck": "如果选择了此选项,则在通过安全套接字层超文本传输协议(HTTPS)连接时,客户端将跳过验证服务器证书是否由受信任的证书颁发机构(CA)签署这一步骤。", + "loc.messages.AFC_StorageAccountNotFound": "未找到存储帐户 {0}。选定的服务连接“服务主体”仅支持 Azure 资源管理器类型的存储帐户。", + "loc.messages.AFC_ResourceGroupNotFound": "提供的资源组“{0}”不存在。", + "loc.messages.AFC_GetVMStatus": "[Azure Call]正在获取 VM“{0}”的状态", + "loc.messages.AFC_GetVMStatusComplete": "[Azure Call]已获得 VM“{0}”的状态", + "loc.messages.AFC_GetCustomScriptExtension": "[Azure Call]正在获取 VM“{1}”的自定义脚本扩展“{0}”", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Azure Call]已获得 VM“{1}”的自定义脚本扩展“{0}”", + "loc.messages.AFC_SetCustomScriptExtension": "[Azure Call]正在设置 VM“{1}”的自定义脚本扩展“{0}”", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Azure Call]已设置 VM“{1}”的自定义脚本扩展“{0}”", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Azure Call]正在删除 VM“{1}”的自定义脚本扩展“{0}”", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Azure Call]已删除 VM“{1}”的自定义脚本扩展“{0}”", + "loc.messages.AFC_NoNetworkInterface": "[Azure Call]在资源组 {1} 下,未找到虚拟机 ID 为 {0} 的网络接口", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Azure Call]资源组名称和虚拟机 ID 不应为 null 或空", + "loc.messages.AFC_AzurePSNotInstalled": "未安装 Azure Powershell Cmdlet 所需的最低版本 {0}。可以按照 https://azure.microsoft.com/en-in/documentation/articles/powershell-install-configure/ 中的说明进行操作,以获得最新的 Azure Powershell", + "loc.messages.AFC_ClassicStorageAccountNotFound": "未找到存储帐户 {0}。选定的服务连接“证书”仅支持 Azure 经典类型的存储帐户。", + "loc.messages.AFC_GenericStorageAccountNotFound": "未找到存储帐户 {0}。请指定现有的存储帐户", + "loc.messages.AFC_AzureFileCopyMoreHelp": "有关详细信息,请参阅 {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "正在将文件从源路径“{0}”上传到具有 blob 前缀“{3}”的容器“{2}”中的存储帐户“{1}”", + "loc.messages.AFC_UploadContainerStorageAccount": "上传到存储帐户“{1}”中具有 blob 前缀“{2}”的容器“{0}”失败,出现错误:“{3}”", + "loc.messages.AFC_UploadFileSuccessful": "已成功将文件从源路径“{0}”上传到具有 blob 前缀“{3}”的容器“{2}”中的存储帐户“{1}”", + "loc.messages.AFC_IncorrectTags": "错误地指定了标记。其格式必须为 Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "以下计算机未出现在资源组中,或它们的名称指定错误: {0}。请提供资源组中显示的确实相同的计算机名称。使用逗号将多个计算机名称分隔开。", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "无法获得资源组“{1}”中所有资源的 {0}", + "loc.messages.AFC_MachineNameFromIdError": "无法获得资源组“{2}”中“{1}”资源的 {0}", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "无法使用选定的服务连接“{0}”找到资源“{1}”。选定的服务连接“{0}”仅支持经典资源(服务管理模型)。", + "loc.messages.AFC_NoClassicVMResources": "资源组“{0}”下不存在要复制的计算机。选定的服务连接“{1}”仅支持 Azure 经典类型的虚拟机。", + "loc.messages.AFC_NoARMVMResources": "资源组“{0}”下不存在要复制的计算机。选定的服务连接“{1}”仅支持 Azure 资源管理器类型的虚拟机。", + "loc.messages.AFC_NoGenericVMResources": "资源组“{0}”下不存在要复制的计算机。", + "loc.messages.AFC_FilteringNoVMResources": "具有以下 {1}“{2}”的资源组“{0}”下不存在计算机。", + "loc.messages.AFC_CopyStarted": "计算机“{0}”的复制已开始", + "loc.messages.AFC_CopyCompleted": "复制计算机“{0}”的状态:“{1}”", + "loc.messages.AFC_WinRMHelpMessage": "若要修复 WinRM 服务连接相关的问题,请在任务中选择“启用复制先决条件”选项。如果已经设置,且目标虚拟机由负载均衡器提供支持,请确保为目标端口(5986)配置入站 NAT 规则。仅适用于 ARM VM。", + "loc.messages.AFC_CopyFailed": "在计算机“{0}”上复制失败。有关详细信息,请参阅日志。", + "loc.messages.AFC_ParallelCopyFailed": "复制到一个或多个计算机失败。有关详细信息,请参阅日志。", + "loc.messages.AFC_CopySuccessful": "已成功将文件从源路径“{0}”复制到了资源组“{1}”中的目标 Azure VM", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "对虚拟机“{1}”的自定义脚本扩展“{0}”的设置失败,错误: {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "未能添加网络安全规则: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "无法设置虚拟机“{1}”的自定义脚本扩展“{0}”: {2}", + "loc.messages.AFC_CopyPrereqsFailed": "无法启用复制先决条件。{0}", + "loc.messages.AFC_BlobStorageNotFound": "未找到存储帐户 {0}。请指定现有的存储帐户", + "loc.messages.AFC_RootContainerAndDirectory": "\"/S\" 选项对 $root 容器无效。", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "HTTP 响应代码:“{0}”不是有效的重定向状态代码", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "重定向响应位置标头为 null。", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "将文件上传到 blob 存储时,AzCopy.exe 以非零退出代码退出。", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "无法提取存储帐户密钥。错误: “{0}”", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "请手动卸载 WinRM 自定义脚本,然后重试部署。", + "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", + "loc.messages.UnsupportedAuthScheme": "终结点不支持的身份验证方案 \"{0}\"。", + "loc.messages.ServicePrincipalError": "用于部署的服务主体有错。" +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzureFileCopyV4/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..1c4533cf3db6 --- /dev/null +++ b/_generated/AzureFileCopyV4/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,93 @@ +{ + "loc.friendlyName": "Azure 檔案複製", + "loc.helpMarkDown": "[深入了解此工作](https://aka.ms/azurefilecopyreadme)", + "loc.description": "將檔案複製到 Azure Blob 儲存體或虛擬機器", + "loc.instanceNameFormat": "$(Destination) 檔案複製", + "loc.releaseNotes": "4.0 版的新功能:
   支援 AzCopy.exe 10.8.0 版", + "loc.input.label.SourcePath": "來源", + "loc.input.help.SourcePath": "來源資料夾、本機電腦檔案或 UNC 共用的絕對路徑。運算式應該傳回單一資料夾或檔案。支援在檔案路徑或檔案名稱的任何位置使用萬用字元符號 (*)。", + "loc.input.label.ConnectedServiceNameARM": "Azure 訂用帳戶", + "loc.input.help.ConnectedServiceNameARM": "要作為複製檔案目標的傳統 Azure Resource Manager 訂用帳戶。", + "loc.input.label.Destination": "目的地類型", + "loc.input.help.Destination": "選取目的地,可以是 Azure Blob 或 Azure VM。", + "loc.input.label.StorageAccountRM": "RM 儲存體帳戶", + "loc.input.help.StorageAccountRM": "指定預先存在的 ARM 儲存體帳戶。其也作為將檔案複製到 Azure VM 的中繼項目", + "loc.input.label.ContainerName": "容器名稱", + "loc.input.help.ContainerName": "用於上傳檔案的容器名稱。如果具有指定名稱的容器不存在於指定的儲存體帳戶中,會自動予以建立。
如需在容器內建立虛擬目錄,請使用以下 Blob 前置詞輸入。
範例: 如果您的目標位置是 https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/,則指定 mycontainer 作為容器名稱及指定 vd1/vd2/ 作為 Blob 前置詞。", + "loc.input.label.BlobPrefix": "Blob 前置詞", + "loc.input.help.BlobPrefix": "適用於篩選檔案,例如將組建編號附加到所有 Blob,以只從該組建下載檔案。範例: 如果您將 Blob 前置詞指定為 myvd1,會在容器內建立具有此名稱的虛擬目錄。尾端為 '/' 的 Blob 前置詞會被視為虛擬目錄。否則,除非要複製的項目本身是資料夾,否則它會被視為檔案。來源檔案會複製到 https://myaccount.blob.core.windows.net/mycontainer/myvd1/。", + "loc.input.label.EnvironmentNameRM": "資源群組", + "loc.input.help.EnvironmentNameRM": "要將檔案複製到其中的目標資源群組名稱。", + "loc.input.label.ResourceFilteringMethod": "選取電腦依據 ", + "loc.input.help.ResourceFilteringMethod": "您也可以提供 VM 主機名稱或標記,選擇是否要從資源群組中選取一組 VM。只有透過 Azure Resource Manager 建立的群組才支援 [標記](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/)。", + "loc.input.label.MachineNames": "篩選準則", + "loc.input.help.MachineNames": "提供 VM 主機名稱 (例如 ffweb、ffdb) 或標記 (例如 Role:DB、Web; OS:Win8.1) 的清單。請注意,標記可使用的分隔符號為 , (逗號)、: (冒號) 及 ; (分號)。如有提供多個標記,工作將會在所有具有指定標籤的 VM 上執行。根據預設,將會在所有的 VM 上執行工作。", + "loc.input.label.vmsAdminUserName": "系統管理員登入", + "loc.input.help.vmsAdminUserName": "VM 的系統管理員使用者名稱。", + "loc.input.label.vmsAdminPassword": "密碼", + "loc.input.help.vmsAdminPassword": "VM 的系統管理員密碼。
其可接受組建或發行管線中定義的變數為 '$(passwordVariable)'。
您可將變數標記為 'secret' 來加以保護。", + "loc.input.label.TargetPath": "目的資料夾", + "loc.input.help.TargetPath": "從來源複製檔案時,目標電腦上所需的本機路徑。可使用環境變數,例如 $env:windir\\BudgetIT\\Web。", + "loc.input.label.AdditionalArgumentsForBlobCopy": "選擇性引數 (用於將檔案上傳到 blob)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "上傳至 Blob 要套用的選用 AzCopy.exe 引數,例如 --check-length=true。根據預設,如未在此處指定任何選用引數,即會新增下列選用引數。
--log-level=INFO (如果管線正在偵錯模式中執行,請設定 --log-level=DEBUG),
--recursive (只有當容器名稱不是 $root 時),
--blob-type=PageBlob (只有當指定的儲存體帳戶為進階帳戶時)。", + "loc.input.label.AdditionalArgumentsForVMCopy": "選擇性引數 (用於將檔案下載到 VM)", + "loc.input.help.AdditionalArgumentsForVMCopy": "下載到 VM 時要套用的選用 AzCopy.exe 引數,例如 --check-length=true。根據預設,如未在此處指定任何選用引數,即會新增下列選用引數。
--log-level=INFO (如果管線正在偵錯模式中執行,請設定 --log-level=DEBUG),
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "SAS 權杖到期期限 (分鐘)", + "loc.input.help.sasTokenTimeOutInMinutes": "提供容器 SAS 權杖到期前經過的分鐘數。根據預設,此權杖會在 4 小時後到期。", + "loc.input.label.enableCopyPrerequisites": "啟用複製必要條件", + "loc.input.help.enableCopyPrerequisites": "啟用此選項即可使用自我簽署憑證,透過連接埠 5986 上的 HTTPS 通訊協定來設定 Windows 遠端管理 (WinRM) 接聽程式。必須要有此設定,才能在 Azure 機器上執行複製作業。若目標虛擬機器受 Load Balancer 支援,請確認已設定目標連接埠 (5986) 的輸入 NAT 規則。僅適用於 ARM VM。", + "loc.input.label.CopyFilesInParallel": "平行複製", + "loc.input.help.CopyFilesInParallel": "若將其設定為 Ture,檔案會平行複製到目標電腦。", + "loc.input.label.CleanTargetBeforeCopy": "清除目標", + "loc.input.help.CleanTargetBeforeCopy": "若將其設定為 Ture,將會在複製檔案前先清除目的資料夾。", + "loc.input.label.skipCACheck": "測試憑證", + "loc.input.help.skipCACheck": "若選取此選項,用戶端會在透過超文字安全傳輸通訊協定 (HTTPS) 連線時,略過驗證伺服器憑證是否已經由信任的憑證授權單位 (CA) 簽署。", + "loc.messages.AFC_StorageAccountNotFound": "找不到儲存體帳戶: {0}。選取的服務連線 'Service Principal' 僅支援 Azure Resource Manager 類型的儲存體帳戶。", + "loc.messages.AFC_ResourceGroupNotFound": "提供的資源群組 '{0}' 不存在。", + "loc.messages.AFC_GetVMStatus": "[Azure 呼叫]正在取得 VM '{0}' 的狀態", + "loc.messages.AFC_GetVMStatusComplete": "[Azure 呼叫]已取得 VM '{0}' 的狀態", + "loc.messages.AFC_GetCustomScriptExtension": "[Azure 呼叫]正在取得 VM '{1}' 的自訂指令碼擴充功能 '{0}'", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Azure 呼叫]已取得 VM '{1}' 的自訂指令碼擴充功能 '{0}'", + "loc.messages.AFC_SetCustomScriptExtension": "[Azure 呼叫]正在設定 VM '{1}' 的自訂指令碼擴充功能 '{0}'", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Azure 呼叫]設定 VM '{1}' 的自訂指令碼擴充功能 '{0}'", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Azure 呼叫]正在移除 VM '{1}' 的自訂指令碼擴充功能 '{0}'", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Azure 呼叫]已移除 VM '{1}' 的自訂指令碼擴充功能 '{0}'", + "loc.messages.AFC_NoNetworkInterface": "[Azure 呼叫]資源群組 {1} 下找不到虛擬機器識別碼為 {0} 的網路介面", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Azure 呼叫]資源群組名稱及虛擬機器識別碼不應為 null 或空白", + "loc.messages.AFC_AzurePSNotInstalled": "未安裝 Azure Powershell Cmdlet 要求的最低版本 {0}。您可以遵循下方網址中的指示取得最新 Azure Powershell: https://azure.microsoft.com/zh-tw/documentation/articles/powershell-install-configure/", + "loc.messages.AFC_ClassicStorageAccountNotFound": "找不到儲存體帳戶: {0}。選取的服務連線 'Certificate' 僅支援 Azure 傳統類型的儲存體帳戶。", + "loc.messages.AFC_GenericStorageAccountNotFound": "找不到儲存體帳戶: {0}。請指定現有的儲存體帳戶", + "loc.messages.AFC_AzureFileCopyMoreHelp": "如需詳細資訊,請參閱 {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "正在將檔案從來源路徑 '{0}' 上傳到儲存體帳戶 '{1}' 之 Blob 前置詞為 '{3}' 的容器 '{2}' 中", + "loc.messages.AFC_UploadContainerStorageAccount": "上傳到儲存體帳戶 '{1}' 中 Blob 前置詞為 '{2}' 的容器 '{0}' 失敗。錯誤: '{3}'", + "loc.messages.AFC_UploadFileSuccessful": "已成功將檔案從來源路徑 '{0}' 上傳到儲存體帳戶 '{1}' 之 Blob 前置詞為 '{3}' 的容器 '{2}' 中", + "loc.messages.AFC_IncorrectTags": "未正確指定標記。標記的格式必須為 Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "下列機器不存在於資源群組中,或未正確指定其名稱: {0}。請提供與資源群組中所顯示的機器名稱完全相同者。請使用逗號分隔多個機器名稱。", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "無法為 ResourceGroup 中的所有資源取得 {0}: '{1}'", + "loc.messages.AFC_MachineNameFromIdError": "無法為 ResourceGroup 中的 '{1}' 項資源取得 {0}: '{2}'", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "使用選取的服務連線 '{0}' 找不到資源 '{1}'。選取的服務連線 '{0}' 僅支援傳統資源 (服務管理模型)。", + "loc.messages.AFC_NoClassicVMResources": "資源群組 '{0}' 下沒有任何機器可複製。選取的服務連線 '{1}' 僅支援 Azure 傳統類型的虛擬機器。", + "loc.messages.AFC_NoARMVMResources": "資源群組 '{0}' 下沒有任何機器可複製。選取的服務連線 '{1}' 僅支援 Azure Resource Manager 類型的虛擬機器。", + "loc.messages.AFC_NoGenericVMResources": "資源群組: '{0}' 下沒有任何機器可複製。", + "loc.messages.AFC_FilteringNoVMResources": "資源群組: '{0}' 下沒有任何機器具有下列 {1} '{2}'。", + "loc.messages.AFC_CopyStarted": "開始電腦的複製: '{0}'", + "loc.messages.AFC_CopyCompleted": "複製電腦 '{0}' 的狀態: '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "若要修正 WinRM 服務連線相關問題,請在工作中選取 [啟用複製必要條件] 選項。若已設定,且負載平衡器支援目標虛擬機器,請確認已為目標連接埠 (5986) 設定傳入 NAT 規則。僅適用於 ARM VM。", + "loc.messages.AFC_CopyFailed": "機器 '{0}' 上的複製失敗。如需詳細資料,請參閱記錄檔。", + "loc.messages.AFC_ParallelCopyFailed": "無法複製到一或多部機器。如需詳細資料,請參閱記錄檔。", + "loc.messages.AFC_CopySuccessful": "已成功從來源路徑 '{0}' 將檔案複製到資源群組 '{1}' 中的目標 Azure VM", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "為虛擬機器 '{1}' 設定自訂指令碼擴充功能 '{0}' 失敗,發生錯誤: {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "無法新增網路安全性規則: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "無法為虛擬機器 '{1}' 設定自訂指令碼擴充功能 '{0}': {2}", + "loc.messages.AFC_CopyPrereqsFailed": "無法啟用複製必要條件。{0}", + "loc.messages.AFC_BlobStorageNotFound": "找不到儲存體帳戶: {0}。請指定現有的儲存體帳戶", + "loc.messages.AFC_RootContainerAndDirectory": "'/S' 選項對 $root 容器而言無效。", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "HTTP 回應碼: '{0}' 不是有效的重新導向狀態碼", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "重新導向回應位置標頭為 null。", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "將檔案上傳至 Blob 儲存體時 AzCopy.exe 已結束,結束代碼不為零。", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "無法擷取儲存體帳戶金鑰。錯誤: '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "請手動將 WinRM 自訂指令碼解除安裝,並重試部署。", + "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", + "loc.messages.UnsupportedAuthScheme": "端點不支援驗證配置 '{0}'。", + "loc.messages.ServicePrincipalError": "部署用的服務主體有錯誤。" +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0.ts b/_generated/AzureFileCopyV4/Tests/L0.ts new file mode 100644 index 000000000000..b555f8259cb8 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0.ts @@ -0,0 +1,106 @@ +/// +/// +/// + +import Q = require('q'); +import assert = require('assert'); +import path = require('path'); + +var psm = require('../../../Tests/lib/psRunner'); +var psr = null; + +describe('AzureFileCopy Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + before((done) => { + if (psm.testSupported()) { + psr = new psm.PSRunner(); + psr.start(); + } + done(); + }); + + after(function () { + if (psr) { + psr.kill(); + } + }); + + if (psm.testSupported()) { + it('Validate AzureFileCopy.Utility Get-AzureUtility', (done) => { + psr.run(path.join(__dirname, 'L0GetAzureUtility.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Validate-AzurePowershellVersion', (done) => { + psr.run(path.join(__dirname, 'L0ValidateAzurePSVersion.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-StorageKey', (done) => { + psr.run(path.join(__dirname, 'L0GetStorageKey.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-StorageAccountType', (done) => { + psr.run(path.join(__dirname, 'L0GetStorageAccountType.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-blobStorageEndpoint', (done) => { + psr.run(path.join(__dirname, 'L0GetblobStorageEndpoint.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-StorageKey', (done) => { + psr.run(path.join(__dirname, 'L0UtilityThrowError.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Upload-FilesToAzureContainer', (done) => { + psr.run(path.join(__dirname, 'L0UploadFilesToAzureContainer.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Does-AzureVMMatchTagFilterCriteria', (done) => { + psr.run(path.join(__dirname, 'L0DoesAzureVMMatchTagFilter.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-TagBasedFilteredAzureVMs', (done) => { + psr.run(path.join(__dirname, 'L0GetTagBasedFilteredAzureVMs.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-MachineBasedFilteredAzureVMs', (done) => { + psr.run(path.join(__dirname, 'L0GetMachineBasedFilteredAzureVMs.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-FilteredAzureVMsInResourceGroup', (done) => { + psr.run(path.join(__dirname, 'L0GetFilteredAzureVmsInResourceGroup.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-FilteredAzureRMVMsInResourceGroup', (done) => { + psr.run(path.join(__dirname, 'L0GetFilteredAzureRMVmsInResourceGroup.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-MachineNameFromId', (done) => { + psr.run(path.join(__dirname, 'L0GetMachineNameFromId.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-MachinesFqdnsForLB', (done) => { + psr.run(path.join(__dirname, 'L0GetMachinesFqdnForLB.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-FrontEndPorts', (done) => { + psr.run(path.join(__dirname, 'L0GetFrontEndPorts.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-AzureRMVMsConnectionDetailsInResourceGroup', (done) => { + psr.run(path.join(__dirname, 'L0GetRMVMConnectionDetailsInRG.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-AzureVMResourcesProperties', (done) => { + psr.run(path.join(__dirname, 'L0GetAzureVMResourcesProperties.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-AzureVMsCredentials', (done) => { + psr.run(path.join(__dirname, 'L0GetAzureVMsCredentials.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Copy-FilesParallelyToAzureVMs', (done) => { + psr.run(path.join(__dirname, 'L0CopyFilesParallelyToAzureVMs.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Copy-FilesToAzureVMsFromStorageContainer', (done) => { + psr.run(path.join(__dirname, 'L0CopyFilesToAzureVMsFromStorageContainer.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Validate-CustomScriptExecutionStatus', (done) => { + psr.run(path.join(__dirname, 'L0ValidateCustomScriptExecutionStatus.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Add-AzureVMCustomScriptExtension', (done) => { + psr.run(path.join(__dirname, 'L0AddAzureVMCustomScriptExtension.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Is-WinRMCustomScriptExtensionExists', (done) => { + psr.run(path.join(__dirname, 'L0IsWinRMCustomScriptExtensionExists.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Copy-FilesSequentiallyToAzureVMs', (done) => { + psr.run(path.join(__dirname, 'L0CopyFilesSequentiallyToAzureVMs.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Check-ContainerNameAndArgs', (done) => { + psr.run(path.join(__dirname, 'L0CheckContainerNameAndArgs.ps1'), done); + }); + } +}); diff --git a/_generated/AzureFileCopyV4/Tests/L0AddAzureVMCustomScriptExtension.ps1 b/_generated/AzureFileCopyV4/Tests/L0AddAzureVMCustomScriptExtension.ps1 new file mode 100644 index 000000000000..807b1a875a4b --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0AddAzureVMCustomScriptExtension.ps1 @@ -0,0 +1,68 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Write-Telemetry { } +Register-Mock Get-TargetUriFromFwdLink { "http://externalFile" } + +# Test 1 "Should throw Resource group name is null" +Assert-Throws { + Add-AzureVMCustomScriptExtension -resourceGroupName $null -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName +} -MessagePattern "AFC_CopyPrereqsFailed *" + + +# Test 2 "Should throw when VM name is null" +Assert-Throws { + Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $null -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName +} -MessagePattern "AFC_CopyPrereqsFailed *" + +# Test 3 "should throw when VM name is invalid" +Register-Mock Get-Endpoint {} +Assert-Throws { + Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $invalidMachineName -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName +} -MessagePattern "AFC_CopyPrereqsFailed AFC_UnableToSetCustomScriptExtension *" + +# Test 4 "Should fail to provision winrm custom script extension and remove the failed extension" +$extensionName="WinRMCustomScriptExtension" +Register-Mock Set-AzureMachineCustomScriptExtension { + return Set-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName -fileUri $configWinRMScriptFile, $makeCertFile -run $invalidCustomScriptName -argument $dnsName -location $location +} -ParametersEvaluator { $run -eq $scriptToRun } + +Assert-Throws { + Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName +} -MessagePattern "AFC_CopyPrereqsFailed *" + +Assert-AreEqual 0 $vmInstanceViews[$vm0Name]["Extensions"].Count + +# Test 5 "Should fail to deploy winrm custom script extension and remove the failed extension" +$extensionName="WinRMCustomScriptExtension" +Unregister-Mock Set-AzureMachineCustomScriptExtension +Register-Mock Set-AzureMachineCustomScriptExtension { + return Set-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName -fileUri $configWinRMScriptFile, $makeCertFile -run $invalidCustomScriptName -argument $dnsName -location $location +} -ParametersEvaluator { $run -eq $scriptToRun } + +Assert-Throws { + Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName +} -MessagePattern "AFC_CopyPrereqsFailed *" + +Assert-AreEqual 0 $vmInstanceViews[$vm0Name]["Extensions"].Count + +# Test 6 "Should configure winrm successfully on target azure vm for valid Input" +Unregister-Mock Set-AzureMachineCustomScriptExtension +Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName +$tempStatus = Get-AzureMachineStatus -resourceGroupName $validRG -name $vm0Name +$tempStatus.Extensions.Statuses.DisplayStatus.Contains("Provisioning succeeded"); + +# Test 7 "Should skip configuring winrm on target azure vm" +Register-Mock Set-AzureMachineCustomScriptExtension { return $null } +Register-Mock Is-WinRMCustomScriptExtensionExists { return $true } +Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName + +Assert-WasCalled Set-AzureMachineCustomScriptExtension -Times 0 + +#Clean the extension +$vmInstanceViews[$vm0Name]["Extensions"]=@() \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0CheckContainerNameAndArgs.ps1 b/_generated/AzureFileCopyV4/Tests/L0CheckContainerNameAndArgs.ps1 new file mode 100644 index 000000000000..0b00285d6200 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0CheckContainerNameAndArgs.ps1 @@ -0,0 +1,15 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\..\Utility.ps1 + +Register-Mock Write-Warning { } + +Check-ContainerNameAndArgs -containerName '$root' -additionalArguments " --recursive " +Check-ContainerNameAndArgs -containerName '$root' -additionalArguments " --recursive --log-level=ERROR " +Check-ContainerNameAndArgs -containerName '$root' -additionalArguments " --recursive --log-level=ERROR" + +Assert-WasCalled Write-Warning -Times 3 + +Unregister-Mock Write-Warning \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0CopyFilesParallelyToAzureVMs.ps1 b/_generated/AzureFileCopyV4/Tests/L0CopyFilesParallelyToAzureVMs.ps1 new file mode 100644 index 000000000000..2f35bd2e381b --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0CopyFilesParallelyToAzureVMs.ps1 @@ -0,0 +1,34 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vmName = "myVM0" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$vmWinRMHttpsPort1 = '40001' +$vmWinRMHttpsPort2 = '40003' +$vmWinRMHttpsPort3 = '40005' +$azureVMsProperties = Get-AzureVMResourcesProperties -resourceGroupName $validRG -resourceFilteringMethod 'tags' +$azureVMCredntials = Get-AzureVMsCredentials -vmsAdminUserName $validInputVmsAdminUserName -vmsAdminPassword $validInputVmsAdminPassword + +Register-Mock ConvertTo-SecureString { return $securedMockPassword } +$invokeRemoteScriptParams = Get-InvokeRemoteScriptParameters -azureVMResourcesProperties $azureVMsProperties -networkCredentials $azureVMCredntials + +# Test 1 "Should throw if failed on one vm and passed on other vm" + +Register-Mock Invoke-RemoteScript { return $invokeRemoteScriptOnePassOneFailResponse } + +Assert-Throws { + Copy-FilesParallellyToAzureVMs -targetMachineNames $invokeRemoteScriptParams.targetMachineNames -credential $invokeRemoteScriptParams.credential -protocol $invokeRemoteScriptParams.protocol -sessionName "AFCCopyToVMs" -remoteScriptJobArguments @{} -sessionOption $invokeRemoteScriptParams.sessionOption +} -MessagePattern "AFC_ParallelCopyFailed*" + +# Test 2 "Should not throw if copy passed on both vms" + +Unregister-Mock Invoke-RemoteScript +Register-Mock Invoke-RemoteScript { return $invokeRemoteScriptAllPassedResponse } + +Copy-FilesParallellyToAzureVMs -targetMachineNames $invokeRemoteScriptParams.targetMachineNames -credential $invokeRemoteScriptParams.credential -protocol $invokeRemoteScriptParams.protocol -sessionName "AFCCopyToVMs" -remoteScriptJobArguments @{} -sessionOption $invokeRemoteScriptParams.sessionOption diff --git a/_generated/AzureFileCopyV4/Tests/L0CopyFilesSequentiallyToAzureVMs.ps1 b/_generated/AzureFileCopyV4/Tests/L0CopyFilesSequentiallyToAzureVMs.ps1 new file mode 100644 index 000000000000..5f5cdb928f8f --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0CopyFilesSequentiallyToAzureVMs.ps1 @@ -0,0 +1,30 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vmName = "myVM0" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$vmWinRMHttpsPort = '40003' +$azureVMsProperties = Get-AzureVMResourcesProperties -resourceGroupName $validRG -resourceFilteringMethod 'tags' +$azureVMCredntials = Get-AzureVMsCredentials -vmsAdminUserName $validInputVmsAdminUserName -vmsAdminPassword $validInputVmsAdminPassword + +Register-Mock ConvertTo-SecureString { return $securedMockPassword } +$invokeRemoteScriptParams = Get-InvokeRemoteScriptParameters -azureVMResourcesProperties $azureVMsProperties -networkCredentials $azureVMCredntials + +Register-Mock Invoke-RemoteScript { return $invokeRemoteScriptFailedResponse } + +# Test 1 "Should throw if failed on one vm" +Assert-Throws { + Copy-FilesSequentiallyToAzureVMs -targetMachineNames $invokeRemoteScriptParams.targetMachineNames -credential $invokeRemoteScriptParams.credential -protocol $invokeRemoteScriptParams.protocol -sessionName "AFCCopyToVMs" -remoteScriptJobArguments @{} -sessionOption $invokeRemoteScriptParams.sessionOption +} -MessagePattern "AFC_CopyFailed $vmfqdn`:$vmWinRMHttpsPort AFC_AzureFileCopyMoreHelp*" + +# Test 2 "Should not throw if copy succeded on both vms" +Unregister-Mock Invoke-RemoteScript +Register-Mock Invoke-RemoteScript { return $invokeRemoteScriptPassedResponse } + +Copy-FilesSequentiallyToAzureVMs -targetMachineNames $invokeRemoteScriptParams.targetMachineNames -credential $invokeRemoteScriptParams.credential -protocol $invokeRemoteScriptParams.protocol -sessionName "AFCCopyToVMs" -remoteScriptJobArguments @{} -sessionOption $invokeRemoteScriptParams.sessionOption \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0CopyFilesToAzureVMsFromStorageContainer.ps1 b/_generated/AzureFileCopyV4/Tests/L0CopyFilesToAzureVMsFromStorageContainer.ps1 new file mode 100644 index 000000000000..290e7b4ee467 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0CopyFilesToAzureVMsFromStorageContainer.ps1 @@ -0,0 +1,61 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\..\AzureFileCopyRemoteJob.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$azureVMsProperties = Get-AzureVMResourcesProperties -resourceGroupName $validRG -resourceFilteringMethod 'tags' +$azureVMCredntials = Get-AzureVMsCredentials -vmsAdminUserName $validInputVmsAdminUserName -vmsAdminPassword $validInputVmsAdminPassword + +Register-Mock Get-ChildItem { } + +Register-Mock Copy-FilesParallellyToAzureVMs { } +Register-Mock Copy-FilesSequentiallyToAzureVMs { } + +Register-Mock ConvertTo-SecureString { return $securedMockPassword } +$invokeRemoteScriptParams = Get-InvokeRemoteScriptParameters -azureVMResourcesProperties $azureVMsProperties -networkCredentials $azureVMCredntials + +# Test 1 "Should Call Copy-FilesParallellyToAzureVMs for parallel option" +Copy-FilesToAzureVMsFromStorageContainer -targetMachineNames $invokeRemoteScriptParams.targetMachineNames -credential $invokeRemoteScriptParams.credential ` + -protocol $invokeRemoteScriptParams.protocol ` + -sessionOption $invokeRemoteScriptParams.sessionOption ` + -blobStorageEndpoint $validBlobStorageEndpoint ` + -containerName $validInputContainerName ` + -containerSasToken $validSasToken ` + -targetPath $validInputTargetPath ` + -cleanTargetBeforeCopy $false ` + -copyFilesInParallel $true ` + -additionalArguments "" ` + -azCopyToolLocation "AzCopy" ` + -fileCopyJobScript $AzureFileCopyRemoteJob ` + -enableDetailedLogging $false + + +Assert-WasCalled Copy-FilesParallellyToAzureVMs -Times 1 +Assert-WasCalled Copy-FilesSequentiallyToAzureVMs -Times 0 + + +# Test 2 "should call Copy-FilesSequentiallyToAzureVMs for sequential option" +Copy-FilesToAzureVMsFromStorageContainer -targetMachineNames $invokeRemoteScriptParams.targetMachineNames -credential $invokeRemoteScriptParams.credential ` + -protocol $invokeRemoteScriptParams.protocol ` + -sessionOption $invokeRemoteScriptParams.sessionOption ` + -blobStorageEndpoint $validBlobStorageEndpoint ` + -containerName $validInputContainerName ` + -containerSasToken $validSasToken ` + -targetPath $validInputTargetPath ` + -cleanTargetBeforeCopy $false ` + -copyFilesInParallel $false ` + -additionalArguments "" ` + -azCopyToolLocation "AzCopy" ` + -fileCopyJobScript $AzureFileCopyRemoteJob ` + -enableDetailedLogging $false + + +Unregister-Mock Copy-FilesParallellyToAzureVMs +Register-Mock Copy-FilesParallellyToAzureVMs { } + +Assert-WasCalled Copy-FilesParallellyToAzureVMs -Times 0 +Assert-WasCalled Copy-FilesSequentiallyToAzureVMs -Times 1 \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0DoesAzureVMMatchTagFilter.ps1 b/_generated/AzureFileCopyV4/Tests/L0DoesAzureVMMatchTagFilter.ps1 new file mode 100644 index 000000000000..a9debca28daa --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0DoesAzureVMMatchTagFilter.ps1 @@ -0,0 +1,33 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Write-Telemetry { } +Register-Mock Switch-AzureMode { } + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG +$azureVMResource1 = $azureRMVMResources[0] +$validTagFilterForVMResource1 = "role:test" +$azureVMResource2 = $azureRMVMResources[1] + +# Test 1 "should return true if vm match tag filter criteria with case insensitive check" +$vmMatchFilterCriteria = Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource1 -filter "Role:TEST, Test1" +Assert-AreEqual $true $vmMatchFilterCriteria + +# Test 2 "should return true if vm match tag filter criteria with same tag repeated twice" +$vmMatchFilterCriteria = Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource2 -filter "OS:win8, win9; Role:myTEST, MYTest, Test1" +Assert-AreEqual $true $vmMatchFilterCriteria + +# Test 3 "should return false if vm does not match tag filter criteria" +$vmMatchFilterCriteria = Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource2 -filter "OS:win8, win9; Role:Test5, Test2, Test1" +Assert-AreEqual $false $vmMatchFilterCriteria + +# Test 4 "Should throw if invalid tag filter format" +Assert-Throws { + Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource2 -filter "OS:win8 : win9; Role:myTEST, MYTest, Test1" +} -MessagePattern "AFC_IncorrectTags" \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0GetAzureUtility.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetAzureUtility.ps1 new file mode 100644 index 000000000000..63e805152ca2 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetAzureUtility.ps1 @@ -0,0 +1,26 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +$azModule100 = New-Object -TypeName System.Version -ArgumentList "1.0.0" +$connectedServiceName = "DummyConnectedServiceName" + +Register-Mock Get-TypeOfConnection { return "ServicePrincipal"} + +. $PSScriptRoot\..\Utility.ps1 + +#Test 1 "Should return AzureUtilityAz1.0.ps1 if Az module is installed" +Register-Mock Get-Module { return $azModule100 } +$azureUtilityFile = Get-AzureUtility +Assert-AreEqual $azureUtilityFile "AzureUtilityAz1.0.ps1" + +#Test 2 "Should return AzureUtilityARM.ps1 Az module is not installed" +Unregister-Mock Get-Module +Register-Mock Get-Module { return } +$azureUtilityFile = Get-AzureUtility -connectedServiceName $connectedServiceName +if ($featureFlags.retireAzureRM) { + Assert-AreEqual $azureUtilityFile "AzureUtilityAz1.0.ps1" +} else { + Assert-AreEqual $azureUtilityFile "AzureUtilityARM.ps1" +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0GetAzureVMResourcesProperties.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetAzureVMResourcesProperties.ps1 new file mode 100644 index 000000000000..da1b2c8d3d87 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetAzureVMResourcesProperties.ps1 @@ -0,0 +1,31 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Write-Telemetry { } + +# Test 1 "should throw if no azurevm resources" +Assert-Throws { + Get-AzureVMResourcesProperties -resourceGroupName $rgWithNoVM -resourceFilteringMethod 'tags' +} -MessagePattern "AFC_NoARMVMResources*" + +# Test 2 "should return azureVM resources if valid input given" +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vmName = "myVM0" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$vmWinRMHttpsPort = '40001' + +$response = Get-AzureVMResourcesProperties -resourceGroupName $validRG -resourceFilteringMethod 'tags' + +Assert-IsNotNullOrEmpty $response +Assert-AreEqual 3 $response.Count + +$resource = $response[$vmName] + +Assert-AreEqual $vmName $resource.Name +Assert-AreEqual $vmfqdn $resource.fqdn +Assert-AreEqual $vmWinRMHttpsPort $resource.winRMHttpsPort \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0GetAzureVMsCredentials.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetAzureVMsCredentials.ps1 new file mode 100644 index 000000000000..584df180c0a8 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetAzureVMsCredentials.ps1 @@ -0,0 +1,16 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$userName = "userName" +$password = "password" + +# Test 1 "Should return System.Net.NetworkCredential with valid values" +$result = Get-AzureVMsCredentials -vmsAdminUserName $userName -vmsAdminPassword $password +Assert-AreEqual "System.Net.NetworkCredential" $result.GetType().FullName +Assert-AreEqual $userName $result.userName +Assert-AreEqual $password $result.Password \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0GetFilteredAzureRMVmsInResourceGroup.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetFilteredAzureRMVmsInResourceGroup.ps1 new file mode 100644 index 000000000000..73674a2f40d7 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetFilteredAzureRMVmsInResourceGroup.ps1 @@ -0,0 +1,19 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG + +Register-Mock Get-FilteredAzureVMsInResourceGroup {} + +# Test 1 "should call Get-FilteredAzureVMsInResourceGroup with proper paramters" +Get-FilteredAzureRMVMsInResourceGroup -azureRMVMResources $azureRMVMResources -resourceFilteringMethod "tags" -filter "" +Assert-WasCalled Get-FilteredAzureVMsInResourceGroup -Times 1 -ParametersEvaluator { + $resourceFilteringMethod -eq "tags"-and $filter -eq "" -and $azureVMResources.Count -eq $azureRMVMResources.Count +} diff --git a/_generated/AzureFileCopyV4/Tests/L0GetFilteredAzureVmsInResourceGroup.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetFilteredAzureVmsInResourceGroup.ps1 new file mode 100644 index 000000000000..987c1cbe2fac --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetFilteredAzureVmsInResourceGroup.ps1 @@ -0,0 +1,27 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Write-Telemetry {} + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG + +# Test 1 "should call tag filter if machineNames filter selected and no filter provided" +$filteredAzureVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureRMVMResources -resourceFilteringMethod "machineNames" -filter "" +Assert-AreEqual 3 $filteredAzureVMResources.Count + +# Test 2 "should call tag filter when tags filter selected and non-empty filter provided" +$filteredAzureVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureRMVMResources -resourceFilteringMethod "tags" -filter "role:web" +Assert-AreEqual 0 $filteredAzureVMResources.Count + +Register-Mock Get-MachineBasedFilteredAzureVMs { } + +# Test 3 "should call Get-MachineBasedFilteredAzureVMs for machineNames filter with non-empty filter" +$filteredAzureVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureRMVMResources -resourceFilteringMethod "machineNames" -filter "vm0" +Assert-AreEqual 0 $filteredAzureVMResources.Count diff --git a/_generated/AzureFileCopyV4/Tests/L0GetFrontEndPorts.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetFrontEndPorts.ps1 new file mode 100644 index 000000000000..3a5fd3bcaa77 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetFrontEndPorts.ps1 @@ -0,0 +1,34 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$winrmPort1 = "40001" +$winrmPort2 = "40003" +$winrmPort3 = "40005" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG +$azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetails -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources +$networkInterfaceResources = $azureRGResourcesDetails["networkInterfaceResources"] +$publicIPAddressResources = $azureRGResourcesDetails["publicIPAddressResources"] +$loadBalancerResources = $azureRGResourcesDetails["loadBalancerResources"] + +# Test 1 "It should valid portList if RG deployed successfully" +[hashtable]$winRMHttpsPortMap = @{} +foreach($lbName in $loadBalancerResources.Keys){ + $lbDetails = $loadBalancerResources[$lbName] + $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"] + $inboundRules = $lbDetails["inboundRules"] + $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources -inboundRules $inboundRules + + Assert-AreEqual $true $winRMHttpsPortMap.ContainsKey($azureRMVMResources[0].Id) + Assert-AreEqual $winrmPort1 $winRMHttpsPortMap[$azureRMVMResources[0].Id] + + Assert-AreEqual $true $winRMHttpsPortMap.ContainsKey($azureRMVMResources[1].Id) + Assert-AreEqual $winrmPort2 $winRMHttpsPortMap[$azureRMVMResources[1].Id] +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0GetMachineBasedFilteredAzureVMs.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetMachineBasedFilteredAzureVMs.ps1 new file mode 100644 index 000000000000..694e04918a38 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetMachineBasedFilteredAzureVMs.ps1 @@ -0,0 +1,30 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Write-Telemetry {} + +$rgWithClassicVMs = "taskplatformtesttwovm" +$classicvm0 = "vm0" +$classicvm1 = "VM1" +$azureClassicVMResources = Get-AzureClassicVMsInResourceGroup -resourceGroupName $rgWithClassicVMs + +# Test 1 "should return all vms corresponding to filter with case insensitive check" +$filteredAzureVMResources = Get-MachineBasedFilteredAzureVMs -azureVMResources $azureClassicVMResources -resourceFilteringMethod "machineNames" -filter "vM0, Vm1" +Assert-AreEqual 2 $filteredAzureVMResources.Count + +# Test 2 "should return only one vm corresponding to its filter even if filter is repeated more than once" +$filteredAzureVMResources = Get-MachineBasedFilteredAzureVMs -azureVMResources $azureClassicVMResources -resourceFilteringMethod "machineNames" -filter "vM0, VM0, vm0" +Assert-AreEqual 1 $filteredAzureVMResources.Count + +$nonExistingFilter = "vm2" + +# Test 3 "Should throw if for any filter there is not corresponding vm" +Assert-Throws { + $filteredAzureVMResources = Get-MachineBasedFilteredAzureVMs -azureVMResources $azureClassicVMResources -resourceFilteringMethod "machineNames" -filter "$nonExistingFilter, Vm1" +} -MessagePattern "AFC_MachineDoesNotExist vm2" diff --git a/_generated/AzureFileCopyV4/Tests/L0GetMachineNameFromId.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetMachineNameFromId.ps1 new file mode 100644 index 000000000000..8e47c1e82e23 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetMachineNameFromId.ps1 @@ -0,0 +1,91 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vm0Name = "myVM0" +$vm1Name = "mytestVM0" +$vm2Name = "mytestPTVM0" +$winrmPort1 = "40001" +$winrmPort2 = "40003" +$winrmPort3 = "40005" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG +$azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetails -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources +$networkInterfaceResources = $azureRGResourcesDetails["networkInterfaceResources"] +$publicIPAddressResources = $azureRGResourcesDetails["publicIPAddressResources"] +$loadBalancerResources = $azureRGResourcesDetails["loadBalancerResources"] + +[hashtable]$fqdnMap = @{} +[hashtable]$winRMHttpsPortMap = @{} +foreach($lbName in $loadBalancerResources.Keys) +{ + $lbDetails = $loadBalancerResources[$lbName] + $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"] + $inboundRules = $lbDetails["inboundRules"] + + $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $validRG -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap + $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources -inboundRules $inboundRules +} +# Test 1 "should create valid map for map parameter FQDN" +$fqdnMap = Get-MachineNameFromId -resourceGroupName $validRG -Map $fqdnMap -MapParameter "FQDN" -azureRMVMResources $azureRMVMResources -ThrowOnTotalUnavaialbility $true + +Assert-AreEqual $true $fqdnMap.ContainsKey($vm0Name) +Assert-AreEqual $vmfqdn $fqdnMap[$vm0Name] +Assert-AreEqual $true $fqdnMap.ContainsKey($vm1Name) + +# Test 2 "should create valid map for map parameter Front End port" +$winRMHttpsPortMap = Get-MachineNameFromId -Map $winRMHttpsPortMap -MapParameter "Front End port" -azureRMVMResources $azureRMVMResources -ThrowOnTotalUnavaialbility $false + +Assert-AreEqual $true $winRMHttpsPortMap.ContainsKey($vm0Name) +Assert-AreEqual $winrmPort1 $winRMHttpsPortMap[$vm0Name] +Assert-AreEqual $true $winRMHttpsPortMap.ContainsKey($vm1Name) +Assert-AreEqual $winrmPort2 $winRMHttpsPortMap[$vm1Name] + + +# Test 3 "It should return partial map if for not all resources map is not configured properly" + +[hashtable]$fqdnMap = @{} +[hashtable]$winRMHttpsPortMap = @{} +foreach($lbName in $loadBalancerResources.Keys) +{ + $lbDetails = $loadBalancerResources[$lbName] + $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"] + $inboundRules = $lbDetails["inboundRules"] + + $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $validRG -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap + $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources -inboundRules $inboundRules +} +$fqdnMap.Remove($azureRMVMResources[0].Id) + +$fqdnMap = Get-MachineNameFromId -resourceGroupName $validRG -Map $fqdnMap -MapParameter "FQDN" -azureRMVMResources $azureRMVMResources -ThrowOnTotalUnavaialbility $true + +Assert-AreEqual $false $fqdnMap.ContainsKey($vm0Name) +Assert-AreEqual $true $fqdnMap.ContainsKey($vm1Name) +Assert-AreEqual $vmfqdn $fqdnMap[$vm1Name] + +# Test 4 "throw error if no resource is available and ThrowOnTotalUnavailability is set to true" + +[hashtable]$fqdnMap = @{} +[hashtable]$winRMHttpsPortMap = @{} +foreach($lbName in $loadBalancerResources.Keys) +{ + $lbDetails = $loadBalancerResources[$lbName] + $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"] + $inboundRules = $lbDetails["inboundRules"] + + $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $validRG -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap + $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources -inboundRules $inboundRules +} +$fqdnMap.Remove($azureRMVMResources[0].Id) +$fqdnMap.Remove($azureRMVMResources[1].Id) +$fqdnMap.Remove($azureRMVMResources[2].Id) + +Assert-Throws { + $fqdnMap = Get-MachineNameFromId -resourceGroupName $validRG -Map $fqdnMap -MapParameter "FQDN" -azureRMVMResources $azureRMVMResources -ThrowOnTotalUnavailability $true +} -MessagePattern "AFC_MachineNameFromIdErrorAllResources*" diff --git a/_generated/AzureFileCopyV4/Tests/L0GetMachinesFqdnForLB.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetMachinesFqdnForLB.ps1 new file mode 100644 index 000000000000..df9b520cca4d --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetMachinesFqdnForLB.ps1 @@ -0,0 +1,31 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG +$azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetails -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources +$networkInterfaceResources = $azureRGResourcesDetails["networkInterfaceResources"] +$publicIPAddressResources = $azureRGResourcesDetails["publicIPAddressResources"] +$loadBalancerResources = $azureRGResourcesDetails["loadBalancerResources"] +[hashtable]$fqdnMap = @{} + +# Test 1 "It should valid fqdnMap if RG deployed successfully" +foreach($lbName in $loadBalancerResources.Keys) { + $lbDetails = $loadBalancerResources[$lbName] + $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"] + $inboundRules = $lbDetails["inboundRules"] + $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $validRG -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap + + Assert-AreEqual $true $fqdnMap.ContainsKey($azureRMVMResources[0].Id) + Assert-AreEqual $vmfqdn $fqdnMap[$azureRMVMResources[0].Id] + + Assert-AreEqual $true $fqdnMap.ContainsKey($azureRMVMResources[1].Id) + Assert-AreEqual $vmfqdn $fqdnMap[$azureRMVMResources[1].Id] +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0GetRMVMConnectionDetailsInRG.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetRMVMConnectionDetailsInRG.ps1 new file mode 100644 index 000000000000..a0f6f135b012 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetRMVMConnectionDetailsInRG.ps1 @@ -0,0 +1,36 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vmName = "myVM0" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$vmWinRMHttpsPort = '40001' +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG + +# Test 1 "It should return azure vm connection details for valid input" +$response = Get-AzureRMVMsConnectionDetailsInResourceGroup -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources + +Assert-IsNotNullOrEmpty $response +Assert-AreEqual 3 $response.Count + +$resource = $response[$vmName] + +Assert-AreEqual $vmName $resource.Name +Assert-AreEqual $vmfqdn $resource.fqdn +Assert-AreEqual $vmWinRMHttpsPort $resource.winRMHttpsPort + +#Test 2 "It should return null if no azure vms" +$response = Get-AzureRMVMsConnectionDetailsInResourceGroup -resourceGroupName $validRG -azureRMVMResources $null + +Assert-IsNullOrEmpty $response + +$response = Get-AzureRMVMsConnectionDetailsInResourceGroup -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources -connectedServiceName "connectedServiceName" +Assert-IsNotNullOrEmpty $response +Assert-AreEqual 3 $response.Count + diff --git a/_generated/AzureFileCopyV4/Tests/L0GetStorageAccountType.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetStorageAccountType.ps1 new file mode 100644 index 000000000000..8b971336536a --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetStorageAccountType.ps1 @@ -0,0 +1,17 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Validate-AzurePowershellVersion {} +Register-Mock Write-Telemetry { } + +$invalidRGStorage = "invalidRGStorage" + +# Test 1 "Should throw if Blob storage not found" +Assert-Throws { + Get-StorageAccountType -storageAccountName $invalidRGStorage -endpoint @{} +} -MessagePattern "Storage account: $invalidRGStorage not found." diff --git a/_generated/AzureFileCopyV4/Tests/L0GetStorageKey.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetStorageKey.ps1 new file mode 100644 index 000000000000..9f1542d45d45 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetStorageKey.ps1 @@ -0,0 +1,16 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Validate-AzurePowershellVersion {} +Register-Mock Write-Telemetry { } + +# Test 1 "should throw if storage not found" +$invalidRGStorage = "invalidRGStorage" +Assert-Throws { + Get-StorageKey -storageAccountName $invalidRGStorage -endpoint @{} +} -MessagePattern "Storage account: $invalidRGStorage not found. Selected Connection 'ServicePrincipal' supports storage account of Azure Resource Manager type only." diff --git a/_generated/AzureFileCopyV4/Tests/L0GetTagBasedFilteredAzureVMs.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetTagBasedFilteredAzureVMs.ps1 new file mode 100644 index 000000000000..66522f4d90fb --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetTagBasedFilteredAzureVMs.ps1 @@ -0,0 +1,22 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vm0Name = "myVM0" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG + +# Test 1 "Should Call Does-AzureVMMatchTagFilterCriteria for every VM for filter criteria" +$filteredAzureVMResources = Get-TagBasedFilteredAzureVMs -azureVMResources $azureRMVMResources -filter "role:web" + +#Assert-WasCalled Does-AzureVMMatchTagFilterCriteria -Times $azureRMVMResources.Count -ParametersEvaluator {$filter -eq "role:web"} + +# Test 2 "Should return VMs that matches tag filter criteria" +$filteredAzureVMResources = Get-TagBasedFilteredAzureVMs -azureVMResources $azureRMVMResources -filter "role:test" + +Assert-AreEqual $vm0Name $filteredAzureVMResources.Name \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0GetblobStorageEndpoint.ps1 b/_generated/AzureFileCopyV4/Tests/L0GetblobStorageEndpoint.ps1 new file mode 100644 index 000000000000..fa7039d34934 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0GetblobStorageEndpoint.ps1 @@ -0,0 +1,17 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Validate-AzurePowershellVersion {} +Register-Mock Write-Telemetry { } + +$invalidRGStorage = "invalidRGStorage" + +# Test 1 "Should throw if Blob storage not found" +Assert-Throws { + Get-blobStorageEndpoint -storageAccountName $invalidRGStorage -endpoint @{} +} -MessagePattern "Unable to find storage type $invalidRGStorage with Connection SPN" \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0IsWinRMCustomScriptExtensionExists.ps1 b/_generated/AzureFileCopyV4/Tests/L0IsWinRMCustomScriptExtensionExists.ps1 new file mode 100644 index 000000000000..32e300406ed5 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0IsWinRMCustomScriptExtensionExists.ps1 @@ -0,0 +1,61 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$extensionName="WinRMCustomScriptExtension" + +# Test 1 "Should not throw when Resource group us null" +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $null -vmName $vm0Name -extensionName $extensionName -connectedServiceName $connectedServiceName +Assert-AreEqual $false $isExtensionExists + +# Test 2 "Should not throw when VM name is null" +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $null -extensionName $extensionName -connectedServiceName $connectedServiceName +Assert-AreEqual $false $isExtensionExists + +# Test 3 "Should not throw when VM name is invalid" +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $invalidMachineName -extensionName $extensionName -connectedServiceName $connectedServiceName +Assert-AreEqual $false $isExtensionExists + +# Test 4 "Should not throw Extension name is null" +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $null -connectedServiceName $connectedServiceName +Assert-AreEqual $false $isExtensionExists + +# Test 5 "Should not throw when Extension name is invalid" +$invalidExtensionName="InvalidWinRMCustomScriptExtension" + +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $invalidExtensionName -connectedServiceName $connectedServiceName +Assert-AreEqual $false $isExtensionExists + +# Test 6 "Should return true for valid values, if previous extension deployed successfully" +Register-Mock Get-AzureMachineCustomScriptExtension { return @{"ProvisioningState"="Succeeded"} } +Register-Mock Validate-CustomScriptExecutionStatus { return } +Register-Mock Remove-AzureMachineCustomScriptExtension { return @{}} +Register-Mock Get-Endpoint {} + +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName -connectedServiceName $connectedServiceName +Assert-AreEqual $true $isExtensionExists +Assert-WasCalled Get-AzureMachineCustomScriptExtension -Times 1 +Assert-WasCalled Validate-CustomScriptExecutionStatus -Times 1 +Assert-WasCalled Remove-AzureMachineCustomScriptExtension -Times 0 + +# Test 7 "Should return false For valid values, if previous extension failed to deploy" +Unregister-Mock Validate-CustomScriptExecutionStatus +Register-Mock Validate-CustomScriptExecutionStatus { throw "error" } + +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName -connectedServiceName $connectedServiceName + +Assert-AreEqual $false $isExtensionExists +Assert-WasCalled Validate-CustomScriptExecutionStatus -Times 1 + +# Test 8 "Should return false For valid values, if previous extension failed to provision" +Unregister-Mock Get-AzureMachineCustomScriptExtension +Register-Mock Get-AzureMachineCustomScriptExtension { return @{properties=@{ProvisioningState="Failed"}} } + +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName -connectedServiceName $connectedServiceName + +Assert-AreEqual $false $isExtensionExists +Assert-WasCalled Get-AzureMachineCustomScriptExtension -Times 2 diff --git a/_generated/AzureFileCopyV4/Tests/L0UploadFilesToAzureContainer.ps1 b/_generated/AzureFileCopyV4/Tests/L0UploadFilesToAzureContainer.ps1 new file mode 100644 index 000000000000..e453e12ca913 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0UploadFilesToAzureContainer.ps1 @@ -0,0 +1,37 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 + +$invalidInputStorageAccount = "invalidInputStorageAccount" +$exceptionMessage = "Exception thrown" + +Register-Mock Write-Telemetry { } +Register-Mock Test-Path { return $true } -ParametersEvaluator { $Path -eq "c:\foo\bar" } +Register-Mock Test-Path { return $false } -ParametersEvaluator { $Path -eq $validInputSourcePath } +Register-Mock Get-VstsTaskVariable { return 'c:\foo\bar' } + +# Test 1 "Should throw if Invoke-Expression fails" at time of azcopy login +Register-Mock Invoke-Expression { throw $exceptionMessage } + +Assert-Throws { + Upload-FilesToAzureContainer -sourcePath $validInputSourcePath -endPoint $spnEndpoint -storageAccountName $invalidInputStorageAccount -containerName $validInputContainerName ` + -blobPrefix $validInputBlobPrefix -blobStorageEndpoint $validBlobStorageEndpoint -azCopyLocation $validAzCopyLocation -destinationType $validInputAzureBlobDestinationType ` + -containerSasToken $validSasToken +} -MessagePattern "*ServicePrincipalError*" + +Unregister-Mock Invoke-Expression + +# Test 2 "Should throw and delete container if destination azureVM" +Register-Mock Remove-AzureContainer { } +Register-Mock Invoke-Expression { } -ParametersEvaluator {$command -eq "login" } +Register-Mock Invoke-Expression { throw $exceptionMessage } -ParametersEvaluator {$command -eq "copy" } + +Assert-Throws { + Upload-FilesToAzureContainer -sourcePath $validInputSourcePath -endPoint $spnEndpoint -storageAccountName $invalidInputStorageAccount -containerName $validInputContainerName ` + -blobPrefix $validInputBlobPrefix -azCopyLocation $validAzCopyLocation -destinationType $validInputAzureVmsDestinationType -containerSasToken $validSasToken +} -MessagePattern "*AFC_UploadContainerStorageAccount*invalidInputStorageAccount*" + +Assert-WasCalled Remove-AzureContainer -Times 1 \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/L0UtilityThrowError.ps1 b/_generated/AzureFileCopyV4/Tests/L0UtilityThrowError.ps1 new file mode 100644 index 000000000000..0736af738f66 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0UtilityThrowError.ps1 @@ -0,0 +1,12 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 + + $exceptionMessage = "Exception thrown" + +Assert-Throws { + ThrowError -errorMessage $exceptionMessage +} -MessagePattern "$exceptionMessage AFC_AzureFileCopyMoreHelp https://aka.ms/azurefilecopyreadme" diff --git a/_generated/AzureFileCopyV4/Tests/L0ValidateAzurePSVersion.ps1 b/_generated/AzureFileCopyV4/Tests/L0ValidateAzurePSVersion.ps1 new file mode 100644 index 000000000000..399a7e12f364 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0ValidateAzurePSVersion.ps1 @@ -0,0 +1,26 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 + +$lowerThanMinimumAzureVersion = New-Object -TypeName System.Version -ArgumentList "0.8.8" +$minimumAzureVersion = New-Object -TypeName System.Version -ArgumentList "1.1.0" +$greaterThanMinimumAzureVersion = New-Object -TypeName System.Version -ArgumentList "2.0.0" + +Register-Mock Get-AzureCmdletsVersion { return $lowerThanMinimumAzureVersion } +Register-Mock Write-Telemetry +Register-Mock Get-Module + +#Test 1 "Should throw if lower azureps version" +Assert-Throws { + Validate-AzurePowershellVersion +} -MessagePattern "*AFC_AzurePSNotInstalled*" + +#Test 2 "Should throw if lower azureps version" +Unregister-Mock Get-AzureCmdletsVersion +Register-Mock Get-AzureCmdletsVersion { return $greaterThanMinimumAzureVersion } + +Validate-AzurePowershellVersion +Assert-WasCalled -Times 1 Get-AzureCmdletsVersion diff --git a/_generated/AzureFileCopyV4/Tests/L0ValidateCustomScriptExecutionStatus.ps1 b/_generated/AzureFileCopyV4/Tests/L0ValidateCustomScriptExecutionStatus.ps1 new file mode 100644 index 000000000000..87807e415b4c --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/L0ValidateCustomScriptExecutionStatus.ps1 @@ -0,0 +1,66 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$extensionName="WinRMCustomScriptExtension" + +# Test 1 "Should throw Resource group name is null" +Assert-Throws { + $response = Validate-CustomScriptExecutionStatus -resourceGroupName $null -vmName $vm0Name -extensionName $extensionName +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" + +# Test 2 "Should throw when VM name is null" +Assert-Throws { + $response = Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $null -extensionName $extensionName +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" + + +# Test 3 "Should throw when VM name is invalid" +Assert-Throws { + $response = Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $invalidMachineName -extensionName $extensionName +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" + +# Test 4 "Should throw Extension name is null" +Assert-Throws { + $response = Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $null +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" + +# Test 5 "should throw when Extension name is invalid" +$invalidExtensionName="InvalidWinRMCustomScriptExtension" +Assert-Throws { + $response = Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $invalidExtensionName +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" + +# Test 6 "Should not throw" "For valid values, if previous extension deployed successfully" +Register-Mock Remove-AzureMachineCustomScriptExtension { return @{}} +$vmInstanceViews[$vm0Name]["Extensions"]=$extensions + +Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName +Assert-WasCalled Remove-AzureMachineCustomScriptExtension -Times 0 + +# Test 7 "Should throw for valid values, if previous extension failed to deploy" +$extensions[0]["SubStatuses"][1]["Message"]="Extension script execution failed." +$vmInstanceViews[$vm0Name]["Extensions"]=$extensions + +Assert-Throws { + Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" +Assert-WasCalled Remove-AzureMachineCustomScriptExtension -Times 1 + +# Test 8 "For valid values, if previous extension failed to provision" +Unregister-Mock Remove-AzureMachineCustomScriptExtension +Register-Mock Remove-AzureMachineCustomScriptExtension { return @{}} +$extensions[0]["SubStatuses"][1]["Message"]="Failed to apply the extension." +$vmInstanceViews[$vm0Name]["Extensions"]=$extensions + +Assert-Throws { + Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" +Assert-WasCalled Remove-AzureMachineCustomScriptExtension -Times 1 + +#Clean the extension +$vmInstanceViews[$vm0Name]["Extensions"]=@() diff --git a/_generated/AzureFileCopyV4/Tests/MockHelper.ps1 b/_generated/AzureFileCopyV4/Tests/MockHelper.ps1 new file mode 100644 index 000000000000..0a777d124974 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/MockHelper.ps1 @@ -0,0 +1,653 @@ +############## Constants ########## +$invalidParam = "invalidParam" +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$rgWithNoVM = "AzureFIleCopyPTRGNoVMDoNotDelete" +$rgNameWithSecurityGroup = "AzureFIleCopyPTRGWithSGDoNotDelete" +$validStorage = "azurefilecopyptsstore" +$validStorageKey = "validStorageKey" +$storageAccounts = @{} +$storageAccounts.Add($validStorage, $validStorageKey) +$validClassicStorage = "ptclassicstoredontdelete" +$validClassicStorageKey = "validClassicStorageKey" +$storageAccounts.Add($validClassicStorage, $validClassicStorageKey) + +$storageAccountsRG = @{} +$storageAccountsRG.Add($validStorage, $validRG) +$storageAccountsRG.Add($validClassicStorage, $validClassicStorageKey) + +$storageAccountsContext = @{} +$storageAccountContext = @{} +$storageAccountContext.StorageAccountName = $validStorage +$storageAccountsContext.Add($validStorage, $storageAccountContext) + +$validSasToken = 'anyValidSaasToken' + +$location = "West US" +$vm0Name = "myVM0" +$vm1Name = "mytestVM0" +$vm2Name = "mytestPTVM1" +$lbName = "myLB" +$classicvmfqdn = "taskplatformtesttwovm.cloudapp.net" +$rgWithNoClassicVms = "taskplatformtestnovm" +$rgWithClassicVMs = "taskplatformtesttwovm" +$classicvm0 = "vm0" +$classicvm1 = "VM1" +$azurevmFqdn = "azurefilecopyplatformtestsdns.westus.cloudapp.azure.com" +$winrmPort1 = "40001" +$winrmPort2 = "40003" +$winrmPort3 = "40005" +$classicWinrmPort1 = "5986" +$classicWinrmPort2 = "57148" +$classicWinrmPort3 = "57149" + +# creating resourcegroups dictionary +$resourceGroups = @{} +$resourceGroup = @{} +$resourceGroup.ResourceGroupName = $validRG +$resourceGroup.Location = $location +$resourceGroups.Add($validRG, $resourceGroup) + +$resourceGroup.ResourceGroupName = $rgWithNoVM +$resourceGroups.Add($rgWithNoVM, $resourceGroup) +$resourceGroup.ResourceGroupName = $rgWithNoClassicVms +$resourceGroups.Add($rgWithNoClassicVms, $resourceGroup) + +$validActionResponse = @{"Status" = "Succeeded"} +$VMsStatus = @{$vm0Name = "Running"; $vm1Name = "Running";$vm2Name = "Running"} + +$resourceGroups[$validRG].VMsDetails = $VMsStatus + +$vmInstanceView = @{"Statuses" = @(@{"DisplayStatus" = "Provisioning succeeded"},@{"DisplayStatus" = "VM running"}); "Extensions" = @(); "VMAgent" = @{"ExtensionHandlers" = @()}} +$vmInstanceViews = @{$vm0Name = $vmInstanceView; $vm1Name = $vmInstanceView ; $vm2Name = $vmInstanceView} +$vmResources = @(@{"Id" = "Microsoft.Compute/virtualMachines/myVM0"; "Name" = $vm0Name; "Location" = $location; "Tags" = @{"role" = "Test"}}, @{"Id" = "Microsoft.Compute/virtualMachines/mytestVM0"; "Name" = $vm1Name; "Location" = $location; "Tags" = @{"role" = "mytest"}} , @{"Id" = "Microsoft.Compute/virtualMachines/mytestPTVM1"; "Name" = $vm2Name; "Location" = $location; "Tags" = @{"role" = "mytestPT"}}) + +$virtualMachine1 = @{"Id" = "Microsoft.Compute/virtualMachines/myVM0"} +$IpConfigurations1 = @(@{"Name" = "ipconfig1"; "Id" = "Microsoft.Network/networkInterfaces/nic0/ipConfigurations/ipconfig1"; "LoadBalancerInboundNatRules" = @(@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/RDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/WINRM-VM0"})}) +$networkInterface1 = @{"Name" = "nic0"; "VirtualMachine" = $virtualMachine1; "IpConfigurations" = $IpConfigurations1} + +$virtualMachine2 = @{"Id" = "Microsoft.Compute/virtualMachines/mytestVM0"} +$IpConfigurations2 = @(@{"Name" = "ipconfig2"; "Id" = "Microsoft.Network/networkInterfaces/nicN0/ipConfigurations/ipconfig2"; "LoadBalancerInboundNatRules" = @(@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NRDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NWINRM-VM0"})}) +$networkInterface2 = @{"Name" = "nicN0"; "Id" = "Microsoft.Network/networkInterfaces/nicN0"; "VirtualMachine" = $virtualMachine2; "IpConfigurations" = $IpConfigurations2} + +$virtualMachine3 = @{"Id" = "Microsoft.Compute/virtualMachines/mytestPTVM1"} +$IpConfigurations3 = @(@{"Name" = "ipconfig3"; "Id" = "Microsoft.Network/networkInterfaces/mytestptvm0456/ipConfigurations/ipconfig3"; "LoadBalancerInboundNatRules" = @(@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MRDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MWINRM-VM0"})}) +$networkInterface3 = @{"Name" = "mytestptvm0456"; "Id" = "Microsoft.Network/networkInterfaces/mytestptvm0456"; "VirtualMachine" = $virtualMachine3; "IpConfigurations" = $IpConfigurations3} + +$networkInterfaceResources = @($networkInterface1, $networkInterface2,$networkInterface3) + +$IpConfiguration3 = @{"Id" = "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontend"} +$publicIPAddressResources = @(@{"Name" = "myPublicIP"; "Id" = "Microsoft.Network/publicIPAddresses/myPublicIP"; "IpConfiguration" = $IpConfiguration3; "IpAddress" = "40.118.129.77"; "DnsSettings" = @{"Fqdn" = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com"}},@{"Name" = "myTestPTVM0"; "Id" = "Microsoft.Network/publicIPAddresses/myTestPTVM0"; "IpConfiguration" = $IpConfiguration3; "IpAddress" = "13.91.111.214"; "DnsSettings" = @{"Fqdn" = "lbipeca3f178ce794301af12.westus.cloudapp.azure.com"}}) + +$inboundNatRules = @(@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/RDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/RDP-VM1"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/WINRM-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/WINRM-VM1"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NRDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NRDP-VM1"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NWINRM-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NWINRM-VM1"},@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MRDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MRDP-VM1"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MWINRM-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MWINRM-VM1"}) +$frontEndIPConfigs = @(@{"Name" = "LoadBalancerFrontend"; "PublicIpAddress" = @{"Id" = "Microsoft.Network/publicIPAddresses/myPublicIP"}; "InboundNatRules" = $inboundNatRules}) + +$inboundRule1 = @{"Name" = "RDP-VM0"; "FrontendPort" = "50001"; "BackendPort" = "3389"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/nic0/ipConfigurations/ipconfig1"}} +$inboundRule2 = @{"Name" = "RDP-VM1"; "FrontendPort" = "50002"; "BackendPort" = "3389"; "BackendIPConfiguration" = $null} +$inboundRule3 = @{"Name" = "WINRM-VM0"; "FrontendPort" = $winrmPort1; "BackendPort" = "5986"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/nic0/ipConfigurations/ipconfig1"}} +$inboundRule4 = @{"Name" = "WINRM-VM1"; "FrontendPort" = "40002"; "BackendPort" = "5986"; "BackendIPConfiguration" = $null} +$inboundRule5 = @{"Name" = "NRDP-VM0"; "FrontendPort" = "50003"; "BackendPort" = "3389"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/nicN0/ipConfigurations/ipconfig2"}} +$inboundRule6 = @{"Name" = "NRDP-VM1"; "FrontendPort" = "50004"; "BackendPort" = "3389"; "BackendIPConfiguration" = $null} +$inboundRule7 = @{"Name" = "NWINRM-VM0"; "FrontendPort" = "$winrmPort2"; "BackendPort" = "5986"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/nicN0/ipConfigurations/ipconfig2"}} +$inboundRule8 = @{"Name" = "NWINRM-VM1"; "FrontendPort" = "40004"; "BackendPort" = "5986"; "BackendIPConfiguration" = $null} +$inboundRule9 = @{"Name" = "MRDP-VM0"; "FrontendPort" = "50005"; "BackendPort" = "3389"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/mytestptvm0456/ipConfigurations/ipconfig3"}} +$inboundRule10 = @{"Name" = "MRDP-VM1"; "FrontendPort" = "50006"; "BackendPort" = "3389"; "BackendIPConfiguration" = $null} +$inboundRule11 = @{"Name" = "MWINRM-VM0"; "FrontendPort" = "$winrmPort3"; "BackendPort" = "5986"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/mytestptvm0456/ipConfigurations/ipconfig3"}} +$inboundRule12 = @{"Name" = "MWINRM-VM1"; "FrontendPort" = "40006"; "BackendPort" = "5986"; "BackendIPConfiguration" = $null} +$inboundRules = @($inboundRule1, $inboundRule2, $inboundRule3, $inboundRule4, $inboundRule5, $inboundRule6, $inboundRule7, $inboundRule8,$inboundRule9,$inboundRule10,$inboundRule11,$inboundRule12) + +$loadBalancerDetails = @{"frontEndIPConfigs" = $frontEndIPConfigs; "inboundRules" = $inboundRules} +$loadBalancerResources = @{$lbName = $loadBalancerDetails} + +$azureResourceGroupDeploymentResponse = @{"networkInterfaceResources" = $networkInterfaceResources; "publicIPAddressResources" = $publicIPAddressResources; "loadBalancerResources" = $loadBalancerResources} + +#creating one RG deployment to be used through out test +$resourceGroupDeployments = @{} +$resourceGroupVMs = @{} +$resourceGroupDeployments.Add($validRG, $azureResourceGroupDeploymentResponse) +$resourceGroupVMs.Add($validRG, $VMsStatus) + +$cloudServices = @{} +$cloudServiceWithNoVM = @{"vms" = $null; "vmConnectionDetails" = $null} +$vmConnectionDetailsWithTwoVms = @{$classicvm0 = @{"Name" = $classicvm0; "fqdn" = $classicvmfqdn; "winRMHttpsPort" = $classicWinrmPort1}; $classicvm1 = @{"Name" = $classicvm1; "fqdn" = $classicvmfqdn; "winRMHttpsPort" = $classicWinrmPort2}} +$cloudServiceWithTwoVM = @{"vms" = @(@{"Name" = $classicvm0}, @{"Name" = $classicvm1}); "vmConnectionDetails" = $vmConnectionDetailsWithTwoVms} + +$cloudServices.Add($rgWithNoClassicVms, $cloudServiceWithNoVM) +$cloudServices.Add($rgWithClassicVMs, $cloudServiceWithTwoVM) + +#Extensions +$winRMcustomScripExtensionObject = @{} +$winRMcustomScripExtensionObject["ExtensionType"]="Microsoft.Compute.CustomScriptExtension" +$winRMcustomScripExtensionObject["Name"]="winrmcustomscriptextension" +$winRMcustomScripExtensionObject["TypeHandlerVersion"]="1.4" + +$subStatus0 = @{} +$subStatus0["Code"]="ComponentStatus/StdOut/succeeded" +$subStatus0["DisplayStatus"]="Provisioning succeeded" +$subStatus0["Level"]="Info" +$subStatus0["Message"]="Succeeded\\n\\nDeleted 1 rule(s).\\nOk.\\n\\nOk.\\n" +$subStatus0["Time"]=$null + + +$subStatus1 = @{} +$subStatus1["Code"]="ComponentStatus/StdErr/succeeded" +$subStatus1["DisplayStatus"]="Provisioning succeeded" +$subStatus1["Level"]="Info" +$subStatus1["Message"]="" +$subStatus1["Time"]=$null + +$substatuses = @() +$substatuses+=$subStatus0 +$substatuses+=$subStatus1 + +$winRMcustomScripExtensionObject["SubStatuses"]=@() +$winRMcustomScripExtensionObject["SubStatuses"]+=$substatuses + + +$status0 = @{} +$status0["Code"]="ProvisioningState/succeeded" +$status0["DisplayStatus"]="Provisioning succeeded" +$status0["Level"]="Info" +$status0["Message"]="Finished executing command" +$status0["Time"]=$null + +$statuses = @() +$statuses += $status0 + +$winRMcustomScripExtensionObject["Statuses"]=@() +$winRMcustomScripExtensionObject["Statuses"]+=$statuses + +$extensions = @() +$extensions += $winRMcustomScripExtensionObject + +$getCustomScriptExtensionResponse = @{"Status"="Succeeded"} +$setCustomScriptExtensionResponse = @{"Status"="Succeeded"} +$rgustomScriptExtensionResponse = @{"Status"="Succeeded"} +$winrmCustomScriptExtension="WinRmCustomScriptExtension" +$invalidCustomScriptName = "InvalidConfigureWinRM.ps1" + +$securityGroups = New-Object System.Collections.Generic.List[System.Object] +$securityRules = New-Object System.Collections.Generic.List[System.Object] + +$validSecurityGroupProps = @{"Name"="VMWithSG";"SecurityRules"=$securityRules} +$validSecurityGroup = New-Object PSObject -Property $validSecurityGroupProps +$securityGroups.Add($validSecurityGroup) + + +$securityGroupsRecommended = New-Object System.Collections.Generic.List[System.Object] +$securityRulesRecommended = New-Object System.Collections.Generic.List[System.Object] + +$validSecurityGroupPropsRecommended = @{"Name"="VMWithSGRecPS";"SecurityRules"=$securityRulesRecommended} +$validSecurityGroupRecommended = New-Object PSObject -Property $validSecurityGroupPropsRecommended +$securityGroupsRecommended.Add($validSecurityGroupRecommended) + +$securityGroupsLatest = New-Object System.Collections.Generic.List[System.Object] +$securityRulesLatest = New-Object System.Collections.Generic.List[System.Object] + +$validSecurityGroupPropsLatest = @{"Name"="VMWithSGHighPS";"SecurityRules"=$securityRulesLatest} +$validSecurityGroupLatest = New-Object PSObject -Property $validSecurityGroupPropsLatest +$securityGroupsLatest.Add($validSecurityGroupLatest) + +$securedMockPassword = New-Object -TypeName System.Security.SecureString + +$vmIdWhichHasSecurityGroupPrevious = "/subscriptions/c94bda7a-0577-4374-9c53-0e46a9fb0f70/resourceGroups/AzureFIleCopyPTRGWithSGDoNotDelete/providers/Microsoft.Compute/virtualMachines/VMWithSG" +$vmIdWhichHasSecurityGroupRecommended = "/subscriptions/c94bda7a-0577-4374-9c53-0e46a9fb0f70/resourceGroups/AzureFIleCopyPTRGWithSGDoNotDelete/providers/Microsoft.Compute/virtualMachines/VMWithSGRecPS" +$vmIdWhichHasSecurityGroupLatest = "/subscriptions/c94bda7a-0577-4374-9c53-0e46a9fb0f70/resourceGroups/AzureFIleCopyPTRGWithSGDoNotDelete/providers/Microsoft.Compute/virtualMachines/VMWithSGHighPS" +$vmIdWhichHasNoSecurityGroup = "/subscriptions/c94bda7a-0577-4374-9c53-0e46a9fb0f70/resourceGroups/AzureFileCopyTaskPlatformTestDoNotDelete/providers/Microsoft.Compute/virtualMachines/mytestVM0" +$duplicateRuleName = "VSO-Custom-WinRM-Https-Port-Deplicate" + +#Create Mock Object type for Hyak.Common.CloudException +$Source = @" + using System; +namespace Hyak.Common { + public class CloudException : Exception { + } +} +"@ +Add-Type -TypeDefinition $Source -Language CSharp + +function Get-AzureBlobStorageEndpointFromARM +{ + param([string]$storageAccountName) + + if(-not [string]::IsNullOrEmpty($storageAccountName)) + { + if(-not $storageAccounts.ContainsKey($storageAccountName)) + { + throw "Unable to find storage type $storageAccountName with Connection SPN" + } + + return $storageAccounts[$storageAccountName] + } +} + +function Get-AzureStorageAccountTypeFromARM +{ + param([string]$storageAccountName, + [object]$endpoint) + + if(-not [string]::IsNullOrEmpty($storageAccountName)) + { + if(-not $storageAccounts.ContainsKey($storageAccountName)) + { + throw "Storage account: $storageAccountName not found." + } + + return $storageAccounts[$storageAccountName] + } +} + +function Get-AzureStorageAccountResourceGroupName +{ + param([string]$storageAccountName) + + if (-not [string]::IsNullOrEmpty($storageAccountName)) + { + if(-not $storageAccountsRG.ContainsKey($storageAccountName)) + { + throw "Storage account: $storageAccountName not found. Selected Connection 'ServicePrincipal' supports storage account of Azure Resource Manager type only." + } + + return $storageAccountsRG[$storageAccountName] + } +} + +function Get-AzureStorageKeyFromARM +{ + param([string]$storageAccountName) + + if(-not [string]::IsNullOrEmpty($storageAccountName)) + { + if(-not $storageAccounts.ContainsKey($storageAccountName)) + { + throw "Storage account: $storageAccountName not found. Selected Connection 'ServicePrincipal' supports storage account of Azure Resource Manager type only." + } + + return $storageAccounts[$storageAccountName] + } +} + +function Create-AzureStorageContext +{ + param([string]$storageAccountName, + [string]$storageAccountKey) + + if(-not [string]::IsNullOrEmpty($storageAccountName) -and -not [string]::IsNullOrEmpty($storageAccountKey)) + { + if(-not $storageAccounts.ContainsKey($storageAccountName)) + { + return + } + + return $storageAccountsContext[$storageAccountName] + } +} + +function Get-AzureClassicVMsInResourceGroup +{ + param([string]$resourceGroupName) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and $cloudServices.ContainsKey($resourceGroupName)) + { + return $($cloudServices[$resourceGroupName])["vms"] + } +} + +function Get-AzureRMVMsInResourceGroup +{ + param([string]$resourceGroupName) + + if(-not [string]::IsNullOrEmpty($resourceGroupName)) + { + if(-not $resourceGroups.ContainsKey($resourceGroupName)) + { + throw "Provided resource group '$resourceGroupName' does not exist." + } + + if($resourceGroupDeployments.ContainsKey($resourceGroupName)) + { + return $vmResources + } + } +} + +function Get-AzureRMResourceGroupResourcesDetails +{ + param([string]$resourceGroupName, + [object]$azureRMVMResources) + + if(-not [string]::IsNullOrEmpty($resourceGroupName)) + { + if(-not $resourceGroups.ContainsKey($resourceGroupName)) + { + throw "Resource group '$resourceGroupName' could not be found." + } + + if($resourceGroupDeployments.ContainsKey($resourceGroupName)) + { + return $resourceGroupDeployments[$resourceGroupName] + } + } + + return @{} +} + +function Get-Endpoint +{ + param([string]$connectedServiceName) + + return @{ + "Data"=@{ + "EnvironmentName"="AzureStack" + } + } +} + +function Get-AzureRMResourceGroupResourcesDetailsForAzureStack +{ + param([string]$resourceGroupName, + [object]$azureRMVMResources, + [string]$connectedServiceName) + + if(-not [string]::IsNullOrEmpty($resourceGroupName)) + { + if(-not $resourceGroups.ContainsKey($resourceGroupName)) + { + throw "Resource group '$resourceGroupName' could not be found." + } + + if($resourceGroupDeployments.ContainsKey($resourceGroupName)) + { + return $resourceGroupDeployments[$resourceGroupName] + } + } + + return @{} +} + +function Generate-AzureStorageContainerSASToken +{ + param([string]$containerName, + [object]$storageContext, + [System.Int32]$tokenTimeOutInMinutes) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + return $validSasToken + } +} + +function Remove-AzureContainer +{ + +} + +function Get-AzureMachineStatus +{ + param([string]$resourceGroupName, + [string]$name) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($name)) + { + if(-not $resourceGroups.ContainsKey($resourceGroupName)) + { + throw "Resource group '$resourceGroupName' could not be found." + } + + $VMs = $resourceGroups[$resourceGroupName].VMsDetails + if($VMs -and $VMs.ContainsKey($name)) + { + $tempExts = $vmInstanceViews[$name]["Extensions"] + if($tempExts -and $tempExts.Count -ge 1) + { + $status = @{} + $status["Extensions"] = $tempExts + #$customScriptExtension=$tempExts[0] + } + else + { + throw "No extension exists with name '$winrmCustomScriptExtension'" + } + } + else + { + throw "The Resource 'Microsoft.Compute/virtualMachines/$name/extensions/$winrmCustomScriptExtension' under resource group '$resourceGroupName' was not found." + } + } + + return $status +} + +function Get-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name) + + $errMsg="The Resource 'Microsoft.Compute/virtualMachines/$vmName/extensions/$name' under resource group '$resourceGroupName' was not found." + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName)) + { + if(-not $resourceGroups.ContainsKey($resourceGroupName)) + { + throw "Resource group '$resourceGroupName' could not be found." + } + + $VMs = $resourceGroups[$resourceGroupName].VMsDetails + if($VMs -and $VMs.ContainsKey($vmName)) + { + if($name) + { + $tempExts = $vmInstanceViews[$vmName]["Extensions"] + if($tempExts -and $tempExts.Count -ge 1) + { + $response = @{} + if($tempExts[0]["SubStatuses"][1]["Message"] -and $extension[0]["SubStatuses"][1]["Message"] -ne "") + { + $response["ProvisioningState"]="Failed" + } + else + { + $response["ProvisioningState"]="Succeeded" + } + } + else + { + throw $errMsg + } + } + else + { + throw $errMsg + } + } + else + { + throw $errMsg + } + } + + return $response +} + +function Set-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name, + [string[]]$fileUri, + [string]$run, + [string]$argument, + [string]$location) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName) -and -not [string]::IsNullOrEmpty($name)) + { + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName)) + { + if(-not $resourceGroups.ContainsKey($resourceGroupName)) + { + throw "Resource group '$resourceGroupName' could not be found." + } + + $VMs = $resourceGroups[$resourceGroupName].VMsDetails + if($VMs -and $VMs.ContainsKey($vmName)) + { + $response = @{} + + if(-not $fileUri) + { + throw "Cannot validate argument on parameter 'FileUri'. The argument is null or empty." + } + + if(-not $run) + { + throw "Cannot validate argument on parameter 'Run'. The argument is null or empty." + } + + if(-not $argument) + { + throw "Cannot validate argument on parameter 'Argument'. The argument is null or empty." + } + + if(-not $location) + { + throw "Cannot validate argument on parameter 'Location'. The argument is null or empty." + } + + elseif($run -eq $invalidCustomScriptName) + { + $extensions[0]["SubStatuses"][1]["Message"]="The argument '$invalidCustomScriptName' to the -File parameter does not exist. Provide the path to an existing '.ps1' file as an argument to the -File parameter." + $errorDetails = @{"Message" = "VM has reported a failure when processing extension 'WinRMCustomScriptExtension'. Error message: Finished executing command."} + $response["Error"]= $errorDetails + $response["Status"]="Failed" + } + else + { + $extensions[0]["SubStatuses"][1]["Message"]="" + $response["Status"]="Succeeded" + } + + $vmInstanceViews[$vmName]["Extensions"]=$extensions + } + else + { + throw "Can not perform requested operation on nested resource. Parent resource '$vmName' not found." + } + } + } + + return $response +} + +function Remove-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName) -and -not [string]::IsNullOrEmpty($name)) + { + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName)) + { + $response = @{} + $VMs = $resourceGroups[$resourceGroupName].VMsDetails + if($VMs -and $VMs.ContainsKey($vmName)) + { + $tempExts = $vmInstanceViews[$vmName]["Extensions"] + if($tempExts -and $tempExts.Count -ge 1) + { + $vmInstanceViews[$vmName]["extensions"]=@() + $response["Status"]="Succeeded" + } + else + { + $response["Status"]="Succeeded" + } + } + else + { + $response["Status"]="Succeeded" + } + } + } + + return $response +} + +function Add-AzureNetworkSecurityRuleConfig +{ +} + +function Add-NetworkSecurityRuleConfig +{ + param([string]$resourceGroupName, + [object]$securityGroups, + [string]$ruleName, + [string]$rulePriotity, + [string]$winrmHttpsPort) + + if(($securityGroups.Count -gt 0) -and (-not $securityGroups[0].SecurityRules -or $ruleName -eq $duplicateRuleName)) + { + Add-AzureNetworkSecurityRuleConfig + + $tempRulePriority = "3986" + if($ruleName -eq $duplicateRuleName) + { + $tempRulePriority = "4036" + } + + $securityRuleProps = @{"Name"=$ruleName;"Priority"=$tempRulePriority} + $securityRule = New-Object PSObject -Property $securityRuleProps + $securityGroups[0].SecurityRules += $securityRule + } + + return $securityGroups +} + +function Set-AzureNetworkSecurityGroup +{ + param([object]$NetworkSecurityGroup) + + if($NetworkSecurityGroup.Name -eq $validSecurityGroup.Name) + { + $validSecurityGroup = $NetworkSecurityGroup + } + + return $validSecurityGroup +} + +function Get-NetworkSecurityGroups +{ + param([string] $resourceGroupName, + [string] $vmId) + + if($vmId -eq $vmIdWhichHasNoSecurityGroup) + { + return @() + } + elseif($vmId -eq $vmIdWhichHasSecurityGroupPrevious) + { + return $securityGroups + } + elseif($vmId -eq $vmIdWhichHasSecurityGroupRecommended) + { + return $securityGroupsRecommended + } + elseif($vmId -eq $vmIdWhichHasSecurityGroupLatest) + { + return $securityGroupsLatest + } + else + { + throw "[Azure Call]No network interface found with virtual machine id $vmId under resource group $rgNameWithSecurityGroup" + } +} + +# Used only in test code +function Remove-NetworkSecurityRuleConfig +{ + param([object] $securityGroups, + [string] $ruleName) + + $validSecurityGroup["SecurityRules"]=@() +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Tests/MockVariable.ps1 b/_generated/AzureFileCopyV4/Tests/MockVariable.ps1 new file mode 100644 index 000000000000..bfb8c213c959 --- /dev/null +++ b/_generated/AzureFileCopyV4/Tests/MockVariable.ps1 @@ -0,0 +1,58 @@ + +$validInputSourcePath = Join-Path $env:windir "Source" +$validInputAzureBlobDestinationType = "AzureBlob" +$validInputAzureVmsDestinationType = "AzureVms" +$validInputStorageAccount = "validInputStorageAccount" +$validInputContainerName = "validContainerName" +$validInputBlobPrefix = "validBlobPrefix" +$validResourceGroupName = "validResourceGroupName" +$validInputVmsAdminUserName = "validInputVmsAdminUserName" +$validInputVmsAdminPassword = "validInputVmsAdminPassword" +$validSasToken = '?sv=2015-02-21&sr=c&sig=Ncs6hCfAhzwwWd19eP7ToJATsS3xS1laFfPmRwO90qY%3D&se=2016-01-04T18%3A13%3A12Z&sp=rwdl' + +$validStorageKey = "validsotrageKey" +$validAzCopyLocation = Join-Path $env:windir "AzCopyLocation" +$validInputTargetPath = Join-Path $env:windir "Target" + +$failedStatus = "Failed" +$failedCopyLog = "Failed Copy Operation" +$failedCopyError = $failedCopyLog +$failedDeploymentResponseForCopy = @{"MachineName" = "vm0"; "Status" = $failedStatus; "DeploymentLog" = $failedCopyLog; "ServiceLog" = $null; "Error" = @{"Message" = $failedCopyError}} + +$passedStatus = "Passed" +$successLog = "Success Logs" +$passedDeploymentResponseForCopy = @{"Status" = $passedStatus; "DeploymentLog" = $successLog; "ServiceLog" = $null; "Error" = $null} +$passedLatestDeploymentResponseForCopy = @{"Status" = $passedStatus; "DeploymentLog" = $successLog; "ServiceLog" = $null; "Error" = $null} + +$guidingMessageForAzureFileCopy = "For more info please refer to https://aka.ms/azurefilecopyreadme" +$winrmHelpMsg = "To fix WinRM connection related issues, select the 'Enable Copy Prerequisites' option in the task. If set already, and the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). Applicable only for ARM VMs." + +$succeededStatus = "Succeeded" +$succeededCopyResponse = @{"Status" = $succeededStatus; "Log" = $null; "Error" = $null} + +$assembly = New-Object System.Collections.Generic.List``1[System.Object] + +$testJobs = New-Object System.Collections.Generic.List``1[System.Object] +$failedJob = @{"Id" = "1"; "Status" = "Completed"} +$passedJob = @{"Id" = "2"; "Status" = "Completed"} +$passedLatestJob = @{"Id" = "3"; "Status" = "Completed"} +$passedJob1 = @{"Id" = "1"; "Status" = "Completed"} + +$jobFailedResponse = @{"Status" = $failedStatus; "DeploymentLog" = $failedCopyLog; "ServiceLog" = $null; "Error" = $null} +$jobPassedResponse = @{"Status" = $passedStatus; "DeploymentLog" = $successLog; "ServiceLog" = $null; "Error" = $null} +$jobPassedLatestResponse = @{"Status" = $passedStatus; "DeploymentLog" = $successLog; "ServiceLog" = $null; "Error" = $null} + +$connectedServiceName = "DummyConnectedServiceName" + +$invokeRemoteScriptFailedResponse = @{ExitCode = 1} +$invokeRemoteScriptPassedResponse = @{ExitCode = 0} +$invokeRemoteScriptOnePassOneFailResponse = @($invokeRemoteScriptFailedResponse, $invokeRemoteScriptPassedResponse) +$invokeRemoteScriptAllPassedResponse = @($invokeRemoteScriptPassedResponse, $invokeRemoteScriptPassedResponse) + +$validBlobStorageEndpoint = "https://validInputStorageAccount.blob.core.windows.net" + +$spnEndpoint=@{} +$spnAuth=@{} + +$spnEndpoint.Scheme='ServicePrincipal' +$spnEndpoint.Auth =$spnEndpoint \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/ThirdPartyNotices.txt b/_generated/AzureFileCopyV4/ThirdPartyNotices.txt new file mode 100644 index 000000000000..ea01c33dc766 --- /dev/null +++ b/_generated/AzureFileCopyV4/ThirdPartyNotices.txt @@ -0,0 +1,1137 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +Azure File Copy incorporates third party material from the projects listed below. The original copyright notice and the license under which Microsoft received such third party material are set forth below. Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise. + +1. balanced-match (https://github.com/juliangruber/balanced-match) +2. brace-expansion (https://github.com/juliangruber/brace-expansion) +3. buffer-equal-constant-time (https://github.com/salesforce/buffer-equal-constant-time) +4. concat-map (https://github.com/substack/node-concat-map) +5. hoek (https://github.com/hapijs/hoek) + Includes:Deep-eql +6. isemail (https://github.com/hapijs/isemail) +7. joi (https://github.com/hapijs/joi) +8. jsonwebtoken (https://github.com/auth0/node-jsonwebtoken) +9. lodash.once (https://github.com/lodash/lodash) +10. minimatch (https://github.com/isaacs/minimatch) +11. Mockery (https://github.com/mfncooper/mockery) +12. Moment (https://github.com/moment/moment) + Includes:Files with code from Closure +13. ms (https://github.com/zeit/ms) +14. Node.js (https://nodejs.org/) +15. node-ecdsa-sig-formatter (https://github.com/Brightspace/node-ecdsa-sig-formatter) +16. node-jwa (https://github.com/brianloveswords/node-jwa) +17. node-jws (https://github.com/brianloveswords/node-jws) +18. node-uuid (https://github.com/broofa/node-uuid/) +19. OpenSSL (http://www.openssl.org) +20. Q (https://github.com/kriskowal/q) +21. safe-buffer (https://github.com/feross/safe-buffer) +22. sax js (https://github.com/isaacs/sax-js) +23. semver (https://github.com/npm/node-semver/) +24. ShellJS (https://github.com/shelljs/shelljs) +25. topo (https://github.com/hapijs/topo) +26. tunnel (https://github.com/koichik/node-tunnel) +27. underscore.js (http://underscorejs.org/; https://github.com/jashkenas/underscore) +28. vso-node-api (https://github.com/Microsoft/vsts-node-api) +29. VSTS-task-lib (https://github.com/Microsoft/vsts-task-lib) +30. Xml2JS (https://github.com/Leonidas-from-XIV/node-xml2js) +31. Xmlbuilder (https://github.com/oozcitak/xmlbuilder-js) +32. xtend (https://github.com/Raynos/xtend) +33. @types/node (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +34. @types/q (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +35. @types/mocha (https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% buffer-equal-constant-time NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013, GoInstant Inc., a salesforce.com company +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of salesforce.com, nor GoInstant, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF buffer-equal-constant-time NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) James Halliday/substack + +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% hoek NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright (c) 2011-2014, Walmart and other contributors. +Copyright (c) 2011, Yahoo Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/hapi/graphs/contributors +Portions of this project were initially based on the Yahoo! Inc. Postmile project, +published at https://github.com/yahoo/postmile. +========================================= +Includes code from Deep-eql + +Copyright (c) 2013 Jake Luer jake@alogicalparadox.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF hoek NOTICES, INFORMATION, AND LICENSE + +%% isemail NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2008-2011, Dominic Sayers +Copyright (c) 2013-2014, GlobeSherpa +Copyright (c) 2014-2015, Eli Skeggs + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +- Neither the name of Dominic Sayers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF isemail NOTICES, INFORMATION, AND LICENSE + +%% joi NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/joi/graphs/contributors +========================================= +END OF joi NOTICES, INFORMATION, AND LICENSE + +%% jsonwebtoken NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2015 Auth0, Inc. (http://auth0.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF jsonwebtoken NOTICES, INFORMATION, AND LICENSE + +%% lodash.once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.once NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% Mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following +terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF Mockery NOTICES, INFORMATION, AND LICENSE + +%% Moment NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +Files with code from Closure + +Copyright (c) 2006 The Closure Library Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +========================================= +END OF Moment NOTICES, INFORMATION, AND LICENSE + +%% ms NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Guillermo Rauch +Copyright (c) 2016 Zeit, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the Software), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF ms NOTICES, INFORMATION, AND LICENSE + +%% Node.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +The Node.js license applies to all parts of Node.js that are not externally +maintained libraries. +========================================= +END OF Node.js NOTICES, INFORMATION, AND LICENSE + +%% node-ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + Copyright 2015 D2L Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +========================================= +END OF node-ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE + +%% node-jwa NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jwa NOTICES, INFORMATION, AND LICENSE + +%% node-jws NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jws NOTICES, INFORMATION, AND LICENSE + +%% node-uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2012 Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-uuid NOTICES, INFORMATION, AND LICENSE + +%% OpenSSL NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/) + * + * 4. The names OpenSSL Toolkit and OpenSSL Project must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called OpenSSL + * nor may OpenSSL appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/) + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com) + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * This product includes software written by Tim Hudson (tjh@cryptsoft.com) + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] +========================================= +END OF OpenSSL NOTICES, INFORMATION, AND LICENSE + +%% Q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009�2014 Kristopher Michael Kowal. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +The file q.js is prefaced by the following additional third-party subcomponent information: + +/*! + * + * Copyright 2009-2012 Kris Kowal under the terms of the MIT + * license found at http://github.com/kriskowal/q/raw/master/LICENSE + * + * With parts by Tyler Close + * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found + * at http://www.opensource.org/licenses/mit-license.html + * Forked at ref_send.js version: 2009-05-11 + * + * With parts by Mark Miller + * Copyright (C) 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +========================================= +END OF Q NOTICES, INFORMATION, AND LICENSE + +%% safe-buffer NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF safe-buffer NOTICES, INFORMATION, AND LICENSE + +%% sax js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +==== + +`String.fromCodePoint` by Mathias Bynens used according to terms of MIT +License, as follows: + + Copyright Mathias Bynens + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF sax js NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% ShellJS NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF ShellJS NOTICES, INFORMATION, AND LICENSE + +%% topo NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/topo/graphs/contributors +========================================= +END OF topo NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% underscore.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2017 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF underscore.js NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% VSTS-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF VSTS-task-lib NOTICES, INFORMATION, AND LICENSE + +%% Xml2JS NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010, 2011, 2012, 2013. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF Xml2JS NOTICES, INFORMATION, AND LICENSE + +%% Xmlbuilder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF Xmlbuilder NOTICES, INFORMATION, AND LICENSE + +%% xtend NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014 Raynos. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF xtend NOTICES, INFORMATION, AND LICENSE + +%% @types/mocha NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/mocha NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/Utility.ps1 b/_generated/AzureFileCopyV4/Utility.ps1 new file mode 100644 index 000000000000..3ffbb3b258f4 --- /dev/null +++ b/_generated/AzureFileCopyV4/Utility.ps1 @@ -0,0 +1,1394 @@ +$featureFlags = @{ + retireAzureRM = [System.Convert]::ToBoolean($env:RETIRE_AZURERM_POWERSHELL_MODULE) + useOpenssLatestVersion = Get-VstsPipelineFeature -FeatureName 'UseOpensslv3.4.2' +} + +# Utility Functions used by AzureFileCopy.ps1 (other than azure calls) # + +$ErrorActionPreference = 'Stop' +$azureStackEnvironment = "AzureStack" +$jobId = $env:SYSTEM_JOBID; + +function Get-AzureCmdletsVersion +{ + return (Get-Module AzureRM -ListAvailable).Version +} + +function Get-AzureVersionComparison($azureVersion, $compareVersion) +{ + Write-Verbose "Compare azure versions: $azureVersion, $compareVersion" + return ($azureVersion -and $azureVersion -gt $compareVersion) +} + +function Get-AzureUtility +{ + $azureUtilityARM = "AzureUtilityARM.ps1" + $azUtilityVersion100 = "AzureUtilityAz1.0.ps1" + + if ($featureFlags.retireAzureRM) { + return $azUtilityVersion100 + } + else { + if (Get-Module Az.Accounts -ListAvailable){ + Write-Verbose "Az module is installed in the agent." + return $azUtilityVersion100 + } + Write-Warning "Az module is not installed in the agent." + return $azureUtilityARM + } +} + +function Get-Endpoint +{ + param([String] [Parameter(Mandatory=$true)] $connectedServiceName) + + $serviceEndpoint = Get-VstsEndpoint -Name "$connectedServiceName" + return $serviceEndpoint +} + +function Validate-AzurePowershellVersion +{ + Write-Verbose "Validating installed azure powershell version is greater than or equal to AzureRM 1.1.0" + if (!(Get-Module Az.Accounts -ListAvailable)){ + $currentVersion = Get-AzureCmdletsVersion + Write-Verbose "Installed Azure PowerShell version: $currentVersion" + + $minimumAzureVersion = New-Object System.Version(1, 1, 0) + $versionCompatible = Get-AzureVersionComparison -AzureVersion $currentVersion -CompareVersion $minimumAzureVersion + + if(!$versionCompatible) + { + Write-Telemetry "Task_InternalError" "UnsupportedAzurePSVersion" + Throw (Get-VstsLocString -Key "AFC_AzurePSNotInstalled" -ArgumentList $minimumAzureVersion) + } + + Write-Verbose "Validated the required azure powershell version is greater than or equal to 1.1.0" + } +} + +function Get-StorageKey +{ + param([string][Parameter(Mandatory=$true)]$storageAccountName, + [object][Parameter(Mandatory=$true)]$endpoint, + [string][Parameter(Mandatory=$false)]$connectedServiceNameARM) + + $storageAccountName = $storageAccountName.Trim() + + # checking azure powershell version to make calls to ARM endpoint + Validate-AzurePowershellVersion + + # getting storage account key from ARM endpoint + $storageKey = Get-AzureStorageKeyFromARM -storageAccountName $storageAccountName -serviceEndpoint $endpoint $connectedServiceNameARM + + return $storageKey +} + +function Get-blobStorageEndpoint +{ + param([string][Parameter(Mandatory=$true)]$storageAccountName, + [object][Parameter(Mandatory=$true)]$endpoint, + [string][Parameter(Mandatory=$false)]$connectedServiceNameARM) + + $storageAccountName = $storageAccountName.Trim() + + # getting storage account key from ARM endpoint + $blobStorageEndpoint = Get-AzureBlobStorageEndpointFromARM $storageAccountName $endpoint $connectedServiceNameARM + + return $blobStorageEndpoint +} + +function Get-StorageAccountType +{ + param([string][Parameter(Mandatory=$true)]$storageAccountName, + [object][Parameter(Mandatory=$true)]$endpoint, + [string][Parameter(Mandatory=$false)]$connectedServiceNameARM) + + $storageAccountName = $storageAccountName.Trim() + # getting storage account type from ARM endpoint + $storageAccountType = Get-AzureStorageAccountTypeFromARM $storageAccountName $endpoint $connectedServiceNameARM + + if($null -ne $storageAccountType) + { + return $storageAccountType.ToString() + } +} + +function ThrowError +{ + param([string]$errorMessage) + + $readmelink = "https://aka.ms/azurefilecopyreadme" + $helpMessage = (Get-VstsLocString -Key "AFC_AzureFileCopyMoreHelp" -ArgumentList $readmelink) + throw "$errorMessage $helpMessage" +} + +function ConvertTo-Pfx { + param( + [String][Parameter(Mandatory = $true)] $pemFileContent + ) + + if ($ENV:Agent_TempDirectory) { + $pemFilePath = "$ENV:Agent_TempDirectory\clientcertificate.pem" + $pfxFilePath = "$ENV:Agent_TempDirectory\clientcertificate.pfx" + $pfxPasswordFilePath = "$ENV:Agent_TempDirectory\clientcertificatepassword.txt" + } + else { + $pemFilePath = "$ENV:System_DefaultWorkingDirectory\clientcertificate.pem" + $pfxFilePath = "$ENV:System_DefaultWorkingDirectory\clientcertificate.pfx" + $pfxPasswordFilePath = "$ENV:System_DefaultWorkingDirectory\clientcertificatepassword.txt" + } + + # save the PEM certificate to a PEM file + Set-Content -Path $pemFilePath -Value $pemFileContent + + # use openssl to convert the PEM file to a PFX file + $pfxFilePassword = [System.Guid]::NewGuid().ToString() + + if (CmdletHasMember -cmdlet Set-Content -memberName NoNewline) { + Set-Content -Path $pfxPasswordFilePath -Value $pfxFilePassword -NoNewline + } + else { + [System.IO.File]::WriteAllText($pfxPasswordFilePath, $pfxFilePassword, [System.Text.Encoding]::ASCII) + } + + if (-not $featureFlags.useOpenssLatestVersion) { + $openSSLExePath = "$PSScriptRoot\ps_modules\VstsAzureHelpers_\opensslv4\openssl.exe" + $env:OPENSSL_CONF = "$PSScriptRoot\ps_modules\VstsAzureHelpers_\opensslv4\openssl.cnf" + } + else { + $openSSLExePath = "$PSScriptRoot\ps_modules\VstsAzureHelpers_\opensslv3.4.2\openssl.exe" + $env:OPENSSL_CONF = "$PSScriptRoot\ps_modules\VstsAzureHelpers_\opensslv3.4.2\openssl.cnf" + } + try { + $versionOutput = & $openSSLExePath version + Write-Verbose "OpenSSL version: $versionOutput" + } catch { + Write-Host "There was an error while getting the OpenSSL version $_" + } + $env:RANDFILE=".rnd" + + $openSSLArgs = "pkcs12 -export -in $pemFilePath -out $pfxFilePath -password file:`"$pfxPasswordFilePath`" -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -macalg sha1" + + Invoke-VstsTool -FileName $openSSLExePath -Arguments $openSSLArgs -RequireExitCodeZero + + return $pfxFilePath, $pfxFilePassword +} + +function Upload-FilesToAzureContainer +{ + param([string][Parameter(Mandatory=$true)]$sourcePath, + [object][Parameter(Mandatory=$true)]$endPoint, + [string][Parameter(Mandatory=$true)]$storageAccountName, + [string][Parameter(Mandatory=$true)]$containerName, + [string]$blobPrefix, + [string]$blobStorageEndpoint, + [string][Parameter(Mandatory=$true)]$azCopyLocation, + [string]$additionalArguments, + [string][Parameter(Mandatory=$true)]$destinationType, + [bool]$useDefaultArguments, + [string][Parameter(Mandatory=$false)]$containerSasToken = "", + [bool]$useSanitizerActivate = $false + ) + + try + { + $aadAuthorityUrl = "https://login.microsoftonline.com/" + if ($endpoint.Data.EnvironmentAuthorityUrl -ne $null) { + $aadAuthorityUrl = $endpoint.Data.EnvironmentAuthorityUrl + } + + Write-Verbose "AAD autority URL = $aadAuthorityUrl" + + if ($endPoint.Auth.Scheme -eq 'ServicePrincipal') { + try { + if($endPoint.Auth.Parameters.AuthenticationType -eq 'SPNCertificate') { + $pemFileContent = $endPoint.Auth.Parameters.ServicePrincipalCertificate + $pfxFilePath, $pfxFilePassword = ConvertTo-Pfx -pemFileContent $pemFileContent + + $env:AZCOPY_SPA_CERT_PASSWORD = $pfxFilePassword + Write-Output "##[command] & `"$azCopyExeLocation`" login --service-principal --application-id `"$($endPoint.Auth.Parameters.ServicePrincipalId)`" --certificate-path `"$($pfxFilePath)`" --tenant-id=`"$($endPoint.Auth.Parameters.TenantId)`" --aad-endpoint `"$aadAuthorityUrl`"" + + $command = "& `"$azCopyExeLocation`" login --service-principal --application-id `"$($endPoint.Auth.Parameters.ServicePrincipalId)`" --certificate-path `"$($pfxFilePath)`" --tenant-id=`"$($endPoint.Auth.Parameters.TenantId)`" --aad-endpoint `"$aadAuthorityUrl`"" + Invoke-Expression $command + } + else { + $env:AZCOPY_SPA_CLIENT_SECRET = $endPoint.Auth.Parameters.ServicePrincipalKey + Write-Output "##[command] & `"$azCopyExeLocation`" login --service-principal --application-id `"$($endPoint.Auth.Parameters.ServicePrincipalId)`" --tenant-id=`"$($endPoint.Auth.Parameters.TenantId)`" --aad-endpoint `"$aadAuthorityUrl`"" + + $command = "& `"$azCopyExeLocation`" login --service-principal --application-id `"$($endPoint.Auth.Parameters.ServicePrincipalId)`" --tenant-id=`"$($endPoint.Auth.Parameters.TenantId)`" --aad-endpoint `"$aadAuthorityUrl`"" + Invoke-Expression $command + } + } + catch { + # Provide an additional, custom, credentials-related error message. + $exceptionMessage = $_.Exception.Message.ToString() + Write-Verbose "ExceptionMessage: $exceptionMessage" + throw (New-Object System.Exception((Get-VstsLocString -Key ServicePrincipalError), $_.Exception)) + } + } + elseif ($endPoint.Auth.Scheme -eq 'ManagedServiceIdentity') { + Write-Output "##[command] & `"$azCopyExeLocation`" login --identity --aad-endpoint `"$aadAuthorityUrl`"" + + $command = "& `"$azCopyExeLocation`" login --identity --aad-endpoint `"$aadAuthorityUrl`"" + Invoke-Expression $command + + } + else { + throw (Get-VstsLocString -Key UnsupportedAuthScheme -ArgumentList $endPoint.Auth.Scheme) + } + + Write-Output (Get-VstsLocString -Key "AFC_UploadFilesStorageAccount" -ArgumentList $sourcePath, $storageAccountName, $containerName, $blobPrefix) + + $blobPrefix = $blobPrefix.Trim() + $trailingChars = [regex]::Escape("/") + '+$' + $blobPrefix = $blobPrefix -replace $trailingChars, "/" + $containerURL = [string]::Format("{0}/{1}/{2}", $blobStorageEndpoint.Trim("/"), $containerName, $blobPrefix.TrimStart("/")) + + $containerURL = $containerURL.Replace('$','`$') + $azCopyExeLocation = Join-Path -Path $azCopyLocation -ChildPath "AzCopy.exe" + + if ($useSanitizerActivate) { + $sanitizedArguments = [regex]::Split($additionalArguments, ' (?=(?:[^"]|"[^"]*")*$)') + Write-Output "##[command] & `"$azCopyExeLocation`" copy `"$sourcePath`" `"$containerURL`" $sanitizedArguments" + $uploadCommand = "& `"$azCopyExeLocation`" copy `"$sourcePath`" `"$containerURL`" $sanitizedArguments" + Invoke-Expression $uploadCommand + } else { + Write-Output "##[command] & `"$azCopyExeLocation`" copy `"$sourcePath`" `"$containerURL`" $additionalArguments" + $uploadToBlobCommand = "& `"$azCopyExeLocation`" copy `"$sourcePath`" `"$containerURL`" $additionalArguments" + Invoke-Expression $uploadToBlobCommand + } + + if($LASTEXITCODE -eq 0) + { + Write-Output (Get-VstsLocString -Key "AFC_UploadFileSuccessful" -ArgumentList $sourcePath, $storageAccountName, $containerName, $blobPrefix) + } + else + { + throw (Get-VstsLocString -Key "AFC_AzCopyBlobUploadNonZeroExitCode") + } + } + catch + { + # deletes container only if we have created temporary container + if ($destinationType -ne "AzureBlob") + { + Remove-AzureContainer -containerName $containerName -storageContext $storageContext + } + + $exceptionMessage = $_.Exception.Message.ToString() + Write-Verbose "ExceptionMessage: $exceptionMessage" + + $errorMessage = (Get-VstsLocString -Key "AFC_UploadContainerStorageAccount" -ArgumentList $containerName, $storageAccountName, $blobPrefix, $exceptionMessage) + Write-Telemetry "Task_InternalError" "BlobUploadFailed" + ThrowError -errorMessage $errorMessage + } + finally + { + #azcopy logout to remove all credentials + Write-Output "##[command] & `"$azCopyExeLocation`" logout" + $command = "& `"$azCopyExeLocation`" logout" + Invoke-Expression $command + } +} + +function Does-AzureVMMatchTagFilterCriteria +{ + param([object]$azureVMResource, + [string]$filter) + + if($azureVMResource) + { + # If no filters are provided, by default operations are performed on all azure resources + if([string]::IsNullOrEmpty($filter)) + { + return $true + } + + $tagsFilterArray = $filter.Split(';').Trim() + foreach($tag in $tagsFilterArray) + { + $tagKeyValue = $tag.Split(':').Trim() + $tagKey = $tagKeyValue[0] + $tagValues = $tagKeyValue[1] + + if($tagKeyValue.Length -ne 2 -or [string]::IsNullOrWhiteSpace($tagKey) -or [string]::IsNullOrWhiteSpace($tagValues)) + { + Write-Telemetry "Input_Validation" "FILTERING_IncorrectFormat" + throw (Get-VstsLocString -Key "AFC_IncorrectTags") + } + + $tagValueArray = $tagValues.Split(',').Trim() + + if($azureVMResource.Tags) + { + foreach($azureVMResourceTag in $azureVMResource.Tags.GetEnumerator()) + { + if($azureVMResourceTag.Key -contains $tagKey) + { + $azureVMTagValueArray = $azureVMResourceTag.Value.Split(",").Trim() + foreach($tagValue in $tagValueArray) + { + if($azureVMTagValueArray -contains $tagValue) + { + return $true + } + } + } + } + } + } + + return $false + } +} + +function Get-TagBasedFilteredAzureVMs +{ + param([object]$azureVMResources, + [string]$filter) + + if($azureVMResources) + { + $filteredAzureVMResources = @() + foreach($azureVMResource in $azureVMResources) + { + if(Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource -filter $filter) + { + Write-Verbose "azureVM with name: $($azureVMResource.Name) matches filter criteria" + $filteredAzureVMResources += $azureVMResource + } + } + + return $filteredAzureVMResources + } +} + +function Get-MachineBasedFilteredAzureVMs +{ + param([object]$azureVMResources, + [string]$filter) + + if($azureVMResources -and -not [string]::IsNullOrEmpty($filter)) + { + $filteredAzureVMResources = @() + + $machineFilterArray = $filter.Split(',').Trim() + $machineFilterArray = $machineFilterArray | % {$_.ToLower()} | Select -Uniq + foreach($machine in $machineFilterArray) + { + $azureVMResource = $azureVMResources | Where-Object {$_.Name -contains $machine} + if($azureVMResource) + { + $filteredAzureVMResources += $azureVMResource + } + else + { + $commaSeparatedMachinesNotPresentInRG += ($(if($commaSeparatedMachinesNotPresentInRG){", "}) + $machine) + } + + if($commaSeparatedMachinesNotPresentInRG -ne $null) + { + Write-Telemetry "Input_Validation" "FILTERING_MachinesNotPresentInRG" + throw (Get-VstsLocString -Key "AFC_MachineDoesNotExist" -ArgumentList $commaSeparatedMachinesNotPresentInRG) + } + } + + return $filteredAzureVMResources + } +} + +function Get-FilteredAzureVMsInResourceGroup +{ + param([object]$azureVMResources, + [string]$resourceFilteringMethod, + [string]$filter) + + if($azureVMResources -and -not [string]::IsNullOrEmpty($resourceFilteringMethod)) + { + if($resourceFilteringMethod -eq "tags" -or [string]::IsNullOrEmpty($filter)) + { + $filteredAzureVMResources = Get-TagBasedFilteredAzureVMs -azureVMResources $azureVMResources -filter $filter + } + else + { + $filteredAzureVMResources = Get-MachineBasedFilteredAzureVMs -azureVMResources $azureVMResources -filter $filter + } + + return $filteredAzureVMResources + } +} + +function Get-FilteredAzureClassicVMsInResourceGroup +{ + param([object]$azureClassicVMResources, + [string]$resourceFilteringMethod, + [string]$filter) + + if($azureClassicVMResources -and -not [string]::IsNullOrEmpty($resourceFilteringMethod)) + { + Write-Verbose "Filtering azureClassicVM resources with filtering option:'$resourceFilteringMethod' and filters:'$filter'" + $filteredAzureClassicVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureClassicVMResources -resourceFilteringMethod $resourceFilteringMethod -filter $filter + + return $filteredAzureClassicVMResources + } +} + +function Get-FilteredAzureRMVMsInResourceGroup +{ + param([object]$azureRMVMResources, + [string]$resourceFilteringMethod, + [string]$filter) + + if($azureRMVMResources -and -not [string]::IsNullOrEmpty($resourceFilteringMethod)) + { + Write-Verbose "Filtering azureRMVM resources with filtering option:$resourceFilteringMethod and filters:$filter" + $filteredAzureRMVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureRMVMResources -resourceFilteringMethod $resourceFilteringMethod -filter $filter + + return $filteredAzureRMVMResources + } +} + +function Get-MachineNameFromId +{ + param([string]$resourceGroupName, + [System.Collections.Hashtable]$map, + [string]$mapParameter, + [Object]$azureRMVMResources, + [boolean]$throwOnTotalUnavailability, + [string]$debugLogsFlag) + + if($map) + { + if($debugLogsFlag -eq "true") + { + Write-Verbose "Map for $mapParameter : " -verbose + Write-Verbose ($map | Format-List | Out-String) -verbose + + Write-Verbose "azureRMVMResources: " -verbose + Write-Verbose ($azureRMVMResources | Format-List | Out-String) -verbose + } + + Write-Verbose "throwOnTotalUnavailability: $throwOnTotalUnavailability" + + $errorCount = 0 + foreach($vm in $azureRMVMResources) + { + $value = $map[$vm.Id.ToLower()] + $resourceName = $vm.Name + if(-not [string]::IsNullOrEmpty($value)) + { + Write-Verbose "$mapParameter value for resource $resourceName is $value" + $map.Remove($vm.Id.ToLower()) + $map[$resourceName] = $value + } + else + { + $errorCount = $errorCount + 1 + Write-Verbose "Unable to find $mapParameter for resource $resourceName" + } + } + + if($throwOnTotalUnavailability -eq $true) + { + if($errorCount -eq $azureRMVMResources.Count -and $azureRMVMResources.Count -ne 0) + { + throw (Get-VstsLocString -Key "AFC_MachineNameFromIdErrorAllResources" -ArgumentList $mapParameter, $resourceGroupName) + } + else + { + if($errorCount -gt 0 -and $errorCount -ne $azureRMVMResources.Count) + { + Write-Warning (Get-VstsLocString -Key "AFC_MachineNameFromIdError" -ArgumentList $mapParameter, $errorCount, $resourceGroupName) + } + } + } + + return $map + } +} + +function Get-MachinesFqdnsForPublicIP +{ + param([string]$resourceGroupName, + [Object]$publicIPAddressResources, + [Object]$networkInterfaceResources, + [Object]$azureRMVMResources, + [System.Collections.Hashtable]$fqdnMap, + [string]$debugLogsFlag) + + if(-not [string]::IsNullOrEmpty($resourceGroupName)-and $publicIPAddressResources -and $networkInterfaceResources) + { + Write-Verbose "Trying to get FQDN for the azureRM VM resources under public IP from resource Group $resourceGroupName" + + #Map the ipc to the fqdn + foreach($publicIp in $publicIPAddressResources) + { + if(-not [string]::IsNullOrEmpty($publicIp.IpConfiguration.Id)) + { + $publicIPKey = $publicIp.IpConfiguration.Id.ToLower() + Write-Verbose "Adding entry to FQDN map with key $publicIPKey" + + if(-not [string]::IsNullOrEmpty($publicIP.DnsSettings.Fqdn)) + { + Write-Verbose "Inserting to FQDN map with value (FQDN) : $publicIPKey" + $fqdnMap[$publicIPKey] = $publicIP.DnsSettings.Fqdn + } + elseif(-not [string]::IsNullOrEmpty($publicIP.IpAddress)) + { + Write-Verbose "Inserting to FQDN map with value (IP Address) : $publicIPKey" + $fqdnMap[$publicIPKey] = $publicIP.IpAddress + } + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "fqdnMap for MachinesFqdnsForPublicIP after mapping ip configuration to fqdn: " -Verbose + Write-Verbose ($fqdnMap | Format-List | Out-String) -Verbose + } + + #Find out the NIC, and thus the VM corresponding to a given ipc + foreach($nic in $networkInterfaceResources) + { + foreach($ipc in $nic.IpConfigurations) + { + $fqdn = $fqdnMap[$ipc.Id.ToLower()] + if(-not [string]::IsNullOrEmpty($fqdn)) + { + $fqdnMap.Remove($ipc.Id.ToLower()) + if($nic.VirtualMachine) + { + $vmId = $nic.VirtualMachine.Id.ToLower() + Write-Verbose "Adding entry to FQDN map with key $vmId" + $fqdnMap[$vmId] = $fqdn + } + } + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "final fqdnMap for MachinesFqdnsForPublicIP after finding vm id corresponding to ip configuration: " -Verbose + Write-Verbose ($fqdnMap | Format-List | Out-String) -Verbose + } + } + + Write-Verbose "Got FQDN for the azureRM VM resources under public IP from resource Group $resourceGroupName" + + return $fqdnMap +} + +function Get-MachinesFqdnsForLB +{ + param([string]$resourceGroupName, + [Object]$publicIPAddressResources, + [Object]$networkInterfaceResources, + [Object]$frontEndIPConfigs, + [System.Collections.Hashtable]$fqdnMap, + [string]$debugLogsFlag) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and $publicIPAddressResources -and $networkInterfaceResources -and $frontEndIPConfigs) + { + Write-Verbose "Trying to get FQDN for the RM azureVM resources under load balancer from resource group: $resourceGroupName" + + #Map the public ip id to the fqdn + foreach($publicIp in $publicIPAddressResources) + { + if(-not [string]::IsNullOrEmpty($publicIp.IpConfiguration.Id)) + { + if(-not [string]::IsNullOrEmpty($publicIP.DnsSettings.Fqdn)) + { + $fqdnMap[$publicIp.Id.ToLower()] = $publicIP.DnsSettings.Fqdn + } + elseif(-not [string]::IsNullOrEmpty($publicIP.IpAddress)) + { + $fqdnMap[$publicIp.Id.ToLower()] = $publicIP.IpAddress + } + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "fqdnMap for MachinesFqdnsForLB after mapping ip configuration to fqdn: " -Verbose + Write-Verbose ($fqdnMap | Format-List | Out-String) -Verbose + } + + #Get the NAT rule for a given ip id + foreach($config in $frontEndIPConfigs) + { + if(-not [string]::IsNullOrEmpty($config.PublicIpAddress.Id)) + { + $fqdn = $fqdnMap[$config.PublicIpAddress.Id.ToLower()] + if(-not [string]::IsNullOrEmpty($fqdn)) + { + $fqdnMap.Remove($config.PublicIpAddress.Id.ToLower()) + foreach($rule in $config.InboundNatRules) + { + $fqdnMap[$rule.Id.ToLower()] = $fqdn + } + } + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "fqdnMap for MachinesFqdnsForLB after getting NAT rule for given ip configuration: " -Verbose + Write-Verbose ($fqdnMap | Format-List | Out-String) -Verbose + } + + #Find out the NIC, and thus the corresponding machine to which the NAT rule belongs + foreach($nic in $networkInterfaceResources) + { + foreach($ipc in $nic.IpConfigurations) + { + foreach($rule in $ipc.LoadBalancerInboundNatRules) + { + $fqdn = $fqdnMap[$rule.Id.ToLower()] + if(-not [string]::IsNullOrEmpty($fqdn)) + { + $fqdnMap.Remove($rule.Id.ToLower()) + if($nic.VirtualMachine) + { + $fqdnMap[$nic.VirtualMachine.Id.ToLower()] = $fqdn + } + } + } + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "final fqdnMap for MachinesFqdnsForLB after getting vm id corresponding to NAT rule for given ip configuration: " -Verbose + Write-Verbose ($fqdnMap | Format-List | Out-String) -Verbose + } + } + + Write-Verbose "Got FQDN for the RM azureVM resources under load balancer from resource Group $resourceGroupName" + + return $fqdnMap +} + +function Get-FrontEndPorts +{ + param([string]$backEndPort, + [System.Collections.Hashtable]$portList, + [Object]$networkInterfaceResources, + [Object]$inboundRules, + [string]$debugLogsFlag) + + if(-not [string]::IsNullOrEmpty($backEndPort) -and $networkInterfaceResources -and $inboundRules) + { + Write-Verbose "Trying to get front end ports for $backEndPort" + + $filteredRules = $inboundRules | Where-Object {$_.BackendPort -eq $backEndPort} + + #Map front end port to back end ipc + foreach($rule in $filteredRules) + { + if($rule.BackendIPConfiguration) + { + $portList[$rule.BackendIPConfiguration.Id.ToLower()] = $rule.FrontendPort + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "portList for FrontEndPorts after mapping front end port to backend ip configuration: " -Verbose + Write-Verbose ($portList | Format-List | Out-String) -Verbose + } + + #Get the nic, and the corresponding machine id for a given back end ipc + foreach($nic in $networkInterfaceResources) + { + foreach($ipConfig in $nic.IpConfigurations) + { + $frontEndPort = $portList[$ipConfig.Id.ToLower()] + if(-not [string]::IsNullOrEmpty($frontEndPort)) + { + $portList.Remove($ipConfig.Id.ToLower()) + if($nic.VirtualMachine) + { + $portList[$nic.VirtualMachine.Id.ToLower()] = $frontEndPort + } + } + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "portList for FrontEndPorts after getting vm id corresponding to given backend ip configuration, after finding nic: " -Verbose + Write-Verbose ($portList | Format-List | Out-String) -Verbose + } + } + + Write-Verbose "Got front end ports for $backEndPort" + return $portList +} + +function Get-AzureRMVMsConnectionDetailsInResourceGroup +{ + param([string]$resourceGroupName, + [object]$azureRMVMResources, + [string]$enableCopyPrerequisites, + [string]$connectedServiceName) + + [hashtable]$fqdnMap = @{} + $winRMHttpsPortMap = New-Object 'System.Collections.Generic.Dictionary[string, string]' + [hashtable]$azureRMVMsDetails = @{} + $debugLogsFlag= $env:system_debug + + # Getting endpoint used for the task + if($connectedServiceName) + { + $endpoint = Get-Endpoint -connectedServiceName $connectedServiceName + } + + $isAzureStackEnvironment = $false + if($endpoint -and $endpoint.Data -and $endpoint.Data.Environment) { + $environmentName = $Endpoint.Data.Environment + if($environmentName -eq $azureStackEnvironment) + { + $isAzureStackEnvironment = $true + } + } + + if (-not [string]::IsNullOrEmpty($resourceGroupName) -and $azureRMVMResources) + { + + if($isAzureStackEnvironment) + { + Write-Verbose "Fetching resource group resources details for Azure Stack environment." + $azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetailsForAzureStack -resourceGroupName $resourceGroupName ` + -azureRMVMResources $azureRMVMResources -endpoint $endpoint -connectedServiceNameARM $connectedServiceName + } + else + { + Write-Verbose "Fetching resource group resources details for Azure/National cloud environments." + $azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetails -resourceGroupName $resourceGroupName -azureRMVMResources $azureRMVMResources + } + + $networkInterfaceResources = $azureRGResourcesDetails["networkInterfaceResources"] + $publicIPAddressResources = $azureRGResourcesDetails["publicIPAddressResources"] + $loadBalancerResources = $azureRGResourcesDetails["loadBalancerResources"] + + if($loadBalancerResources) + { + foreach($lbName in $loadBalancerResources.Keys) + { + $lbDetails = $loadBalancerResources[$lbName] + $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"] + $inboundRules = $lbDetails["inboundRules"] + + $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $resourceGroupName -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources ` + -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap -debugLogsFlag $debugLogsFlag + $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources ` + -inboundRules $inboundRules -debugLogsFlag $debugLogsFlag + } + + $winRMHttpsPortMap = Get-MachineNameFromId -Map $winRMHttpsPortMap -MapParameter "Front End port" -azureRMVMResources $azureRMVMResources ` + -throwOnTotalUnavailability $false -debugLogsFlag $debugLogsFlag + } + + $fqdnMap = Get-MachinesFqdnsForPublicIP -resourceGroupName $resourceGroupName -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources ` + -azureRMVMResources $azureRMVMResources -fqdnMap $fqdnMap -debugLogsFlag $debugLogsFlag + $fqdnMap = Get-MachineNameFromId -resourceGroupName $resourceGroupName -Map $fqdnMap -MapParameter "FQDN" -azureRMVMResources $azureRMVMResources ` + -throwOnTotalUnavailability $true -debugLogsFlag $debugLogsFlag + + foreach ($resource in $azureRMVMResources) + { + $resourceName = $resource.Name + $resourceId = $resource.Id + $resourceFQDN = $fqdnMap[$resourceName] + $resourceWinRMHttpsPort = $winRMHttpsPortMap[$resourceName] + if([string]::IsNullOrWhiteSpace($resourceWinRMHttpsPort)) + { + Write-Verbose "Defaulting WinRmHttpsPort of $resourceName to 5986" + $resourceWinRMHttpsPort = "5986" + } + + $resourceProperties = @{} + $resourceProperties.Name = $resourceName + $resourceProperties.fqdn = $resourceFQDN + $resourceProperties.winRMHttpsPort = $resourceWinRMHttpsPort + + $azureRMVMsDetails.Add($resourceName, $resourceProperties) + + if ($enableCopyPrerequisites -eq "true") + { + Write-Verbose "Enabling winrm for virtual machine $resourceName" -Verbose + Add-AzureVMCustomScriptExtension -resourceGroupName $resourceGroupName -vmId $resourceId -vmName $resourceName -dnsName $resourceFQDN ` + -location $resource.Location -connectedServiceName $connectedServiceName + } + } + + return $azureRMVMsDetails + } +} + +function Get-AzureVMResourcesProperties +{ + param([string]$resourceGroupName, + [string]$resourceFilteringMethod, + [string]$machineNames, + [string]$enableCopyPrerequisites, + [string]$connectedServiceName) + + $machineNames = $machineNames.Trim() + if(-not [string]::IsNullOrEmpty($resourceGroupName)) + { + $azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $resourceGroupName + $filteredAzureRMVMResources = Get-FilteredAzureRMVMsInResourceGroup -azureRMVMResources $azureRMVMResources -resourceFilteringMethod $resourceFilteringMethod -filter $machineNames + $azureVMsDetails = Get-AzureRMVMsConnectionDetailsInResourceGroup -resourceGroupName $resourceGroupName -azureRMVMResources $filteredAzureRMVMResources ` + -enableCopyPrerequisites $enableCopyPrerequisites -connectedServiceName $connectedServiceName + + # throw if no azure VMs found in resource group or due to filtering + if($azureVMsDetails.Count -eq 0) + { + if([string]::IsNullOrEmpty($machineNames)) + { + Write-Telemetry "Input_Validation" "PREREQ_NoRMVMResources" + throw (Get-VstsLocString -Key "AFC_NoARMVMResources" -ArgumentList $resourceGroupName, $connectedServiceName) + } + else + { + Write-Telemetry "Input_Validation" "FILTERING_NoVMResources" + throw (Get-VstsLocString -Key "AFC_FilteringNoVMResources" -ArgumentList $resourceGroupName, $resourceFilteringMethod, $machineNames) + } + } + + return $azureVMsDetails + } +} + +function Get-AzureVMsCredentials +{ + param([string][Parameter(Mandatory=$true)]$vmsAdminUserName, + [string][Parameter(Mandatory=$true)]$vmsAdminPassword) + + Write-Verbose "Azure VMs Admin Username: $vmsAdminUserName" + $azureVmsCredentials = New-Object 'System.Net.NetworkCredential' -ArgumentList $vmsAdminUserName, $vmsAdminPassword + + return $azureVmsCredentials +} + +function Copy-FilesParallellyToAzureVMs +{ + param( + [string[]]$targetMachineNames, + [pscredential]$credential, + [string]$protocol, + [object]$remoteScriptJobArguments, + [object]$sessionOption, + [bool]$enableDetailedLogging + ) + + Write-Verbose "Starting parallel file copy" + + try + { + $parallelCopyJobResults = Invoke-RemoteScript -targetMachineNames $targetMachineNames ` + -credential $credential ` + -protocol $protocol ` + -remoteScriptJobArguments $remoteScriptJobArguments ` + -sessionOption $sessionOption ` + -uploadLogFiles:$enableDetailedLogging + + Write-Verbose "Parallel file copy: Invoke-RemoteScript completed" + } + catch + { + Write-Verbose "Parallel file copy: Invoke-RemoteScript threw exception" + throw + } + + # Write job status for every VM + $isFileCopyFailed = $false + $parallelCopyJobResults | ForEach-Object { + if($_.ExitCode -eq 0) + { + Write-Verbose "Copy source files status for $($_.ComputerName): Successful" + } + else + { + $isFileCopyFailed = $true + Write-Verbose "Copy source files status for $($_.ComputerName): Failed" + } + } + + # Throw if any of the remote jobs failed + if($isFileCopyFailed) + { + ThrowError -errorMessage (Get-VstsLocString -Key "AFC_ParallelCopyFailed") + } + + Write-Verbose "Successfully finished parallel file copy" +} + +function Copy-FilesSequentiallyToAzureVMs +{ + param( + [string[]]$targetMachineNames, + [pscredential]$credential, + [string]$protocol, + [object]$remoteScriptJobArguments, + [object]$sessionOption, + [bool]$enableDetailedLogging + ) + + Write-Verbose "Starting sequential file copy" + + $targetMachineNames | ForEach-Object { + Write-Output (Get-VstsLocString -Key "AFC_CopyStarted" -ArgumentList $_) + $targetMachineName = @($_) + + try + { + $copyJobResult = Invoke-RemoteScript -targetMachineNames $targetMachineName ` + -credential $credential ` + -protocol $protocol ` + -remoteScriptJobArguments $remoteScriptJobArguments ` + -sessionOption $sessionOption ` + -uploadLogFiles:$enableDetailedLogging + + Write-Verbose "Sequential file copy: Invoke-RemoteScript completed" + } + catch + { + Write-Verbose "Sequential file copy: Invoke-RemoteScript threw exception" + throw + } + + if($copyJobResult.ExitCode -eq 0) + { + Write-Verbose "Copy source files status for $_ : Successful" + } + else + { + Write-Verbose "Copy source files status for $_ : Failed" + ThrowError -errorMessage (Get-VstsLocString -Key "AFC_CopyFailed" -ArgumentList $_) + } + } + + Write-Verbose "Successfully finished sequential file copy" +} + +function Copy-FilesToAzureVMsFromStorageContainer +{ + param( + [string[]]$targetMachineNames, + [pscredential]$credential, + [string]$protocol, + [object]$sessionOption, + [string]$blobStorageEndpoint, + [string]$containerName, + [string]$containerSasToken, + [string]$targetPath, + [bool]$cleanTargetBeforeCopy, + [bool]$copyFilesInParallel, + [string]$additionalArguments, + [string]$azCopyToolLocation, + [scriptblock]$fileCopyJobScript, + [bool]$enableDetailedLogging, + [bool]$useSanitizerActivate = $false + ) + + # Generate storage container URL + $containerURL = [string]::Format("{0}/{1}", $blobStorageEndpoint.Trim("/"), $containerName) + + $azCopyToolFileNames = Get-ChildItem $azCopyToolLocation | Select-Object -ExpandProperty Name + $azCopyToolFilePaths = Get-ChildItem $azCopyToolLocation | Select-Object -ExpandProperty FullName + + $azCopyToolFileContents = @() + + foreach ($file in $azCopyToolFilePaths) + { + $azCopyToolFileContents += [Convert]::ToBase64String([System.IO.File]::ReadAllBytes($file)) + } + + # script block arguments + $scriptBlockArgs = " -containerURL '$containerURL' -targetPath '$targetPath' -containerSasToken '$containerSasToken' -additionalArguments '$additionalArguments'" + if($cleanTargetBeforeCopy) + { + $scriptBlockArgs += " -CleanTargetBeforeCopy" + } + if($enableDetailedLogging) + { + $scriptBlockArgs += " -EnableDetailedLogging" + } + if($useSanitizerActivate) + { + $scriptBlockArgs += " -useSanitizerActivate" + } + + $remoteScriptJobArguments = @{ + inline = $true; + inlineScript = $fileCopyJobScript.ToString(); + scriptArguments = $scriptBlockArgs; + errorActionPreference = "Stop"; + failOnStdErr = $true; + } + + if($copyFilesInParallel) + { + Copy-FilesParallellyToAzureVMs -targetMachineNames $targetMachineNames ` + -credential $credential ` + -protocol $protocol ` + -remoteScriptJobArguments $remoteScriptJobArguments ` + -sessionOption $sessionOption ` + -enableDetailedLogging $enableDetailedLogging + } + else + { + Copy-FilesSequentiallyToAzureVMs -targetMachineNames $targetMachineNames ` + -credential $credential ` + -protocol $protocol ` + -remoteScriptJobArguments $remoteScriptJobArguments ` + -sessionOption $sessionOption ` + -enableDetailedLogging $enableDetailedLogging + } +} + +function Validate-CustomScriptExecutionStatus +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$extensionName, + [object]$endpoint, + [string]$connectedServiceNameARM) + + Write-Verbose "Validating the winrm configuration custom script extension status" + + $isScriptExecutionPassed = $true + try + { + $status = Get-AzureMachineStatus -resourceGroupName $resourceGroupName -Name $vmName + + # For AzurePS < 1.0.4 $_.ExtensionType is applicable. + $customScriptExtension = $status.Extensions | Where-Object { ($_.ExtensionType -eq "Microsoft.Compute.CustomScriptExtension" -or $_.Type -eq "Microsoft.Compute.CustomScriptExtension") -and $_.Name -eq $extensionName } + + if($customScriptExtension) + { + $subStatuses = $customScriptExtension.SubStatuses + $subStatusesStr = $subStatuses | Out-String + + Write-Verbose "Custom script extension execution statuses: $subStatusesStr" + + if($subStatuses) + { + foreach($subStatus in $subStatuses) + { + if($subStatus.Code.Contains("ComponentStatus/StdErr") -and (-not [string]::IsNullOrEmpty($subStatus.Message))) + { + $isScriptExecutionPassed = $false + $errMessage = $subStatus.Message + break + } + } + } + else + { + $isScriptExecutionPassed = $false + $errMessage = "No execution status exists for the custom script extension '$extensionName'" + } + } + else + { + $isScriptExecutionPassed = $false + $errMessage = "No custom script extension '$extensionName' exists" + } + } + catch + { + $isScriptExecutionPassed = $false + $errMessage = $_.Exception.Message + } + + if(-not $isScriptExecutionPassed) + { + $response = Remove-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName ` + -endpoint $endpoint -connectedServiceNameARM $connectedServiceNameARM + throw (Get-VstsLocString -Key "AFC_SetCustomScriptExtensionFailed" -ArgumentList $extensionName, $vmName, $errMessage) + } + + Write-Verbose "Validated the script execution successfully" +} + +function Is-WinRMCustomScriptExtensionExists +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$extensionName, + [string]$connectedServiceName) + + $isExtensionExists = $true + $removeExtension = $false + + try + { + $serviceEndpoint=Get-Endpoint $connectedServiceName + $customScriptExtension = Get-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName ` + -endpoint $serviceEndpoint -connectedServiceNameARM $connectedServiceName + + if($customScriptExtension) + { + if($customScriptExtension.ProvisioningState -ne "Succeeded") + { + $removeExtension = $true + } + else + { + try + { + Validate-CustomScriptExecutionStatus -resourceGroupName $resourceGroupName -vmName $vmName -extensionName $extensionName -endpoint $serviceEndpoint + } + catch + { + $isExtensionExists = $false + } + } + } + else + { + $isExtensionExists = $false + } + } + catch + { + $isExtensionExists = $false + } + + if($removeExtension) + { + $response = Remove-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName ` + -endpoint $serviceEndpoint -connectedServiceNameARM $connectedServiceName + + try + { + $index = 1 + $maxCount = 45 # Setting timeout for deleting extension as 15 mins. + + while($index -le $maxCount) { + Write-Verbose "Checking WinRM custom script extension status $index times" + + $customScriptExtension = Get-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName ` + -endpoint $serviceEndpoint -connectedServiceNameARM $connectedServiceName + + if(-not $customScriptExtension -or $customScriptExtension.ProvisioningState -ne "deleting") + { + break + } + + start-sleep -s 20 + $index = $index + 1 + } + } + catch + { + Write-Verbose ("Failed to get extension with error : " + $_.exception.message) + } + + if ($index -gt $maxCount) + { + Write-Warning (Get-VstsLocString -Key AFC_UninstallWinRMCustomScriptExtension) + } + + $isExtensionExists = $false + } + + $isExtensionExists +} + +function Get-TargetUriFromFwdLink { + param( + [string]$fwdLink + ) + Write-Verbose "Trying to get the target uri from the fwdLink: $fwdLink" + $proxy = Get-VstsWebProxy + Add-Type -AssemblyName System.Net.Http + $validHttpRedirectCodes = @( + [System.Net.HttpStatusCode]::Moved, + [System.Net.HttpStatusCode]::MovedPermanently, + [System.Net.HttpStatusCode]::Found, + [System.Net.HttpStatusCode]::Redirect, + [System.Net.HttpStatusCode]::RedirectKeepVerb, + [System.Net.HttpStatusCode]::TemporaryRedirect + ) + $HttpClientHandler = New-Object System.Net.Http.HttpClientHandler + $HttpClientHandler.Proxy = $proxy + $HttpClientHandler.AllowAutoRedirect = $false + $HttpClient = New-Object System.Net.Http.HttpClient -ArgumentList $HttpClientHandler + $response = $HttpClient.GetAsync($fwdLink) + $response.Wait() + if($validHttpRedirectCodes.IndexOf($response.Result.StatusCode) -eq -1) { + Write-Verbose "The http response code: $([int]$response.Result.StatusCode) is not a valid redirect response code." + throw (Get-VstsLocString -Key "AFC_RedirectResponseInvalidStatusCode" -ArgumentList $([int]$response.Result.StatusCode)) + } + $targetUri = $response.Result.Headers.Location.AbsoluteUri + if([string]::IsNullOrEmpty($targetUri)) { + Write-Verbose "The target uri is null" + throw (Get-VstsLocString -Key "AFC_RedirectResponseLocationHeaderIsNull") + } + Write-Verbose "The target uri is: $targetUri" + return $targetUri +} + +function Add-WinRMHttpsNetworkSecurityRuleConfig +{ + param([string]$resourceGroupName, + [string]$vmId, + [string]$ruleName, + [string]$rulePriotity, + [string]$winrmHttpsPort) + + Write-Verbose "Trying to add a network security group rule" + + try + { + $securityGroups = Get-NetworkSecurityGroups -resourceGroupName $resourceGroupName -vmId $vmId + + if($securityGroups.Count -gt 0) + { + Add-NetworkSecurityRuleConfig -resourceGroupName $resourceGroupName -securityGroups $securityGroups -ruleName $ruleName -rulePriotity $rulePriotity -winrmHttpsPort $winrmHttpsPort + } + } + catch + { + Write-Telemetry "Task_InternalError" "NetworkSecurityRuleConfigFailed" + Write-Warning (Get-VstsLocString -Key "AFC_AddNetworkSecurityRuleFailed" -ArgumentList $_.exception.message) + } +} + +function Add-AzureVMCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmId, + [string]$vmName, + [string]$dnsName, + [string]$location, + [string]$connectedServiceName) + + $configWinRMScriptFileFwdLink ="https://aka.ms/vstsconfigurewinrm" + $makeCertFileFwdLink ="https://aka.ms/vstsmakecertexe" + $scriptToRun="ConfigureWinRM.ps1" + $extensionName="WinRMCustomScriptExtension" + $ruleName = "VSO-Custom-WinRM-Https-Port" + $rulePriotity="3986" + $winrmHttpsPort = "5986" + + Write-Verbose "Adding custom script extension '$extensionName' for virtual machine '$vmName'" + Write-Verbose "VM Location : $location" + Write-Verbose "VM DNS : $dnsName" + + try + { + $endpoint = Get-Endpoint $connectedServiceName + $isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $resourceGroupName -vmName $vmName -extensionName $extensionName ` + -connectedServiceName $connectedServiceName + Write-Verbose -Verbose "IsExtensionExists: $isExtensionExists" + + if($isExtensionExists) + { + Add-WinRMHttpsNetworkSecurityRuleConfig -resourceGroupName $resourceGroupName -vmId $vmId -ruleName $ruleName -rulePriotity $rulePriotity -winrmHttpsPort $winrmHttpsPort + + Write-Verbose "Skipping the addition of custom script extension '$extensionName' as it already exists" + return + } + + $configWinRMScriptFile = Get-TargetUriFromFwdLink -fwdLink $configWinRMScriptFileFwdLink + $makeCertFile = Get-TargetUriFromFwdLink -fwdLink $makeCertFileFwdLink + + $result = Set-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName -fileUri $configWinRMScriptFile, $makeCertFile -run $scriptToRun -argument $dnsName -location $location + $resultDetails = $result | ConvertTo-Json + Write-Verbose "Set-AzureMachineCustomScriptExtension completed with response : $resultDetails" + + if($result.Status -ne "Succeeded") + { + Write-Telemetry "Task_InternalError" "ProvisionVmCustomScriptFailed" + + $response = Remove-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName ` + -endpoint $endpoint -connectedServiceNameARM $connectedServiceName + throw (Get-VstsLocString -Key "AFC_UnableToSetCustomScriptExtension" -ArgumentList $extensionName, $vmName, $result.Error.Message) + } + + Validate-CustomScriptExecutionStatus -resourceGroupName $resourceGroupName -vmName $vmName -extensionName $extensionName -endpoint $endpoint + Add-WinRMHttpsNetworkSecurityRuleConfig -resourceGroupName $resourceGroupName -vmId $vmId -ruleName $ruleName -rulePriotity $rulePriotity -winrmHttpsPort $winrmHttpsPort + } + catch + { + Write-Telemetry "Task_InternalError" "ExecutionOfVmCustomScriptFailed:$exceptionType" + throw (Get-VstsLocString -Key "AFC_CopyPrereqsFailed" -ArgumentList $_.exception.message) + } + + Write-Verbose "Successfully added the custom script extension '$extensionName' for virtual machine '$vmName'" +} + +function Check-ContainerNameAndArgs +{ + param([string]$containerName, + [string]$additionalArguments) + + $additionalArguments = ' ' + $additionalArguments + ' ' + if($containerName -eq '$root' -and $additionalArguments -like '* --recursive *') + { + Write-Warning (Get-vstsLocString -Key "AFC_RootContainerAndDirectory") + } +} + +function Get-InvokeRemoteScriptParameters +{ + param([object][Parameter(Mandatory=$true)]$azureVMResourcesProperties, + [object]$networkCredentials, + [bool]$skipCACheck) + + $sessionOption = New-PSSessionOption -SkipCACheck:$skipCACheck + + $psCredentials = New-Object PSCredential($networkCredentials.UserName, (ConvertTo-SecureString $networkCredentials.Password -AsPlainText -Force)) + + $targetMachines = @() + foreach($vm in $azureVMResourcesProperties.Values) + { + $targetMachines += [string]::Format("{0}:{1}", $vm.fqdn, $vm.winRMHttpsPort) + } + + $protocol = 'https' + + return @{ + targetMachineNames = $targetMachines; + credential = $psCredentials; + protocol = $protocol; + sessionOption = $sessionOption + } +} + +function CleanUp-PSModulePathForHostedAgent { + + # Define the module paths to clean up + $modulePaths = @( + "C:\Modules\azurerm_2.1.0", + "C:\\Modules\azurerm_2.1.0", + "C:\Modules\azure_2.1.0", + "C:\\Modules\azure_2.1.0" + ) + + # Clean up PSModulePath for hosted agent + $newEnvPSModulePath = $env:PSModulePath + + foreach ($modulePath in $modulePaths) { + if ($newEnvPSModulePath.split(";") -contains $modulePath) { + $newEnvPSModulePath = (($newEnvPSModulePath).Split(";") | ? { $_ -ne $modulePath }) -join ";" + Write-Verbose "$modulePath removed. Restart the prompt for the changes to take effect." + } + else { + Write-Verbose "$modulePath is not present in $newEnvPSModulePath" + } + } + + if (Test-Path "C:\Modules\az_*") { + $azPSModulePath = (Get-ChildItem "C:\Modules\az_*" -Directory ` + | Sort-Object { [version]$_.Name.Split('_')[-1] } ` + | Select-Object -Last 1).FullName + + Write-Verbose "Found Az module path $azPSModulePath, will be used" + $env:PSModulePath = ($azPSModulePath + ";" + $newEnvPSModulePath).Trim(";") + } +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/icon.png b/_generated/AzureFileCopyV4/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7360d562f9528de743293a050cadba09609f1e77 GIT binary patch literal 517 zcmV+g0{Z=lP)j0{%rBW#} zL?Qq|2%sDWAi?{9h-hD&fjHyh!?`J9mp^$L&bvBK!faY~60bl|TRW^Lao9(f=%Gx5;^%TIRMEzh`dye~S zfW2m$r*8PzyRBtbmpnIJ0MK~pvDa+#(CI~9o^ru+*9A6{1KhWJ@!C*C2A<31263Co z0q#4>&1>)4S_8x8`##2)&;0p|{VpiHdKMds1l<@Tz!SiBZq6E@t1P?Fz#%|=BOM3g z7#DYYRc(ZAcUP_MEoaX=oIU%I?gKyYs;ahz=5Bq(CcgIpP%70(pw28D00000NkvXX Hu0mjf@i*zm literal 0 HcmV?d00001 diff --git a/_generated/AzureFileCopyV4/icon.svg b/_generated/AzureFileCopyV4/icon.svg new file mode 100644 index 000000000000..3debdb04649f --- /dev/null +++ b/_generated/AzureFileCopyV4/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/_generated/AzureFileCopyV4/make.json b/_generated/AzureFileCopyV4/make.json new file mode 100644 index 000000000000..130d5d90b44f --- /dev/null +++ b/_generated/AzureFileCopyV4/make.json @@ -0,0 +1,67 @@ +{ + "rm": [ + { + "items": [ + "node_modules/https-proxy-agent/node_modules/agent-base", + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/agent-base", + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/azure-pipelines-task-lib" + ], + "options": "-Rf" + } + ], + "common": [ + { + "module": "../Common/VstsAzureHelpers_", + "type": "ps" + }, + { + "module": "../Common/VstsAzureRestHelpers_", + "type": "ps" + }, + { + "module": "../Common/Deployment/TelemetryHelper", + "type": "ps" + }, + { + "module": "../Common/TlsHelper_", + "type": "ps" + }, + { + "module": "../Common/RemoteDeployer", + "type": "ps" + }, + { + "module": "../Common/Sanitizer", + "type": "ps" + } + ], + "externals": { + "archivePackages": [ + { + "url": "https://vstsagenttools.blob.core.windows.net/tools/azcopy/10.8/AzCopy.zip", + "dest": "./" + } + ], + "nugetv2": [ + { + "name": "VstsTaskSdk", + "version": "0.21.0", + "repository": "https://www.powershellgallery.com/api/v2/", + "cp": [ + { + "source": [ + "*.dll", + "*.ps1", + "*.psd1", + "*.psm1", + "lib.json", + "Strings" + ], + "dest": "ps_modules/VstsTaskSdk/", + "options": "-R" + } + ] + } + ] + } +} diff --git a/_generated/AzureFileCopyV4/package-lock.json b/_generated/AzureFileCopyV4/package-lock.json new file mode 100644 index 000000000000..337704a26973 --- /dev/null +++ b/_generated/AzureFileCopyV4/package-lock.json @@ -0,0 +1,1741 @@ +{ + "name": "AzureFileCopyV4", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "AzureFileCopyV4", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^24.10.0", + "@types/q": "1.0.7", + "agent-base": "6.0.2", + "azure-pipelines-task-lib": "^5.2.7", + "azure-pipelines-tasks-azure-arm-rest": "^3.274.0", + "moment": "^2.29.4", + "uuid": "^8.3.0" + }, + "devDependencies": { + "typescript": "^5.7.2" + } + }, + "node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha1-Qv4MyrI4QdmQWBLFjxCC0neEVm0=", + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.10.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-auth/-/core-auth-1.10.1.tgz", + "integrity": "sha1-aKF/qGHr0U9v0xQFV5g1Xva+3xs=", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-util": "^1.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.10.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-client/-/core-client-1.10.1.tgz", + "integrity": "sha1-g9ePl9ZHqyLmgRp6aLtCI+eh0Bk=", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.23.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-rest-pipeline/-/core-rest-pipeline-1.23.0.tgz", + "integrity": "sha1-NfFuHBgMqVRcJgrBJLdRvh2pwIw=", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.3.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-tracing/-/core-tracing-1.3.1.tgz", + "integrity": "sha1-6XEEXJAeqcEQYWsOHbJyUHeB1fY=", + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.13.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-util/-/core-util-1.13.1.tgz", + "integrity": "sha1-bf8v9tPJxkMMb007PmXeUx8Quv4=", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/identity": { + "version": "4.13.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/identity/-/identity-4.13.1.tgz", + "integrity": "sha1-vcCRZYuqWaR+6furSHpLsBhym8M=", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.17.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^5.5.0", + "@azure/msal-node": "^5.1.0", + "open": "^10.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/logger/-/logger-1.3.0.tgz", + "integrity": "sha1-VQHPhdT1JjBgKozHXfdlaMlpqCc=", + "license": "MIT", + "dependencies": { + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/msal-browser": { + "version": "5.6.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-browser/-/msal-browser-5.6.3.tgz", + "integrity": "sha1-3JC+l9ChwY28kyDp5n7cMpaXfqk=", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.4.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": { + "version": "16.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-16.4.1.tgz", + "integrity": "sha1-HVDFiCd6yXqCMZEwIyP8YMmoNXQ=", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "13.3.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-13.3.1.tgz", + "integrity": "sha512-Lrk1ozoAtaP/cp53May3v6HtcFSVxdFrg2Pa/1xu5oIvsIwhxW6zSPibKefCOVgd5osgykMi5jjcZHv8XkzZEQ==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-5.1.2.tgz", + "integrity": "sha1-FeqtaVmWayqII0+1aJLXuNavnWI=", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.4.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@azure/msal-node/node_modules/@azure/msal-common": { + "version": "16.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-16.4.1.tgz", + "integrity": "sha1-HVDFiCd6yXqCMZEwIyP8YMmoNXQ=", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mocha": { + "version": "5.2.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "node_modules/@types/node": { + "version": "24.10.14", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-24.10.14.tgz", + "integrity": "sha1-N0VQoH4kyeTmBM6t+t3sTdYPqpA=", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/q": { + "version": "1.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/q/-/q-1.0.7.tgz", + "integrity": "sha512-0WS7XU7sXzQ7J1nbnMKKYdjrrFoO3YtZYgUzeV8JFXffPnHfvSJQleR70I8BOAsOm14i4dyaAZ3YzqIl1YhkXQ==" + }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.3.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.5.tgz", + "integrity": "sha1-zMmzVGSqjakJgtAFU9SaXFkdlfM=", + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@typespec/ts-http-runtime/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha1-48121MVI7oldPD/Y3B9sW5Ay56g=", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@typespec/ts-http-runtime/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha1-2o3+rH2hMLBcK6S1nJts1mYRprk=", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/adm-zip": { + "version": "0.5.14", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/adm-zip/-/adm-zip-0.5.14.tgz", + "integrity": "sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/async-mutex": { + "version": "0.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/async-mutex/-/async-mutex-0.4.1.tgz", + "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/azure-devops-node-api": { + "version": "15.1.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-devops-node-api/-/azure-devops-node-api-15.1.3.tgz", + "integrity": "sha1-X6phYKWoJOiNKVj3nCDsPWbH0VM=", + "license": "MIT", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "2.1.0" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/azure-devops-node-api/node_modules/typed-rest-client": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typed-rest-client/-/typed-rest-client-2.1.0.tgz", + "integrity": "sha1-8Exs/KvGASwtA2uAbqrEVWBPFZg=", + "license": "MIT", + "dependencies": { + "des.js": "^1.1.0", + "js-md4": "^0.3.2", + "qs": "^6.10.3", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/azure-pipelines-task-lib": { + "version": "5.2.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.2.7.tgz", + "integrity": "sha1-pY9MlvwgHQQKkQ7iINpX6lthWlg=", + "license": "MIT", + "dependencies": { + "adm-zip": "^0.5.10", + "minimatch": "^3.1.5", + "nodejs-file-downloader": "^4.11.1", + "q": "^1.5.1", + "semver": "^5.7.2", + "shelljs": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "node_modules/azure-pipelines-task-lib/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest": { + "version": "3.274.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tasks-azure-arm-rest/-/azure-pipelines-tasks-azure-arm-rest-3.274.0.tgz", + "integrity": "sha1-b7Zug9HepCuIlzCMhBzboQw+uyI=", + "license": "MIT", + "dependencies": { + "@azure/identity": "^4.13.1", + "@types/jsonwebtoken": "^8.5.8", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "async-mutex": "^0.4.0", + "azure-devops-node-api": "^15.1.3", + "azure-pipelines-task-lib": "^5.2.4", + "https-proxy-agent": "^4.0.0", + "jsonwebtoken": "^9.0.3", + "msalv1": "npm:@azure/msal-node@^1.18.4", + "msalv2": "npm:@azure/msal-node@^2.7.0", + "msalv3": "npm:@azure/msal-node@^3.5.3", + "node-fetch": "^2.6.7", + "q": "1.5.1", + "typed-rest-client": "^2.2.0", + "xml2js": "0.6.2" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/agent-base": { + "version": "5.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha1-q5tFRGblqMw6GHvqrVgEEqnFuEM=", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/braces/-/braces-3.0.3.tgz", + "integrity": "sha1-SQMy9AkZRSJy1VqEgK3AxEE1h4k=", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", + "license": "BSD-3-Clause" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha1-87lrNBYNZDGhnXaIE1r3z7h5eIk=", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha1-S1QowiK+mF15w9gmV0edvgtZstY=", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha1-I43pNdKippKSjFOMfM+pEGf9Bio=", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha1-ilj+ePANzXDDcEUXWd+/rwPo7p8=", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha1-J5LohvJCKJRUWUfMgOGkRElsWXY=", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha1-96fMuPUQS/jg9xujscz6Xq/bIeg=", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha1-27Ga37dG1/xtc0oGty9KANAhJV8=", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha1-HTf1dm87v/Tuljjocah2jBc7gdo=", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha1-165mfh3INIL4tw/Q9u78UNow9Yo=", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha1-rg8PothQRe8UqBfao86azQSJ5b8=", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha1-mD6y+aZyTpMD9hrd8BHHLgngsPo=", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha1-BfdaJdq5jk+x3NXhRywFRtUFfI8=", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha1-HE8sSDcydZfOadLKGQp/3RcjOME=", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/execa/-/execa-5.1.1.tgz", + "integrity": "sha1-+ArZy/Qpj3vR1MlVXCHpN0HEEd0=", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha1-0G1YXOjbqQoWsFBcVDw8z7OuuBg=", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha1-ynUKENySW8ixiDn9ID4+9LPO1nU=", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha1-RCZdPKwH4+p9wkdRY4BkN1SgUpI=", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha1-LALYZNl/PqbIgwxGTL0Rq26rehw=", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE=", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha1-FQs/J0OGnvPoUewMSdFbHRTQDuE=", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha1-omLY7vZ6ztV8KFKtYWdSakPL97c=", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha1-ifVrghe9vIgCvSmd9tfxCB1+UaE=", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha1-/JxqeDoISVHQuXH+EBjegTcHozg=", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha1-AD6vkb563DcuhOxZ3DclLO24AAM=", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha1-mosfJGhmwChQlIZYX2K48sGMJw4=", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha1-48121MVI7oldPD/Y3B9sW5Ay56g=", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha1-3JH8ukLk0G5Kuu0zs+ejwC9RTqA=", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "license": "ISC" + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha1-kAk6oxBid9inelkQ265xdH4VogA=", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha1-6B+6aZZi6zHb2vJnZqYdSBRxfqQ=", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha1-+sHj1TuXrVqdCunO8jifWBClwHc=", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha1-MniXsmgyo+sRfabCdJLQTKEyWU8=", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "license": "ISC" + }, + "node_modules/js-md4": { + "version": "0.3.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/js-md4/-/js-md4-0.3.2.tgz", + "integrity": "sha1-zTs9wEWwxARVbIHdtXVsI+WdfPU=", + "license": "MIT" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha1-bNV6sB6bCsB8uEfVPTybbuMfeuI=", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha1-v4F20a0M1y4PP1gzhZWhPhELyAQ=", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jws/-/jws-4.0.1.tgz", + "integrity": "sha1-B+3Bvo+sIOZ3soPs4mFJi9OPBpA=", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha1-oN10voHiqlwvJ+Zc4oNgXuTit/k=", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha1-1m+hjzpHB2eJMgubGvMr2G2fogI=", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha1-WAyI+NVEXyvWqo88re+g3nn71p4=", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/msalv1": { + "name": "@azure/msal-node", + "version": "1.18.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-1.18.4.tgz", + "integrity": "sha512-Kc/dRvhZ9Q4+1FSfsTFDME/v6+R2Y1fuMty/TfwqE5p9GTPw08BPbKgeWinE8JRHRp+LemjQbUZsn4Q4l6Lszg==", + "dependencies": { + "@azure/msal-common": "13.3.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + } + }, + "node_modules/msalv2": { + "name": "@azure/msal-node", + "version": "2.10.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-2.10.0.tgz", + "integrity": "sha512-JxsSE0464a8IA/+q5EHKmchwNyUFJHtCH00tSXsLaOddwLjG6yVvTH6lGgPcWMhO7YWUXj/XVgVgeE9kZtsPUQ==", + "dependencies": { + "@azure/msal-common": "14.13.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + } + }, + "node_modules/msalv2/node_modules/@azure/msal-common": { + "version": "14.13.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-14.13.0.tgz", + "integrity": "sha512-b4M/tqRzJ4jGU91BiwCsLTqChveUEyFK3qY2wGfZ0zBswIBZjAxopx5CYt5wzZFKuN15HqRDYXQbztttuIC3nA==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/msalv3": { + "name": "@azure/msal-node", + "version": "3.5.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-3.5.3.tgz", + "integrity": "sha1-AveiNEosKZQ1SgzsElue+ajnEJs=", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "15.6.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/msalv3/node_modules/@azure/msal-common": { + "version": "15.6.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-15.6.0.tgz", + "integrity": "sha1-B2TWRG7v85cCIZleJfJl/bIY2mY=", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodejs-file-downloader": { + "version": "4.13.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/nodejs-file-downloader/-/nodejs-file-downloader-4.13.0.tgz", + "integrity": "sha512-nI2fKnmJWWFZF6SgMPe1iBodKhfpztLKJTtCtNYGhm/9QXmWa/Pk9Sv00qHgzEvNLe1x7hjGDRor7gcm/ChaIQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "https-proxy-agent": "^5.0.0", + "mime-types": "^2.1.27", + "sanitize-filename": "^1.6.3" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha1-g3UmXiG8IND6WCwi4bE0hdbgAhM=", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/open/-/open-10.2.0.tgz", + "integrity": "sha1-udhVvgB2IOgLb7BfrJgUH+Yttzw=", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha1-O6ODNzNkbZ0+SZWUbBNlpn+wekI=", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/qs/-/qs-6.15.0.tgz", + "integrity": "sha1-24/V0bHS1rWzOtr4dCmAXxkJ57M=", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha1-D+E7lSLhRz9RtVjueW4I8R+bSJ8=", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha1-Lp5UxGZOwxBsW1Yw4knT1llcSRE=", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.10.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/shelljs/-/shelljs-0.10.0.tgz", + "integrity": "sha1-47uumbDz8MxdzgW0ajRvriCQ6IM=", + "license": "BSD-3-Clause", + "dependencies": { + "execa": "^5.1.1", + "fast-glob": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha1-w/z/nE2pMnhIczNeyXZfqU/2a8k=", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha1-EMtZhCYxFdO3oOM2WR4pCoMK+K0=", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha1-1rtrN5Asb+9RdOX1M/q0xzKib0I=", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha1-Ed2hnVNo5Azp7CvcH7DsvAeQ7Oo=", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha1-qaF2f4r4QVURTqq9c/mSc8j1mtk=", + "license": "ISC" + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha1-cvExSzSlsZLbASMk3yzFh8pH+Sw=", + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/typed-rest-client": { + "version": "2.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typed-rest-client/-/typed-rest-client-2.2.0.tgz", + "integrity": "sha1-2gcn5AiEm9tpgg2G7mZK/KNHd6M=", + "license": "MIT", + "dependencies": { + "des.js": "^1.1.0", + "js-md4": "^0.3.2", + "qs": "^6.14.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha1-W09Z4VMQqxeiFvXWz1PuR27eZw8=", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/underscore": { + "version": "1.13.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha1-qTohGGwEnb8OhHSW26cre9jB6Ss=", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha1-/8zf82rqSITL/OmnUKBYAiT1ikY=", + "license": "MIT" + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/which/-/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha1-h4PU32cdTVA2W+LuTHGRegVXuqs=", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + } + } +} diff --git a/_generated/AzureFileCopyV4/package.json b/_generated/AzureFileCopyV4/package.json new file mode 100644 index 000000000000..e86e3e4b44a3 --- /dev/null +++ b/_generated/AzureFileCopyV4/package.json @@ -0,0 +1,20 @@ +{ + "name": "AzureFileCopyV4", + "scripts": { + "build": "node ../../make.js build --task AzureFileCopyV4", + "serverBuild": "node ../../make.js serverBuild --task AzureFileCopyV4" + }, + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^24.10.0", + "@types/q": "1.0.7", + "agent-base": "6.0.2", + "azure-pipelines-task-lib": "^5.2.7", + "azure-pipelines-tasks-azure-arm-rest": "^3.274.0", + "moment": "^2.29.4", + "uuid": "^8.3.0" + }, + "devDependencies": { + "typescript": "^5.7.2" + } +} diff --git a/_generated/AzureFileCopyV4/task.json b/_generated/AzureFileCopyV4/task.json new file mode 100644 index 000000000000..7f1d8faf34c6 --- /dev/null +++ b/_generated/AzureFileCopyV4/task.json @@ -0,0 +1,316 @@ +{ + "id": "EB72CB01-A7E5-427B-A8A1-1B31CCAC8A43", + "name": "AzureFileCopy", + "friendlyName": "Azure file copy", + "description": "Copy files to Azure Blob Storage or virtual machines", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/deploy/azure-file-copy", + "helpMarkDown": "[Learn more about this task](https://aka.ms/azurefilecopyreadme)", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 4, + "Minor": 274, + "Patch": 2 + }, + "demands": [ + "azureps" + ], + "releaseNotes": "What's new in Version 4.0:
   Support AzCopy.exe version 10.8.0", + "minimumAgentVersion": "1.103.0", + "inputs": [ + { + "name": "SourcePath", + "type": "filePath", + "label": "Source", + "defaultValue": "", + "required": true, + "helpMarkDown": "Absolute path of the source folder, or file on the local machine, or a UNC share. Expression should return a single folder or a file. Wild card symbol (*) is supported anywhere in the file path or file name." + }, + { + "name": "ConnectedServiceNameARM", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "Azure Subscription", + "defaultValue": "", + "required": true, + "helpMarkDown": "Azure Resource Manager subscription to target for copying the files." + }, + { + "name": "Destination", + "type": "pickList", + "label": "Destination Type", + "defaultValue": "", + "required": true, + "options": { + "AzureBlob": "Azure Blob", + "AzureVMs": "Azure VMs" + }, + "helpMarkDown": "Select the destination, either Azure Blob or Azure VMs." + }, + { + "name": "StorageAccountRM", + "aliases": [ + "storage" + ], + "type": "pickList", + "label": "RM Storage Account", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify a pre-existing ARM storage account. It is also used as an intermediary for copying files to Azure VMs", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "ContainerName", + "type": "string", + "label": "Container Name", + "defaultValue": "", + "required": true, + "helpMarkDown": "Name of the Container for uploading the files. If a container with the given name does not exist in the specified storage account, it will automatically be created.
If you need to create a virtual directory inside the container, use the blob prefix input below.
Example: If your target location is https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/, then specify mycontainer as container name and vd1/vd2/ as blob prefix.", + "visibleRule": "Destination = AzureBlob" + }, + { + "name": "BlobPrefix", + "type": "string", + "label": "Blob Prefix", + "defaultValue": "", + "required": false, + "helpMarkDown": "Useful for filtering files, for example, append build number to all the blobs to download files from that build only. Example: If you specify blob prefix as myvd1/, a virtual directory with this name will be created inside the container. Blob prefix with a trailing '/' will be considered a virtual directory. Otherwise, it will be treated as a file, unless the item being copied is itself a folder. The source files will be copied to https://myaccount.blob.core.windows.net/mycontainer/myvd1/.", + "visibleRule": "Destination = AzureBlob" + }, + { + "name": "EnvironmentNameRM", + "aliases": [ + "resourceGroup" + ], + "type": "pickList", + "label": "Resource Group", + "defaultValue": "", + "required": true, + "helpMarkDown": "Name of the target Resource Group for copying files to.", + "properties": { + "EditableOptions": "True" + }, + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "ResourceFilteringMethod", + "type": "radio", + "label": "Select Machines By", + "required": false, + "defaultValue": "machineNames", + "options": { + "machineNames": "Machine Names", + "tags": "Tags" + }, + "helpMarkDown": "Optionally, select a subset of VMs in resource group either by providing VMs host name or tags. [Tags](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) are supported for resources created via the Azure Resource Manager only.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "MachineNames", + "type": "string", + "label": "Filter Criteria", + "defaultValue": "", + "required": false, + "helpMarkDown": "Provide a list of VMs host name like ffweb, ffdb, or tags like Role:DB, Web; OS:Win8.1. Note the delimiters used for tags are ,(comma), :(colon) and ;(semicolon). If multiple tags are provided, then the task will run in all the VMs with the specified tags. The default is to run the task in all the VMs.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "vmsAdminUserName", + "type": "string", + "label": "Admin Login", + "defaultValue": "", + "required": true, + "helpMarkDown": "Administrator Username of the VMs.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "vmsAdminPassword", + "type": "string", + "label": "Password", + "defaultValue": "", + "required": true, + "helpMarkDown": "The administrator password of the VMs.
It can accept variable defined in build or release pipelines as '$(passwordVariable)'.
You may mark variable as 'secret' to secure it.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "TargetPath", + "type": "string", + "label": "Destination Folder", + "defaultValue": "", + "required": true, + "helpMarkDown": "Local path on the target machines for copying the files from the source. Environment variable can be used like $env:windir\\BudgetIT\\Web.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "AdditionalArgumentsForBlobCopy", + "type": "multiLine", + "label": "Optional Arguments (for uploading files to blob)", + "required": false, + "defaultValue": "", + "helpMarkDown": "Optional AzCopy.exe arguments that will be applied when uploading to blob like, --check-length=true. If no optional arguments are specified here, the following optional arguments will be added by default.
--log-level=INFO (if the pipeline is running in debug mode set --log-level=DEBUG),
--recursive (only if container name is not $root),
--blob-type=PageBlob (only if specified storage account is a premium account)." + }, + { + "name": "AdditionalArgumentsForVMCopy", + "type": "multiLine", + "label": "Optional Arguments (for downloading files to VM)", + "required": false, + "defaultValue": "", + "helpMarkDown": "Optional AzCopy.exe arguments that will be applied when downloading to VM like, --check-length=true. If no optional arguments are specified here, the following optional arguments will be added by default.
--log-level=INFO (if the pipeline is running in debug mode set --log-level=DEBUG),
--recursive", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "sasTokenTimeOutInMinutes", + "type": "string", + "label": "SAS Token Expiration Period In Minutes", + "defaultValue": "240", + "required": false, + "helpMarkDown": "Provide the time in minutes after which SAS token for the container will expire. By default, this token expires after 4 hours.", + "visibleRule": "Destination = AzureBlob" + }, + { + "name": "enableCopyPrerequisites", + "type": "boolean", + "label": "Enable Copy Prerequisites", + "defaultValue": "false", + "visibleRule": "Destination = AzureVMs", + "required": false, + "helpMarkDown": "Enabling this option configures Windows Remote Management (WinRM) listener over HTTPS protocol on port 5986, using a self-signed certificate. This configuration is required for performing copy operation on Azure machines. If the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). Applicable only for ARM VMs." + }, + { + "name": "CopyFilesInParallel", + "type": "boolean", + "label": "Copy in Parallel", + "defaultValue": "true", + "required": false, + "helpMarkDown": "Setting it to true will copy files in parallel to the target machines.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "CleanTargetBeforeCopy", + "type": "boolean", + "label": "Clean Target", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Setting it to true will clean-up the destination folder before copying the files.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "skipCACheck", + "type": "boolean", + "label": "Test Certificate", + "defaultValue": "true", + "required": false, + "helpMarkDown": "If this option is selected, client skips the validation that the server certificate is signed by a trusted certificate authority (CA) when connecting over Hypertext Transfer Protocol over Secure Socket Layer (HTTPS).", + "visibleRule": "Destination = AzureVMs" + } + ], + "outputVariables": [ + { + "name": "StorageContainerUri", + "description": "Uri of the container where the files were copied to. Valid only when the selected destination is Azure Blob." + }, + { + "name": "StorageContainerSasToken", + "description": "SasToken for the container where the files were copied to. Valid only when the selected destination is Azure Blob." + } + ], + "dataSourceBindings": [ + { + "target": "StorageAccountRM", + "endpointId": "$(ConnectedServiceNameARM)", + "dataSourceName": "AzureStorageAccountRM" + }, + { + "target": "EnvironmentNameRM", + "endpointId": "$(ConnectedServiceNameARM)", + "dataSourceName": "AzureVirtualMachinesV2Id", + "resultTemplate": "{\"Value\":\"{{{ #extractResource resourceGroups}}}\",\"DisplayValue\":\"{{{ #extractResource resourceGroups}}}\"}" + } + ], + "instanceNameFormat": "$(Destination) File Copy", + "prejobexecution": { + "Node16": { + "target": "PreJobExecutionAzureFileCopy.js", + "argumentFormat": "" + }, + "Node10": { + "target": "PreJobExecutionAzureFileCopy.js" + }, + "Node20_1": { + "target": "PreJobExecutionAzureFileCopy.js", + "argumentFormat": "" + }, + "Node24": { + "target": "PreJobExecutionAzureFileCopy.js", + "argumentFormat": "" + } + }, + "execution": { + "PowerShell3": { + "target": "AzureFileCopy.ps1" + } + }, + "messages": { + "AFC_StorageAccountNotFound": "Storage account: {0} not found. The selected service connection 'Service Principal' supports storage accounts of Azure Resource Manager type only.", + "AFC_ResourceGroupNotFound": "Provided resource group '{0}' does not exist.", + "AFC_GetVMStatus": "[Azure Call]Getting the status for vm '{0}'", + "AFC_GetVMStatusComplete": "[Azure Call]Got the status for vm '{0}'", + "AFC_GetCustomScriptExtension": "[Azure Call]Getting the custom script extension '{0}' for vm '{1}'", + "AFC_GetCustomScriptExtensionComplete": "[Azure Call]Got the custom script extension '{0}' for vm '{1}'", + "AFC_SetCustomScriptExtension": "[Azure Call]Setting the custom script extension '{0}' for vm '{1}'", + "AFC_SetCustomScriptExtensionComplete": "[Azure Call]Set the custom script extension '{0}' for vm '{1}'", + "AFC_RemoveCustomScriptExtension": "[Azure Call]Removing the custom script extension '{0}' for vm '{1}'", + "AFC_RemoveCustomScriptExtensionComplete": "[Azure Call]Removed the custom script extension '{0}' for vm '{1}'", + "AFC_NoNetworkInterface": "[Azure Call]No network interface found with virtual machine ID {0} under resource group {1}", + "AFC_NullOrEmptyResourceGroup": "[Azure Call]Resource group name and virtual machine ID should not be null or empty", + "AFC_AzurePSNotInstalled": "The required minimum version {0} of the Azure Powershell Cmdlets are not installed. You can follow the instructions at https://azure.microsoft.com/en-in/documentation/articles/powershell-install-configure/ to get the latest Azure powershell", + "AFC_ClassicStorageAccountNotFound": "Storage account: {0} not found. The selected service connection 'Certificate' supports storage accounts of Azure Classic type only.", + "AFC_GenericStorageAccountNotFound": "Storage account: {0} not found. Please specify existing storage account", + "AFC_AzureFileCopyMoreHelp": "For more info please refer to {0}", + "AFC_UploadFilesStorageAccount": "Uploading files from source path: '{0}' to storage account: '{1}' in container: '{2}' with blob prefix: '{3}'", + "AFC_UploadContainerStorageAccount": "Upload to container: '{0}' in storage account: '{1}' with blob prefix: '{2}' failed with error: '{3}'", + "AFC_UploadFileSuccessful": "Uploaded files successfully from source path: '{0}' to storage account: '{1}' in container: '{2}' with blob prefix: '{3}'", + "AFC_IncorrectTags": "Tags have been incorrectly specified. They have to be in the format Role:Web,DB;Location:East US;Dept.:Finance,HR", + "AFC_MachineDoesNotExist": "The following machines either do not exist in the resource group or their names have not been specified correctly: {0}. Provide the exact same machine names present in the resource group. Use comma to separate multiple machine names.", + "AFC_MachineNameFromIdErrorAllResources": "Unable to get {0} for all resources in ResourceGroup : '{1}'", + "AFC_MachineNameFromIdError": "Unable to get {0} for '{1}' resources in ResourceGroup : '{2}'", + "AFC_ResourceGroupNotFoundForSelectedConnection": "Unable to find the resource '{1}' using selected service connection '{0}'. Selected service connection '{0}' supports classic resources only (Service Management model).", + "AFC_NoClassicVMResources": "No machine exists under resource group: '{0}' for copy. Selected service connection '{1}' supports Virtual Machines of Azure Classic type only.", + "AFC_NoARMVMResources": "No machine exists under resource group: '{0}' for copy. Selected service connection '{1}' supports Virtual Machines of Azure Resource Manager type only.", + "AFC_NoGenericVMResources": "No machine exists under resource group: '{0}' for copy.", + "AFC_FilteringNoVMResources": "No machine exists under resource group: '{0}' with the following {1} '{2}'.", + "AFC_CopyStarted": "Copy started for machine: '{0}'", + "AFC_CopyCompleted": "Copy status for machine '{0}' : '{1}'", + "AFC_WinRMHelpMessage": "To fix WinRM service connection related issues, select the 'Enable Copy Prerequisites' option in the task. If set already, and the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). Applicable only for ARM VMs.", + "AFC_CopyFailed": "Copy failed on machine '{0}'. Refer logs for more details.", + "AFC_ParallelCopyFailed": "Copy to one or more machines failed. Refer logs for more details.", + "AFC_CopySuccessful": "Copied files from source path: '{0}' to target azure VMs in resource group: '{1}' successfully", + "AFC_SetCustomScriptExtensionFailed": "Setting the custom script extension '{0}' for virtual machine '{1}' failed with error : {2}", + "AFC_AddNetworkSecurityRuleFailed": "Failed to add the network security rule: {0}", + "AFC_UnableToSetCustomScriptExtension": "Unable to set the custom script extension '{0}' for virtual machine '{1}': {2}", + "AFC_CopyPrereqsFailed": "Failed to enable copy prerequisites. {0}", + "AFC_BlobStorageNotFound": "Storage account: {0} not found. Please specify existing storage account", + "AFC_RootContainerAndDirectory": "'/S' option is not valid for $root containers.", + "AFC_RedirectResponseInvalidStatusCode": "The HTTP response code: '{0}' is not a valid redirect status code", + "AFC_RedirectResponseLocationHeaderIsNull": "Redirect response location header is null.", + "AFC_AzCopyBlobUploadNonZeroExitCode": "AzCopy.exe exited with non-zero exit code while uploading files to blob storage.", + "AFC_PreexecutionJob_UnableToGetStorageKey": "Unable to fetch storage account key. Error: '{0}'", + "AFC_UninstallWinRMCustomScriptExtension": "Uninstall WinRM custom script manually and retry deployment.", + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "UnsupportedAuthScheme": "Unsupported authentication scheme '{0}' for endpoint.", + "ServicePrincipalError": "There was an error with the service principal used for the deployment." + }, + "_buildConfigMapping": { + "Default": "4.274.2", + "LocalPackages": "4.249.4", + "Node24_1": "4.274.3" + } +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/task.loc.json b/_generated/AzureFileCopyV4/task.loc.json new file mode 100644 index 000000000000..b24056bffb94 --- /dev/null +++ b/_generated/AzureFileCopyV4/task.loc.json @@ -0,0 +1,316 @@ +{ + "id": "EB72CB01-A7E5-427B-A8A1-1B31CCAC8A43", + "name": "AzureFileCopy", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/deploy/azure-file-copy", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 4, + "Minor": 274, + "Patch": 2 + }, + "demands": [ + "azureps" + ], + "releaseNotes": "ms-resource:loc.releaseNotes", + "minimumAgentVersion": "1.103.0", + "inputs": [ + { + "name": "SourcePath", + "type": "filePath", + "label": "ms-resource:loc.input.label.SourcePath", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.SourcePath" + }, + { + "name": "ConnectedServiceNameARM", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.ConnectedServiceNameARM", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ConnectedServiceNameARM" + }, + { + "name": "Destination", + "type": "pickList", + "label": "ms-resource:loc.input.label.Destination", + "defaultValue": "", + "required": true, + "options": { + "AzureBlob": "Azure Blob", + "AzureVMs": "Azure VMs" + }, + "helpMarkDown": "ms-resource:loc.input.help.Destination" + }, + { + "name": "StorageAccountRM", + "aliases": [ + "storage" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.StorageAccountRM", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.StorageAccountRM", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "ContainerName", + "type": "string", + "label": "ms-resource:loc.input.label.ContainerName", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ContainerName", + "visibleRule": "Destination = AzureBlob" + }, + { + "name": "BlobPrefix", + "type": "string", + "label": "ms-resource:loc.input.label.BlobPrefix", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.BlobPrefix", + "visibleRule": "Destination = AzureBlob" + }, + { + "name": "EnvironmentNameRM", + "aliases": [ + "resourceGroup" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.EnvironmentNameRM", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.EnvironmentNameRM", + "properties": { + "EditableOptions": "True" + }, + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "ResourceFilteringMethod", + "type": "radio", + "label": "ms-resource:loc.input.label.ResourceFilteringMethod", + "required": false, + "defaultValue": "machineNames", + "options": { + "machineNames": "Machine Names", + "tags": "Tags" + }, + "helpMarkDown": "ms-resource:loc.input.help.ResourceFilteringMethod", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "MachineNames", + "type": "string", + "label": "ms-resource:loc.input.label.MachineNames", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.MachineNames", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "vmsAdminUserName", + "type": "string", + "label": "ms-resource:loc.input.label.vmsAdminUserName", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.vmsAdminUserName", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "vmsAdminPassword", + "type": "string", + "label": "ms-resource:loc.input.label.vmsAdminPassword", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.vmsAdminPassword", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "TargetPath", + "type": "string", + "label": "ms-resource:loc.input.label.TargetPath", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.TargetPath", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "AdditionalArgumentsForBlobCopy", + "type": "multiLine", + "label": "ms-resource:loc.input.label.AdditionalArgumentsForBlobCopy", + "required": false, + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.AdditionalArgumentsForBlobCopy" + }, + { + "name": "AdditionalArgumentsForVMCopy", + "type": "multiLine", + "label": "ms-resource:loc.input.label.AdditionalArgumentsForVMCopy", + "required": false, + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.AdditionalArgumentsForVMCopy", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "sasTokenTimeOutInMinutes", + "type": "string", + "label": "ms-resource:loc.input.label.sasTokenTimeOutInMinutes", + "defaultValue": "240", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.sasTokenTimeOutInMinutes", + "visibleRule": "Destination = AzureBlob" + }, + { + "name": "enableCopyPrerequisites", + "type": "boolean", + "label": "ms-resource:loc.input.label.enableCopyPrerequisites", + "defaultValue": "false", + "visibleRule": "Destination = AzureVMs", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.enableCopyPrerequisites" + }, + { + "name": "CopyFilesInParallel", + "type": "boolean", + "label": "ms-resource:loc.input.label.CopyFilesInParallel", + "defaultValue": "true", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.CopyFilesInParallel", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "CleanTargetBeforeCopy", + "type": "boolean", + "label": "ms-resource:loc.input.label.CleanTargetBeforeCopy", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.CleanTargetBeforeCopy", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "skipCACheck", + "type": "boolean", + "label": "ms-resource:loc.input.label.skipCACheck", + "defaultValue": "true", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.skipCACheck", + "visibleRule": "Destination = AzureVMs" + } + ], + "outputVariables": [ + { + "name": "StorageContainerUri", + "description": "Uri of the container where the files were copied to. Valid only when the selected destination is Azure Blob." + }, + { + "name": "StorageContainerSasToken", + "description": "SasToken for the container where the files were copied to. Valid only when the selected destination is Azure Blob." + } + ], + "dataSourceBindings": [ + { + "target": "StorageAccountRM", + "endpointId": "$(ConnectedServiceNameARM)", + "dataSourceName": "AzureStorageAccountRM" + }, + { + "target": "EnvironmentNameRM", + "endpointId": "$(ConnectedServiceNameARM)", + "dataSourceName": "AzureVirtualMachinesV2Id", + "resultTemplate": "{\"Value\":\"{{{ #extractResource resourceGroups}}}\",\"DisplayValue\":\"{{{ #extractResource resourceGroups}}}\"}" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "prejobexecution": { + "Node16": { + "target": "PreJobExecutionAzureFileCopy.js", + "argumentFormat": "" + }, + "Node10": { + "target": "PreJobExecutionAzureFileCopy.js" + }, + "Node20_1": { + "target": "PreJobExecutionAzureFileCopy.js", + "argumentFormat": "" + }, + "Node24": { + "target": "PreJobExecutionAzureFileCopy.js", + "argumentFormat": "" + } + }, + "execution": { + "PowerShell3": { + "target": "AzureFileCopy.ps1" + } + }, + "messages": { + "AFC_StorageAccountNotFound": "ms-resource:loc.messages.AFC_StorageAccountNotFound", + "AFC_ResourceGroupNotFound": "ms-resource:loc.messages.AFC_ResourceGroupNotFound", + "AFC_GetVMStatus": "ms-resource:loc.messages.AFC_GetVMStatus", + "AFC_GetVMStatusComplete": "ms-resource:loc.messages.AFC_GetVMStatusComplete", + "AFC_GetCustomScriptExtension": "ms-resource:loc.messages.AFC_GetCustomScriptExtension", + "AFC_GetCustomScriptExtensionComplete": "ms-resource:loc.messages.AFC_GetCustomScriptExtensionComplete", + "AFC_SetCustomScriptExtension": "ms-resource:loc.messages.AFC_SetCustomScriptExtension", + "AFC_SetCustomScriptExtensionComplete": "ms-resource:loc.messages.AFC_SetCustomScriptExtensionComplete", + "AFC_RemoveCustomScriptExtension": "ms-resource:loc.messages.AFC_RemoveCustomScriptExtension", + "AFC_RemoveCustomScriptExtensionComplete": "ms-resource:loc.messages.AFC_RemoveCustomScriptExtensionComplete", + "AFC_NoNetworkInterface": "ms-resource:loc.messages.AFC_NoNetworkInterface", + "AFC_NullOrEmptyResourceGroup": "ms-resource:loc.messages.AFC_NullOrEmptyResourceGroup", + "AFC_AzurePSNotInstalled": "ms-resource:loc.messages.AFC_AzurePSNotInstalled", + "AFC_ClassicStorageAccountNotFound": "ms-resource:loc.messages.AFC_ClassicStorageAccountNotFound", + "AFC_GenericStorageAccountNotFound": "ms-resource:loc.messages.AFC_GenericStorageAccountNotFound", + "AFC_AzureFileCopyMoreHelp": "ms-resource:loc.messages.AFC_AzureFileCopyMoreHelp", + "AFC_UploadFilesStorageAccount": "ms-resource:loc.messages.AFC_UploadFilesStorageAccount", + "AFC_UploadContainerStorageAccount": "ms-resource:loc.messages.AFC_UploadContainerStorageAccount", + "AFC_UploadFileSuccessful": "ms-resource:loc.messages.AFC_UploadFileSuccessful", + "AFC_IncorrectTags": "ms-resource:loc.messages.AFC_IncorrectTags", + "AFC_MachineDoesNotExist": "ms-resource:loc.messages.AFC_MachineDoesNotExist", + "AFC_MachineNameFromIdErrorAllResources": "ms-resource:loc.messages.AFC_MachineNameFromIdErrorAllResources", + "AFC_MachineNameFromIdError": "ms-resource:loc.messages.AFC_MachineNameFromIdError", + "AFC_ResourceGroupNotFoundForSelectedConnection": "ms-resource:loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection", + "AFC_NoClassicVMResources": "ms-resource:loc.messages.AFC_NoClassicVMResources", + "AFC_NoARMVMResources": "ms-resource:loc.messages.AFC_NoARMVMResources", + "AFC_NoGenericVMResources": "ms-resource:loc.messages.AFC_NoGenericVMResources", + "AFC_FilteringNoVMResources": "ms-resource:loc.messages.AFC_FilteringNoVMResources", + "AFC_CopyStarted": "ms-resource:loc.messages.AFC_CopyStarted", + "AFC_CopyCompleted": "ms-resource:loc.messages.AFC_CopyCompleted", + "AFC_WinRMHelpMessage": "ms-resource:loc.messages.AFC_WinRMHelpMessage", + "AFC_CopyFailed": "ms-resource:loc.messages.AFC_CopyFailed", + "AFC_ParallelCopyFailed": "ms-resource:loc.messages.AFC_ParallelCopyFailed", + "AFC_CopySuccessful": "ms-resource:loc.messages.AFC_CopySuccessful", + "AFC_SetCustomScriptExtensionFailed": "ms-resource:loc.messages.AFC_SetCustomScriptExtensionFailed", + "AFC_AddNetworkSecurityRuleFailed": "ms-resource:loc.messages.AFC_AddNetworkSecurityRuleFailed", + "AFC_UnableToSetCustomScriptExtension": "ms-resource:loc.messages.AFC_UnableToSetCustomScriptExtension", + "AFC_CopyPrereqsFailed": "ms-resource:loc.messages.AFC_CopyPrereqsFailed", + "AFC_BlobStorageNotFound": "ms-resource:loc.messages.AFC_BlobStorageNotFound", + "AFC_RootContainerAndDirectory": "ms-resource:loc.messages.AFC_RootContainerAndDirectory", + "AFC_RedirectResponseInvalidStatusCode": "ms-resource:loc.messages.AFC_RedirectResponseInvalidStatusCode", + "AFC_RedirectResponseLocationHeaderIsNull": "ms-resource:loc.messages.AFC_RedirectResponseLocationHeaderIsNull", + "AFC_AzCopyBlobUploadNonZeroExitCode": "ms-resource:loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode", + "AFC_PreexecutionJob_UnableToGetStorageKey": "ms-resource:loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey", + "AFC_UninstallWinRMCustomScriptExtension": "ms-resource:loc.messages.AFC_UninstallWinRMCustomScriptExtension", + "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", + "UnsupportedAuthScheme": "ms-resource:loc.messages.UnsupportedAuthScheme", + "ServicePrincipalError": "ms-resource:loc.messages.ServicePrincipalError" + }, + "_buildConfigMapping": { + "Default": "4.274.2", + "LocalPackages": "4.249.4", + "Node24_1": "4.274.3" + } +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/tsconfig.json b/_generated/AzureFileCopyV4/tsconfig.json new file mode 100644 index 000000000000..0cd3f3f78ed5 --- /dev/null +++ b/_generated/AzureFileCopyV4/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs", + "skipLibCheck": true + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV4_Node24/task.json b/_generated/AzureFileCopyV4_Node24/task.json index e617fb6862b0..e6deb2506ddd 100644 --- a/_generated/AzureFileCopyV4_Node24/task.json +++ b/_generated/AzureFileCopyV4_Node24/task.json @@ -14,7 +14,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 1 + "Patch": 3 }, "demands": [ "azureps" @@ -309,8 +309,8 @@ "ServicePrincipalError": "There was an error with the service principal used for the deployment." }, "_buildConfigMapping": { - "Default": "4.274.0", + "Default": "4.274.2", "LocalPackages": "4.249.4", - "Node24_1": "4.274.1" + "Node24_1": "4.274.3" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV4_Node24/task.loc.json b/_generated/AzureFileCopyV4_Node24/task.loc.json index b0fab4bd97b4..1e556f5db2f5 100644 --- a/_generated/AzureFileCopyV4_Node24/task.loc.json +++ b/_generated/AzureFileCopyV4_Node24/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 4, "Minor": 274, - "Patch": 1 + "Patch": 3 }, "demands": [ "azureps" @@ -309,8 +309,8 @@ "ServicePrincipalError": "ms-resource:loc.messages.ServicePrincipalError" }, "_buildConfigMapping": { - "Default": "4.274.0", + "Default": "4.274.2", "LocalPackages": "4.249.4", - "Node24_1": "4.274.1" + "Node24_1": "4.274.3" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV5.versionmap.txt b/_generated/AzureFileCopyV5.versionmap.txt index 5aa2bf47e972..d3b672651995 100644 --- a/_generated/AzureFileCopyV5.versionmap.txt +++ b/_generated/AzureFileCopyV5.versionmap.txt @@ -1,2 +1,2 @@ -Default|5.274.0 -Node24_1|5.274.1 +Default|5.274.2 +Node24_1|5.274.3 diff --git a/_generated/AzureFileCopyV5/.npmrc b/_generated/AzureFileCopyV5/.npmrc new file mode 100644 index 000000000000..d5c7fef620a3 --- /dev/null +++ b/_generated/AzureFileCopyV5/.npmrc @@ -0,0 +1,5 @@ +scripts-prepend-node-path=true + +registry=https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ + +always-auth=true \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/AzureFileCopy.ps1 b/_generated/AzureFileCopyV5/AzureFileCopy.ps1 new file mode 100644 index 000000000000..51601fbfe40f --- /dev/null +++ b/_generated/AzureFileCopyV5/AzureFileCopy.ps1 @@ -0,0 +1,298 @@ +[CmdletBinding()] +param() + +Trace-VstsEnteringInvocation $MyInvocation + +# Get inputs for the task +$sourcePath = Get-VstsInput -Name SourcePath -Require +$destination = Get-VstsInput -Name Destination -Require +$connectedServiceName = Get-VstsInput -Name ConnectedServiceNameARM -Require +$storageAccount = Get-VstsInput -Name StorageAccountRM +$containerName = Get-VstsInput -Name ContainerName +$blobPrefix = Get-VstsInput -Name BlobPrefix +$environmentName = Get-VstsInput -Name EnvironmentNameRM +$resourceFilteringMethod = Get-VstsInput -Name ResourceFilteringMethod +$machineNames = Get-VstsInput -Name MachineNames +$vmsAdminUserName = Get-VstsInput -Name VmsAdminUsername +$vmsAdminPassword = Get-VstsInput -Name VmsAdminPassword +$targetPath = Get-VstsInput -Name TargetPath +$additionalArgumentsForBlobCopy = Get-VstsInput -Name AdditionalArgumentsForBlobCopy +$additionalArgumentsForVMCopy = Get-VstsInput -Name AdditionalArgumentsForVMCopy +$cleanTargetBeforeCopy = Get-VstsInput -Name CleanTargetBeforeCopy -AsBool +$copyFilesInParallel = Get-VstsInput -Name CopyFilesInParallel -AsBool +$skipCACheck = Get-VstsInput -Name SkipCACheck -AsBool +$enableCopyPrerequisites = Get-VstsInput -Name EnableCopyPrerequisites -AsBool + + $sasTokenTimeOutInMinutes = 240 + +if ($destination -eq "AzureBlob"){ + $userGivenTimeOutInMinutes = Get-VstsInput -Name SasTokenTimeOutInMinutes + if($userGivenTimeOutInMinutes -ne ""){ + $sasTokenTimeOutInMinutes = $userGivenTimeOutInMinutes + } +} + +if ($destination -ne "AzureBlob") +{ + $blobPrefix = "" +} + +# Constants +$useHttpsProtocolOption = '' +$ErrorActionPreference = 'Stop' +$telemetrySet = $false +$isPremiumStorage = $false + +$sourcePath = $sourcePath.Trim('"') +$storageAccount = $storageAccount.Trim() +$containerName = $containerName.Trim().ToLower() + +$additionalArgumentsForBlobCopy = $additionalArgumentsForBlobCopy.Trim() +$additionalArgumentsForVMCopy = $additionalArgumentsForVMCopy.Trim() +$useDefaultArgumentsForBlobCopy = ($additionalArgumentsForBlobCopy -eq "") + +# azcopy location on automation agent +$azCopyExeLocation = 'AzCopy\AzCopy.exe' +$azCopyLocation = [System.IO.Path]::GetDirectoryName($azCopyExeLocation) + +# Import RemoteDeployer +Import-Module $PSScriptRoot\ps_modules\RemoteDeployer + +# Initialize Azure. +Import-Module $PSScriptRoot\ps_modules\VstsAzureHelpers_ + +$endpoint = Get-VstsEndpoint -Name $connectedServiceName -Require + +# Update PSModulePath for hosted agent +. "$PSScriptRoot\Utility.ps1" + +CleanUp-PSModulePathForHostedAgent + +$vstsEndpoint = Get-VstsEndpoint -Name SystemVssConnection -Require +$vstsAccessToken = $vstsEndpoint.auth.parameters.AccessToken + +if (Get-Module Az.Accounts -ListAvailable) { + $encryptedToken = ConvertTo-SecureString $vstsAccessToken -AsPlainText -Force + Initialize-AzModule -Endpoint $endpoint -connectedServiceNameARM $connectedServiceName -encryptedToken $encryptedToken +} +else { + Write-Verbose "No module found with name: Az.Accounts" + throw ("Could not find the module Az.Accounts with given version. If the module was recently installed, retry after restarting the Azure Pipelines task agent.") +} + +# Import the loc strings. +Import-VstsLocStrings -LiteralPath $PSScriptRoot/Task.json + +# Load all dependent files for execution +. "$PSScriptRoot\AzureFileCopyRemoteJob.ps1" + +# Enabling detailed logging only when system.debug is true +$enableDetailedLogging = ($env:system_debug -eq "true") + +# Telemetry +Import-Module $PSScriptRoot\ps_modules\TelemetryHelper + +# Sanitizer +Import-Module $PSScriptRoot\ps_modules\Sanitizer +$useSanitizerCall = Get-SanitizerCallStatus +$useSanitizerActivate = Get-SanitizerActivateStatus + +if ($useSanitizerCall) { + $sanitizedArgumentsForBlobCopy = Protect-ScriptArguments -InputArgs $additionalArgumentsForBlobCopy -TaskName "AzureFileCopyV5" + $sanitizedArgumentsForVMCopy = Protect-ScriptArguments -InputArgs $additionalArgumentsForVMCopy -TaskName "AzureFileCopyV5" +} + +if ($useSanitizerActivate) { + $additionalArgumentsForBlobCopy = $sanitizedArgumentsForBlobCopy -join " " + $additionalArgumentsForVMCopy = $sanitizedArgumentsForVMCopy -join " " +} + +#### MAIN EXECUTION OF AZURE FILE COPY TASK BEGINS HERE #### +try { + try + { + # Importing required version of azure cmdlets according to azureps installed on machine + $azureUtility = Get-AzureUtility + + Write-Verbose -Verbose "Loading $azureUtility" + . "$PSScriptRoot/$azureUtility" + + # Telemetry for endpoint id + $telemetryJsonContent = "{`"endpointId`":`"$connectedServiceName`"}" + Write-Host "##vso[telemetry.publish area=TaskEndpointId;feature=AzureFileCopy]$telemetryJsonContent" + + # Getting storage key for the storage account + $storageKey = Get-StorageKey -storageAccountName $storageAccount -endpoint $endpoint -connectedServiceNameARM $connectedServiceName + + # creating storage context to be used while creating container, sas token, deleting container + $storageContext = Create-AzureStorageContext -StorageAccountName $storageAccount -StorageAccountKey $storageKey + + # Geting Azure Storage Account type + $storageAccountType = Get-StorageAccountType $storageAccount $endpoint $connectedServiceName + Write-Verbose "Obtained Storage Account type: $storageAccountType" + if(-not [string]::IsNullOrEmpty($storageAccountType) -and $storageAccountType.Contains('Premium')) + { + $isPremiumStorage = $true + } + + # creating temporary container for uploading files if no input is provided for container name + if([string]::IsNullOrEmpty($containerName) -or ($destination -ne "AzureBlob")) + { + $containerName = [guid]::NewGuid().ToString() + Write-Verbose "Container Name input not found. Creating Temporary container for uploading files." + Create-AzureContainer -containerName $containerName -storageContext $storageContext + } + else + { + #checking if the containerName provided exist or not + $containerPresent = Get-AzureContainer -containerName $containerName -storageContext $storageContext + + #creating container if the containerName provided does not exist + if($null -eq $containerPresent) + { + Write-Verbose "Creating container if the containerName provided does not exist" + Create-AzureContainer -containerName $containerName -storageContext $storageContext + } + } + + + # Getting Azure Blob Storage Endpoint + $blobStorageEndpoint = Get-blobStorageEndpoint -storageAccountName $storageAccount -endpoint $endpoint + + # Setting environment variable for tracking Azure Pipelines usage in AzCopy telemetry + $env:AZCOPY_USER_AGENT_PREFIX = "TFS_useragent" + } + catch + { + Write-Verbose $_.Exception.ToString() + Write-Telemetry "Task_InternalError" "TemporaryCopyingToBlobContainerFailed" + throw + } + + # Set optional arguments for azcopy blob upload + if ($useDefaultArgumentsForBlobCopy) + { + # Adding default optional arguments: + # log-level: Defines the log verbosity for the log file. Default is INFO(all requests/responses) + + Write-Verbose "Using default AzCopy arguments for uploading to blob storage" + + $additionalArgumentsForBlobCopy = "--log-level=INFO" + + # Add more arguments if required + + # Premium storage accounts only support page blobs + if($isPremiumStorage) + { + Write-Verbose "Setting BlobType to page for Premium Storage account." + $additionalArgumentsForBlobCopy += " --blob-type=PageBlob" + } + + # $root container does not support sub folders. So excluding recursive copy option for $root container. + if($containerName -ne '$root') + { + Write-Verbose "Adding argument for recursive copy" + $additionalArgumentsForBlobCopy += " --recursive" + } + } + + Check-ContainerNameAndArgs -containerName $containerName -additionalArguments $additionalArgumentsForBlobCopy + + $containerSasToken = "" + if ($useSanitizerActivate) { + Write-Verbose "Feature flag sanitizer is active (for sas token)" + $containerSasToken = Generate-AzureStorageContainerSASToken -containerName $containerName -storageContext $storageContext -tokenTimeOutInMinutes $sasTokenTimeOutInMinutes + } + + # Uploading files to container + Upload-FilesToAzureContainer -sourcePath $sourcePath ` + -endPoint $endpoint ` + -storageAccountName $storageAccount ` + -containerName $containerName ` + -blobPrefix $blobPrefix ` + -blobStorageEndpoint $blobStorageEndpoint ` + -azCopyLocation $azCopyLocation ` + -additionalArguments $additionalArgumentsForBlobCopy ` + -destinationType $destination ` + -useDefaultArguments $useDefaultArgumentsForBlobCopy ` + -cleanTargetBeforeCopy $cleanTargetBeforeCopy ` + -containerSasToken $containerSasToken ` + -useSanitizerActivate $useSanitizerActivate + + # Complete the task if destination is azure blob + if ($destination -eq "AzureBlob") + { + # Get URI and SaSToken for output variable + $storageAccountContainerURI = $storageContext.BlobEndPoint + $containerName + "/" + Write-Host "##vso[task.setvariable variable=StorageContainerUri]$storageAccountContainerURI" + + + $storageContainerSaSToken = Generate-AzureStorageContainerSASToken -containerName $containerName -storageContext $storageContext -tokenTimeOutInMinutes $sasTokenTimeOutInMinutes + Write-Host "##vso[task.setvariable variable=StorageContainerSasToken]$storageContainerSasToken" + + Remove-EndpointSecrets + Write-Verbose "Completed Azure File Copy Task for Azure Blob Destination" + + return + } + + # Copying files to Azure VMs + try + { + # Normalize admin username + if($vmsAdminUserName -and (-not $vmsAdminUserName.StartsWith(".\")) -and ($vmsAdminUserName.IndexOf("\") -eq -1) -and ($vmsAdminUserName.IndexOf("@") -eq -1)) + { + $vmsAdminUserName = ".\" + $vmsAdminUserName + } + # getting azure vms properties(name, fqdn, winrmhttps port) + $azureVMResourcesProperties = Get-AzureVMResourcesProperties -resourceGroupName $environmentName ` + -resourceFilteringMethod $resourceFilteringMethod -machineNames $machineNames -enableCopyPrerequisites $enableCopyPrerequisites ` + -connectedServiceName $connectedServiceName + + $azureVMsCredentials = Get-AzureVMsCredentials -vmsAdminUserName $vmsAdminUserName -vmsAdminPassword $vmsAdminPassword + + # Get Invoke-RemoteScript parameters + $invokeRemoteScriptParams = Get-InvokeRemoteScriptParameters -azureVMResourcesProperties $azureVMResourcesProperties ` + -networkCredentials $azureVMsCredentials ` + -skipCACheck $skipCACheck + + # generate container sas token with full permissions + $containerSasToken = Generate-AzureStorageContainerSASToken -containerName $containerName -storageContext $storageContext -tokenTimeOutInMinutes $sasTokenTimeOutInMinutes + + # Copies files on azureVMs + Copy-FilesToAzureVMsFromStorageContainer -targetMachineNames $invokeRemoteScriptParams.targetMachineNames ` + -credential $invokeRemoteScriptParams.credential ` + -protocol $invokeRemoteScriptParams.protocol ` + -sessionOption $invokeRemoteScriptParams.sessionOption ` + -blobStorageEndpoint $blobStorageEndpoint ` + -containerName $containerName ` + -containerSasToken $containerSasToken ` + -targetPath $targetPath ` + -cleanTargetBeforeCopy $cleanTargetBeforeCopy ` + -copyFilesInParallel $copyFilesInParallel ` + -additionalArguments $additionalArgumentsForVMCopy ` + -azCopyToolLocation $azCopyLocation ` + -fileCopyJobScript $AzureFileCopyRemoteJob ` + -enableDetailedLogging $enableDetailedLogging ` + -useSanitizerActivate $useSanitizerActivate + + Write-Output (Get-VstsLocString -Key "AFC_CopySuccessful" -ArgumentList $sourcePath, $environmentName) + } + catch + { + Write-Verbose $_.Exception.ToString() + + Write-Telemetry "Task_InternalError" "CopyingToAzureVMFailed" + throw + } + finally + { + Remove-AzureContainer -containerName $containerName -storageContext $storageContext + Remove-EndpointSecrets + Write-Verbose "Completed Azure File Copy Task for Azure VMs Destination" -Verbose + Trace-VstsLeavingInvocation $MyInvocation + } +} +finally { + Disconnect-AzureAndClearContext -authScheme $endpoint.Auth.Scheme -ErrorAction SilentlyContinue +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/AzureFileCopyRemoteJob.ps1 b/_generated/AzureFileCopyV5/AzureFileCopyRemoteJob.ps1 new file mode 100644 index 000000000000..59c352454349 --- /dev/null +++ b/_generated/AzureFileCopyV5/AzureFileCopyRemoteJob.ps1 @@ -0,0 +1,120 @@ +$AzureFileCopyRemoteJob = { + param( + [string]$containerURL, + [string]$targetPath, + [string]$containerSasToken, + [string]$additionalArguments, + [switch]$CleanTargetBeforeCopy, + [switch]$EnableDetailedLogging, + [switch]$useSanitizerActivate + ) + + function Write-DetailLogs + { + [CmdletBinding()] + param( + [string]$message + ) + + if($EnableDetailedLogging) + { + Write-Verbose $message + } + } + + try + { + $useDefaultArguments = ($additionalArguments -eq "") + + # Argument to check whether azcopy.exe needs to be downloaded on VM or it is already present on VM + $shouldDownload = $false + + if($CleanTargetBeforeCopy) + { + if (Test-Path $targetPath -PathType Container) + { + Get-ChildItem -Path $targetPath -Recurse -Force | Remove-Item -Force -Recurse + Write-DetailLogs "Destination location cleaned" + } + else + { + Write-DetailLogs "Folder at path $targetPath not found for cleanup." + } + } + + try + { + $azCopyVersionCommand = azcopy --version + $azCopyVersion = $azCopyVersionCommand.split(' ')[2] + if([version]$azCopyVersion -lt [version]"10.12.2") + { + $shouldDownload = $true + } + } + catch + { + $shouldDownload = $true + } + + if($shouldDownload) + { + try + { + $azCopyFolderName = "ADO_AzCopyV10" + $azCopyFolderPath = Join-Path -Path $env:systemdrive -ChildPath $azCopyFolderName + + New-Item -ItemType Directory -Force -Path $azCopyFolderPath + $azCopyZipPath = Join-Path -Path $azCopyFolderPath -ChildPath "AzCopy.zip" + + # Downloading AzCopy from URL and copying it in $azcopyZipPath + $webclient = New-Object System.Net.WebClient + $webclient.DownloadFile('https://vstsagenttools.blob.core.windows.net/tools/azcopy/10.12/AzCopy.zip',$azCopyZipPath) + + #Unzipping the azcopy zip to $azcopyFolderPath + Expand-Archive $azCopyZipPath -DestinationPath $azCopyFolderPath -Force + + $azCopyFolderEnvPath = Join-Path -Path $azCopyFolderPath -ChildPath "AzCopy" + + #setting path at machine level so that when user again do copy on VM, there is no need to download the azcopy.exe again + [Environment]::SetEnvironmentVariable("Path", $azCopyFolderEnvPath + ';' + $env:Path, [System.EnvironmentVariableTarget]::Machine) + + #setting $env:Path at user level to include azcopy.exe path as the above command used do set the path at machine level and not at user level + $env:Path = $azCopyFolderEnvPath + ';' + $env:Path + } + catch + { + $exceptionMessage = $_.Exception.Message.ToString() + throw "Failed while downloading azcopy.exe from the URL with exception $exceptionMessage. Please download azcopy.exe 10.12.2 and set this extracted path in env:Path" + } + } + + if($useDefaultArguments) + { + # Adding default optional arguments: + # log-level: Defines the log verbosity for the log file. Default is INFO(all requests/responses) + # recursive: Recursive copy + + Write-DetailLogs "Using default AzCopy arguments for dowloading to VM" + $additionalArguments = "--recursive --log-level=INFO" + } + if (-not $containerSasToken.StartsWith("?")) + { + $containerSasToken = '?' + $containerSasToken + } + if ($useSanitizerActivate) { + # Splitting arguments on space, but not on space inside quotes + $sanitizedArguments = [regex]::Split($additionalArguments, ' (?=(?:[^"]|"[^"]*")*$)') + Write-DetailLogs "##[command] & azcopy copy `"$containerURL*****`" `"$targetPath`" $sanitizedArguments" + & azcopy copy "$containerURL/*$containerSasToken" "$targetPath" $sanitizedArguments + } else { + Write-DetailLogs "##[command] & azcopy copy `"$containerURL*****`" `"$targetPath`" $additionalArguments" + $azCopyCommand = "& azcopy copy `"$containerURL/*$containerSasToken`" `"$targetPath`" $additionalArguments" + Invoke-Expression $azCopyCommand + } + } + catch + { + Write-Verbose "AzureFileCopyRemoteJob threw exception" + throw + } +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/AzureUtilityARM.ps1 b/_generated/AzureFileCopyV5/AzureUtilityARM.ps1 new file mode 100644 index 000000000000..bc0b524ddd79 --- /dev/null +++ b/_generated/AzureFileCopyV5/AzureUtilityARM.ps1 @@ -0,0 +1,510 @@ +# This file implements IAzureUtility for AzureRM PowerShell + +. "$PSScriptRoot/AzureUtilityRest.ps1" + +$featureFlags = @{ + retireAzureRM = [System.Convert]::ToBoolean($env:RETIRE_AZURERM_POWERSHELL_MODULE) +} + +function Get-AzureStorageAccountResourceGroupName +{ + param([string]$storageAccountName) + + $ARMStorageAccountResourceType = "Microsoft.Storage/storageAccounts" + if (-not [string]::IsNullOrEmpty($storageAccountName)) + { + Write-Verbose "[Azure Call]Getting resource details for azure storage account resource: $storageAccountName with resource type: $ARMStorageAccountResourceType" + if ($featureFlags.retireAzureRM) + { + $azureStorageAccountResourceDetails = Get-AzStorageAccount -ErrorAction Stop | Where-Object { $_.StorageAccountName -eq $storageAccountName } + } + else + { + $azureStorageAccountResourceDetails = Get-AzureRmStorageAccount -ErrorAction Stop | Where-Object { $_.StorageAccountName -eq $storageAccountName } + } + Write-Verbose "[Azure Call]Retrieved resource details successfully for azure storage account resource: $storageAccountName with resource type: $ARMStorageAccountResourceType" + + $azureResourceGroupName = $azureStorageAccountResourceDetails.ResourceGroupName + if ([string]::IsNullOrEmpty($azureResourceGroupName)) + { + Write-Verbose "(ARM)Storage account: $storageAccountName not found" + Write-Telemetry "Task_InternalError" "RMStorageAccountNotFound" + Throw (Get-VstsLocString -Key "AFC_StorageAccountNotFound" -ArgumentList $storageAccountName) + } + + return $azureResourceGroupName + } +} + +function Create-AzureStorageContext +{ + param([string]$storageAccountName, + [string]$storageAccountKey) + + if(-not [string]::IsNullOrEmpty($storageAccountName) -and -not [string]::IsNullOrEmpty($storageAccountKey)) + { + Write-Verbose "[Azure Call]Creating AzureStorageContext for storage account: $storageAccountName" + if ($featureFlags.retireAzureRM) + { + $storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey -ErrorAction Stop + } + else + { + $storageContext = New-AzureStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey -ErrorAction Stop + } + Write-Verbose "[Azure Call]Created AzureStorageContext for storage account: $storageAccountName" + + return $storageContext + } +} + +function Create-AzureContainer +{ + param([string]$containerName, + [object]$storageContext) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Creating container: $containerName in storage account: $storageAccountName" + if ($featureFlags.retireAzureRM) + { + $container = New-AzStorageContainer -Name $containerName -Context $storageContext -Permission Off -ErrorAction Stop + } + else + { + $container = New-AzureStorageContainer -Name $containerName -Context $storageContext -Permission Off -ErrorAction Stop + } + Write-Verbose "[Azure Call]Created container: $containerName successfully in storage account: $storageAccountName" + } +} + +function Get-AzureContainer +{ + param([string]$containerName, + [object]$storageContext) + + $container = $null + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Getting container: $containerName in storage account: $storageAccountName" + try + { + if ($featureFlags.retireAzureRM) + { + $container = Get-AzStorageContainer -Name $containerName -Context $storageContext -ErrorAction Stop + } + else + { + $container = Get-AzureStorageContainer -Name $containerName -Context $storageContext -ErrorAction Stop + } + } + catch + { + Write-Verbose "Container: $containerName does not exist in storage account: $storageAccountName" + } + } + + return $container +} + +function Remove-AzureContainer +{ + param([string]$containerName, + [object]$storageContext) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Deleting container: $containerName in storage account: $storageAccountName" + if ($featureFlags.retireAzureRM) + { + Remove-AzStorageContainer -Name $containerName -Context $storageContext -Force -ErrorAction SilentlyContinue + } + else + { + Remove-AzureStorageContainer -Name $containerName -Context $storageContext -Force -ErrorAction SilentlyContinue + } + + Write-Verbose "[Azure Call]Deleted container: $containerName in storage account: $storageAccountName" + } +} + +function Get-AzureRMVMsInResourceGroup +{ + param([string]$resourceGroupName) + + If(-not [string]::IsNullOrEmpty($resourceGroupName)) + { + try + { + Write-Verbose "[Azure Call]Getting resource group:$resourceGroupName RM virtual machines type resources" + if ($featureFlags.retireAzureRM) + { + $azureRMVMResources = Get-AzVM -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + else + { + $azureRMVMResources = Get-AzureRMVM -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Count of resource group:$resourceGroupName RM virtual machines type resource is $($azureRMVMResources.Count)" + + return $azureRMVMResources + } + catch [Hyak.Common.CloudException], [Microsoft.Rest.Azure.CloudException] + { + $exceptionMessage = $_.Exception.Message.ToString() + Write-Verbose "ExceptionMessage: $exceptionMessage" + + Write-Telemetry "Task_InternalError" "ResourceGroupNotFound" + throw (Get-VstsLocString -Key "AFC_ResourceGroupNotFound" -ArgumentList $resourceGroupName) + } + } +} + +function Get-AzureRMResourceGroupResourcesDetails +{ + param([string]$resourceGroupName, + [object]$azureRMVMResources) + + [hashtable]$azureRGResourcesDetails = @{} + [hashtable]$loadBalancerDetails = @{} + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and $azureRMVMResources) + { + Write-Verbose "[Azure Call]Getting network interfaces in resource group $resourceGroupName" + if ($featureFlags.retireAzureRM) + { + $networkInterfaceResources = Get-AzNetworkInterface -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + else + { + $networkInterfaceResources = Get-AzureRMNetworkInterface -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Got network interfaces in resource group $resourceGroupName" + $azureRGResourcesDetails.Add("networkInterfaceResources", $networkInterfaceResources) + + Write-Verbose "[Azure Call]Getting public IP Addresses in resource group $resourceGroupName" + if ($featureFlags.retireAzureRM) + { + $publicIPAddressResources = Get-AzPublicIpAddress -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + else + { + $publicIPAddressResources = Get-AzureRMPublicIpAddress -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Got public IP Addresses in resource group $resourceGroupName" + $azureRGResourcesDetails.Add("publicIPAddressResources", $publicIPAddressResources) + + Write-Verbose "[Azure Call]Getting load balancers in resource group $resourceGroupName" + if ($featureFlags.retireAzureRM) + { + $lbGroup = Get-AzLoadBalancer -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + else + { + $lbGroup = Get-AzureRMLoadBalancer -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Got load balancers in resource group $resourceGroupName" + + if($lbGroup) + { + foreach($lb in $lbGroup) + { + $lbDetails = @{} + Write-Verbose "[Azure Call]Getting load balancer in resource group $resourceGroupName" + if ($featureFlags.retireAzureRM) + { + $loadBalancer = Get-AzLoadBalancer -Name $lb.Name -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + else + { + $loadBalancer = Get-AzureRMLoadBalancer -Name $lb.Name -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Got load balancer in resource group $resourceGroupName" + + Write-Verbose "[Azure Call]Getting LoadBalancer Frontend Ip Config" + if ($featureFlags.retireAzureRM) + { + $frontEndIPConfigs = Get-AzLoadBalancerFrontendIpConfig -LoadBalancer $loadBalancer -ErrorAction Stop -Verbose + } + else + { + $frontEndIPConfigs = Get-AzureRMLoadBalancerFrontendIpConfig -LoadBalancer $loadBalancer -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Got LoadBalancer Frontend Ip Config" + + Write-Verbose "[Azure Call]Getting Azure LoadBalancer Inbound NatRule Config" + if ($featureFlags.retireAzureRM) + { + $inboundRules = Get-AzLoadBalancerInboundNatRuleConfig -LoadBalancer $loadBalancer -ErrorAction Stop -Verbose + } + else + { + $inboundRules = Get-AzureRMLoadBalancerInboundNatRuleConfig -LoadBalancer $loadBalancer -ErrorAction Stop -Verbose + } + Write-Verbose "[Azure Call]Got Azure LoadBalancer Inbound NatRule Config" + + $lbDetails.Add("frontEndIPConfigs", $frontEndIPConfigs) + $lbDetails.Add("inboundRules", $inboundRules) + $loadBalancerDetails.Add($lb.Name, $lbDetails) + } + + $azureRGResourcesDetails.Add("loadBalancerResources", $loadBalancerDetails) + } + } + + return $azureRGResourcesDetails +} + +function Generate-AzureStorageContainerSASToken +{ + param([string]$containerName, + [object]$storageContext, + [System.Int32]$tokenTimeOutInMinutes) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Generating SasToken for container: $containerName in storage: $storageAccountName with expiry time: $tokenTimeOutInMinutes minutes" + if ($featureFlags.retireAzureRM) + { + $containerSasToken = New-AzStorageContainerSASToken -Name $containerName -ExpiryTime (Get-Date).AddMinutes($tokenTimeOutInMinutes) -Context $storageContext -Permission rwdl + } + else + { + $containerSasToken = New-AzureStorageContainerSASToken -Name $containerName -ExpiryTime (Get-Date).AddMinutes($tokenTimeOutInMinutes) -Context $storageContext -Permission rwdl + } + $containerSasToken = New-AzStorageContainerSASToken -Name $containerName -ExpiryTime (Get-Date).AddMinutes($tokenTimeOutInMinutes) -Context $storageContext -Permission rwdl + Write-Verbose "[Azure Call]Generated SasToken: $containerSasToken successfully for container: $containerName in storage: $storageAccountName" + + return $containerSasToken + } +} + +function Get-AzureMachineStatus +{ + param([string]$resourceGroupName, + [string]$name) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($name)) + { + Write-Host (Get-VstsLocString -Key "AFC_GetVMStatus" -ArgumentList $name) + if ($featureFlags.retireAzureRM) + { + $status = Get-AzVM -ResourceGroupName $resourceGroupName -Name $name -Status -ErrorAction Stop -Verbose + } + else + { + $status = Get-AzureRmVM -ResourceGroupName $resourceGroupName -Name $name -Status -ErrorAction Stop -Verbose + } + Write-Host (Get-VstsLocString -Key "AFC_GetVMStatusComplete" -ArgumentList $name) + } + + return $status +} + +function Set-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name, + [string[]]$fileUri, + [string]$run, + [string]$argument, + [string]$location) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName) -and -not [string]::IsNullOrEmpty($name)) + { + Write-Host (Get-VstsLocString -Key "AFC_SetCustomScriptExtension" -ArgumentList $name, $vmName) + Write-Verbose "Set-AzureRmVMCustomScriptExtension -ResourceGroupName $resourceGroupName -VMName $vmName -Name $name -FileUri $fileUri -Run $run -Argument $argument -Location $location -ErrorAction Stop -Verbose" + if ($featureFlags.retireAzureRM) + { + $result = Set-AzVMCustomScriptExtension -ResourceGroupName $resourceGroupName -VMName $vmName -Name $name -FileUri $fileUri -Run $run -Argument $argument -Location $location -ErrorAction Stop -Verbose + } + else + { + $result = Set-AzureRmVMCustomScriptExtension -ResourceGroupName $resourceGroupName -VMName $vmName -Name $name -FileUri $fileUri -Run $run -Argument $argument -Location $location -ErrorAction Stop -Verbose + } + Write-Host (Get-VstsLocString -Key "AFC_SetCustomScriptExtensionComplete" -ArgumentList $name, $vmName) + if($result.IsSuccessStatusCode -eq $true) + { + $responseJObject = [Newtonsoft.Json.Linq.JObject]::Parse(($result | ConvertTo-Json)) + $result = $responseJObject.ToObject([System.Collections.Hashtable]) + $result.Status = "Succeeded" + } + } + + return $result +} + +function Get-NetworkSecurityGroups +{ + param([string]$resourceGroupName, + [string]$vmId) + + $securityGroups = New-Object System.Collections.Generic.List[System.Object] + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmId)) + { + Write-Verbose "[Azure Call]Getting network interfaces in resource group $resourceGroupName for vm $vmId" + if ($featureFlags.retireAzureRM) + { + $networkInterfaces = Get-AzNetworkInterface -ResourceGroupName $resourceGroupName | Where-Object { $_.VirtualMachine.Id -eq $vmId } + } + else + { + $networkInterfaces = Get-AzureRmNetworkInterface -ResourceGroupName $resourceGroupName | Where-Object { $_.VirtualMachine.Id -eq $vmId } + } + Write-Verbose "[Azure Call]Got network interfaces in resource group $resourceGroupName" + + if($networkInterfaces) + { + $noOfNics = $networkInterfaces.Count + Write-Verbose "Number of network interface cards present in the vm: $noOfNics" + + foreach($networkInterface in $networkInterfaces) + { + $networkSecurityGroupEntry = $networkInterface.NetworkSecurityGroup + if($networkSecurityGroupEntry) + { + $nsId = $networkSecurityGroupEntry.Id + Write-Verbose "Network Security Group Id: $nsId" + + $securityGroupName = $nsId.Split('/')[-1] + $sgResourceGroup = $nsId.Split('/')[4] + Write-Verbose "Security Group name is $securityGroupName and the related resource group $sgResourceGroup" + + # Get the network security group object + Write-Verbose "[Azure Call]Getting network security group $securityGroupName in resource group $sgResourceGroup" + if ($featureFlags.retireAzureRM) + { + $securityGroup = Get-AzNetworkSecurityGroup -ResourceGroupName $sgResourceGroup -Name $securityGroupName + } + else + { + $securityGroup = Get-AzureRmNetworkSecurityGroup -ResourceGroupName $sgResourceGroup -Name $securityGroupName + } + Write-Verbose "[Azure Call]Got network security group $securityGroupName in resource group $sgResourceGroup" + + $securityGroups.Add($securityGroup) + } + } + } + else + { + throw (Get-VstsLocString -Key "AFC_NoNetworkInterface" -ArgumentList $vmid , $resourceGroupName) + } + } + else + { + throw (Get-VstsLocString -Key "AFC_NullOrEmptyResourceGroup") + } + + return $securityGroups +} + +function Add-NetworkSecurityRuleConfig +{ + param([string]$resourceGroupName, + [object]$securityGroups, + [string]$ruleName, + [string]$rulePriotity, + [string]$winrmHttpsPort) + + if($securityGroups.Count -gt 0) + { + foreach($securityGroup in $securityGroups) + { + $securityGroupName = $securityGroup.Name + try + { + $winRMConfigRule = $null + + Write-Verbose "[Azure Call]Getting network security rule config $ruleName under security group $securityGroupName" + if ($featureFlags.retireAzureRM) + { + $winRMConfigRule = Get-AzNetworkSecurityRuleConfig -NetworkSecurityGroup $securityGroup -Name $ruleName -EA SilentlyContinue + } + else + { + $winRMConfigRule = Get-AzureRmNetworkSecurityRuleConfig -NetworkSecurityGroup $securityGroup -Name $ruleName -EA SilentlyContinue + } + Write-Verbose "[Azure Call]Got network security rule config $ruleName under security group $securityGroupName" + } + catch + { + #Ignore the exception + } + + # Add the network security rule if it doesn't exists + if(-not $winRMConfigRule) + { + $maxRetries = 3 + for($retryCnt=1; $retryCnt -le $maxRetries; $retryCnt++) + { + try + { + Write-Verbose "[Azure Call]Adding inbound network security rule config $ruleName with priority $rulePriotity for port $winrmHttpsPort under security group $securityGroupName" + if ($featureFlags.retireAzureRM) + { + $securityGroup = Add-AzNetworkSecurityRuleConfig -NetworkSecurityGroup $securityGroup -Name $ruleName -Direction Inbound -Access Allow -SourceAddressPrefix '*' -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange $winrmHttpsPort -Protocol * -Priority $rulePriotity + } + else + { + $securityGroup = Add-AzureRmNetworkSecurityRuleConfig -NetworkSecurityGroup $securityGroup -Name $ruleName -Direction Inbound -Access Allow -SourceAddressPrefix '*' -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange $winrmHttpsPort -Protocol * -Priority $rulePriotity + } + Write-Verbose "[Azure Call]Added inbound network security rule config $ruleName with priority $rulePriotity for port $winrmHttpsPort under security group $securityGroupName" + + Write-Verbose "[Azure Call]Setting the azure network security group" + if ($featureFlags.retireAzureRM) + { + $result = Set-AzNetworkSecurityGroup -NetworkSecurityGroup $securityGroup + } + else + { + $result = Set-AzureRmNetworkSecurityGroup -NetworkSecurityGroup $securityGroup + } + Write-Verbose "[Azure Call]Set the azure network security group" + } + catch + { + Write-Verbose "Failed to add inbound network security rule config $ruleName with priority $rulePriotity for port $winrmHttpsPort under security group $securityGroupName : $_.Exception.Message" + + $newPort = [convert]::ToInt32($rulePriotity, 10) + 50; + $rulePriotity = $newPort.ToString() + + Write-Verbose "[Azure Call]Getting network security group $securityGroupName in resource group $resourceGroupName" + if ($featureFlags.retireAzureRM) + { + $securityGroup = Get-AzNetworkSecurityGroup -ResourceGroupName $resourceGroupName -Name $securityGroupName + } + else + { + $securityGroup = Get-AzureRmNetworkSecurityGroup -ResourceGroupName $resourceGroupName -Name $securityGroupName + } + Write-Verbose "[Azure Call]Got network security group $securityGroupName in resource group $resourceGroupName" + + + if($retryCnt -eq $maxRetries) + { + throw $_ + } + + continue + } + + Write-Verbose "Successfully added the network security group rule $ruleName with priority $rulePriotity for port $winrmHttpsPort" + break + } + } + } + } +} + diff --git a/_generated/AzureFileCopyV5/AzureUtilityAz1.0.ps1 b/_generated/AzureFileCopyV5/AzureUtilityAz1.0.ps1 new file mode 100644 index 000000000000..3255f033098f --- /dev/null +++ b/_generated/AzureFileCopyV5/AzureUtilityAz1.0.ps1 @@ -0,0 +1,380 @@ +# This file implements IAzureUtility for Az PowerShell + +. "$PSScriptRoot/AzureUtilityRest.ps1" + +function Get-AzureStorageAccountResourceGroupName +{ + param([string]$storageAccountName) + + $ARMStorageAccountResourceType = "Microsoft.Storage/storageAccounts" + if (-not [string]::IsNullOrEmpty($storageAccountName)) + { + Write-Verbose "[Azure Call]Getting resource details for azure storage account resource: $storageAccountName with resource type: $ARMStorageAccountResourceType" + $azureStorageAccountResourceDetails = Az.Storage\Get-AzStorageAccount -ErrorAction Stop | Where-Object { $_.StorageAccountName -eq $storageAccountName } + + Write-Verbose "[Azure Call]Retrieved resource details successfully for azure storage account resource: $storageAccountName with resource type: $ARMStorageAccountResourceType" + + $azureResourceGroupName = $azureStorageAccountResourceDetails.ResourceGroupName + if ([string]::IsNullOrEmpty($azureResourceGroupName)) + { + Write-Verbose "(ARM)Storage account: $storageAccountName not found" + Write-Telemetry "Task_InternalError" "RMStorageAccountNotFound" + Throw (Get-VstsLocString -Key "AFC_StorageAccountNotFound" -ArgumentList $storageAccountName) + } + + return $azureResourceGroupName + } +} + +function Create-AzureStorageContext +{ + param([string]$storageAccountName, + [string]$storageAccountKey) + + if(-not [string]::IsNullOrEmpty($storageAccountName) -and -not [string]::IsNullOrEmpty($storageAccountKey)) + { + Write-Verbose "[Azure Call]Creating AzStorageContext for storage account: $storageAccountName" + $storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey -ErrorAction Stop + Write-Verbose "[Azure Call]Created AzStorageContext for storage account: $storageAccountName" + + return $storageContext + } +} + +function Create-AzureContainer +{ + param([string]$containerName, + [object]$storageContext) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Creating container: $containerName in storage account: $storageAccountName" + $container = New-AzStorageContainer -Name $containerName -Context $storageContext -Permission Off -ErrorAction Stop + Write-Verbose "[Azure Call]Created container: $containerName successfully in storage account: $storageAccountName" + } +} + +function Get-AzureContainer +{ + param([string]$containerName, + [object]$storageContext) + + $container = $null + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Getting container: $containerName in storage account: $storageAccountName" + try + { + $container = Get-AzStorageContainer -Name $containerName -Context $storageContext -ErrorAction Stop + } + catch + { + Write-Verbose "Container: $containerName does not exist in storage account: $storageAccountName" + } + } + + return $container +} + +function Remove-AzureContainer +{ + param([string]$containerName, + [object]$storageContext) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Deleting container: $containerName in storage account: $storageAccountName" + Remove-AzStorageContainer -Name $containerName -Context $storageContext -Force -ErrorAction SilentlyContinue + Write-Verbose "[Azure Call]Deleted container: $containerName in storage account: $storageAccountName" + } +} + +function Get-AzureRMVMsInResourceGroup +{ + param([string]$resourceGroupName) + + If(-not [string]::IsNullOrEmpty($resourceGroupName)) + { + try + { + Write-Verbose "[Azure Call]Getting resource group:$resourceGroupName RM virtual machines type resources" + $azureRMVMResources = Get-AzVM -ResourceGroupName $resourceGroupName -ErrorAction Stop -WarningAction SilentlyContinue -Verbose + Write-Verbose "[Azure Call]Count of resource group:$resourceGroupName RM virtual machines type resource is $($azureRMVMResources.Count)" + + return $azureRMVMResources + } + catch [Hyak.Common.CloudException], [Microsoft.Rest.Azure.CloudException] + { + $exceptionMessage = $_.Exception.Message.ToString() + Write-Verbose "ExceptionMessage: $exceptionMessage" + + Write-Telemetry "Task_InternalError" "ResourceGroupNotFound" + throw (Get-VstsLocString -Key "AFC_ResourceGroupNotFound" -ArgumentList $resourceGroupName) + } + } +} + +function Get-AzureRMResourceGroupResourcesDetails +{ + param([string]$resourceGroupName, + [object]$azureRMVMResources) + + [hashtable]$azureRGResourcesDetails = @{} + [hashtable]$loadBalancerDetails = @{} + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and $azureRMVMResources) + { + Write-Verbose "[Azure Call]Getting network interfaces in resource group $resourceGroupName" + $networkInterfaceResources = Get-AzNetworkInterface -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + Write-Verbose "[Azure Call]Got network interfaces in resource group $resourceGroupName" + $azureRGResourcesDetails.Add("networkInterfaceResources", $networkInterfaceResources) + + Write-Verbose "[Azure Call]Getting public IP Addresses in resource group $resourceGroupName" + $publicIPAddressResources = Get-AzPublicIpAddress -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + Write-Verbose "[Azure Call]Got public IP Addresses in resource group $resourceGroupName" + $azureRGResourcesDetails.Add("publicIPAddressResources", $publicIPAddressResources) + + Write-Verbose "[Azure Call]Getting load balancers in resource group $resourceGroupName" + $lbGroup = Get-AzLoadBalancer -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + Write-Verbose "[Azure Call]Got load balancers in resource group $resourceGroupName" + + if($lbGroup) + { + foreach($lb in $lbGroup) + { + $lbDetails = @{} + Write-Verbose "[Azure Call]Getting load balancer in resource group $resourceGroupName" + $loadBalancer = Get-AzLoadBalancer -Name $lb.Name -ResourceGroupName $resourceGroupName -ErrorAction Stop -Verbose + Write-Verbose "[Azure Call]Got load balancer in resource group $resourceGroupName" + + Write-Verbose "[Azure Call]Getting LoadBalancer Frontend Ip Config" + $frontEndIPConfigs = Get-AzLoadBalancerFrontendIpConfig -LoadBalancer $loadBalancer -ErrorAction Stop -Verbose + Write-Verbose "[Azure Call]Got LoadBalancer Frontend Ip Config" + + Write-Verbose "[Azure Call]Getting Azure LoadBalancer Inbound NatRule Config" + $inboundRules = Get-AzLoadBalancerInboundNatRuleConfig -LoadBalancer $loadBalancer -ErrorAction Stop -Verbose + Write-Verbose "[Azure Call]Got Azure LoadBalancer Inbound NatRule Config" + + $lbDetails.Add("frontEndIPConfigs", $frontEndIPConfigs) + $lbDetails.Add("inboundRules", $inboundRules) + $loadBalancerDetails.Add($lb.Name, $lbDetails) + } + + $azureRGResourcesDetails.Add("loadBalancerResources", $loadBalancerDetails) + } + } + + return $azureRGResourcesDetails +} + +function Generate-AzureStorageContainerSASToken +{ + param([string]$containerName, + [object]$storageContext, + [System.Int32]$tokenTimeOutInMinutes) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + $storageAccountName = $storageContext.StorageAccountName + + Write-Verbose "[Azure Call]Generating SasToken for container: $containerName in storage: $storageAccountName with expiry time: $tokenTimeOutInMinutes minutes" + $containerSasToken = New-AzStorageContainerSASToken -Name $containerName -ExpiryTime (Get-Date).AddMinutes($tokenTimeOutInMinutes) -Context $storageContext -Permission rwdl + Write-Verbose "[Azure Call]Generated SasToken: $containerSasToken successfully for container: $containerName in storage: $storageAccountName" + + return $containerSasToken + } +} + +function Get-AzureMachineStatus +{ + param([string]$resourceGroupName, + [string]$name) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($name)) + { + Write-Host (Get-VstsLocString -Key "AFC_GetVMStatus" -ArgumentList $name) + $status = Get-AzVM -ResourceGroupName $resourceGroupName -Name $name -Status -ErrorAction Stop -WarningAction SilentlyContinue -Verbose + Write-Host (Get-VstsLocString -Key "AFC_GetVMStatusComplete" -ArgumentList $name) + } + + return $status +} + +function Set-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name, + [string[]]$fileUri, + [string]$run, + [string]$argument, + [string]$location) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName) -and -not [string]::IsNullOrEmpty($name)) + { + Write-Host (Get-VstsLocString -Key "AFC_SetCustomScriptExtension" -ArgumentList $name, $vmName) + Write-Verbose "Set-AzVMCustomScriptExtension -ResourceGroupName $resourceGroupName -VMName $vmName -Name $name -FileUri $fileUri -Run $run -Argument $argument -Location $location -ErrorAction Stop -Verbose" + $result = Set-AzVMCustomScriptExtension -ResourceGroupName $resourceGroupName -VMName $vmName -Name $name -FileUri $fileUri -Run $run -Argument $argument -Location $location -ErrorAction Stop -Verbose + Write-Host (Get-VstsLocString -Key "AFC_SetCustomScriptExtensionComplete" -ArgumentList $name, $vmName) + if($result.IsSuccessStatusCode -eq $true) + { + $responseJObject = [Newtonsoft.Json.Linq.JObject]::Parse(($result | ConvertTo-Json)) + $result = $responseJObject.ToObject([System.Collections.Hashtable]) + $result.Status = "Succeeded" + } + } + + return $result +} + +function Get-NetworkSecurityGroups +{ + param([string]$resourceGroupName, + [string]$vmId) + + $securityGroups = New-Object System.Collections.Generic.List[System.Object] + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmId)) + { + Write-Verbose "[Azure Call]Getting network interfaces in resource group $resourceGroupName for vm $vmId" + $networkInterfaces = Get-AzNetworkInterface -ResourceGroupName $resourceGroupName | Where-Object { $_.VirtualMachine.Id -eq $vmId } + Write-Verbose "[Azure Call]Got network interfaces in resource group $resourceGroupName" + + if($networkInterfaces) + { + $noOfNics = $networkInterfaces.Count + Write-Verbose "Number of network interface cards present in the vm: $noOfNics" + + foreach($networkInterface in $networkInterfaces) + { + $networkSecurityGroupEntry = $networkInterface.NetworkSecurityGroup + if($networkSecurityGroupEntry) + { + $nsId = $networkSecurityGroupEntry.Id + Write-Verbose "Network Security Group Id: $nsId" + + $securityGroupName = $nsId.Split('/')[-1] + $sgResourceGroup = $nsId.Split('/')[4] + Write-Verbose "Security Group name is $securityGroupName and the related resource group $sgResourceGroup" + + # Get the network security group object + Write-Verbose "[Azure Call]Getting network security group $securityGroupName in resource group $sgResourceGroup" + $securityGroup = Get-AzNetworkSecurityGroup -ResourceGroupName $sgResourceGroup -Name $securityGroupName + Write-Verbose "[Azure Call]Got network security group $securityGroupName in resource group $sgResourceGroup" + + $securityGroups.Add($securityGroup) + } + } + } + else + { + throw (Get-VstsLocString -Key "AFC_NoNetworkInterface" -ArgumentList $vmid , $resourceGroupName) + } + } + else + { + throw (Get-VstsLocString -Key "AFC_NullOrEmptyResourceGroup") + } + + return $securityGroups +} + +function Add-NetworkSecurityRuleConfig +{ + param([string]$resourceGroupName, + [object]$securityGroups, + [string]$ruleName, + [string]$rulePriotity, + [string]$winrmHttpsPort) + + if($securityGroups.Count -gt 0) + { + foreach($securityGroup in $securityGroups) + { + $securityGroupName = $securityGroup.Name + try + { + $winRMConfigRule = $null + + Write-Verbose "[Azure Call]Getting network security rule config $ruleName under security group $securityGroupName" + $winRMConfigRule = Get-AzNetworkSecurityRuleConfig -NetworkSecurityGroup $securityGroup -Name $ruleName -EA SilentlyContinue + Write-Verbose "[Azure Call]Got network security rule config $ruleName under security group $securityGroupName" + } + catch + { + #Ignore the exception + } + + # Add the network security rule if it doesn't exists + if(-not $winRMConfigRule) + { + $maxRetries = 3 + for($retryCnt=1; $retryCnt -le $maxRetries; $retryCnt++) + { + try + { + Write-Verbose "[Azure Call]Adding inbound network security rule config $ruleName with priority $rulePriotity for port $winrmHttpsPort under security group $securityGroupName" + $securityGroup = Add-AzNetworkSecurityRuleConfig -NetworkSecurityGroup $securityGroup -Name $ruleName -Direction Inbound -Access Allow -SourceAddressPrefix '*' -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange $winrmHttpsPort -Protocol * -Priority $rulePriotity + Write-Verbose "[Azure Call]Added inbound network security rule config $ruleName with priority $rulePriotity for port $winrmHttpsPort under security group $securityGroupName" + + Write-Verbose "[Azure Call]Setting the azure network security group" + $result = Set-AzNetworkSecurityGroup -NetworkSecurityGroup $securityGroup + Write-Verbose "[Azure Call]Set the azure network security group" + } + catch + { + Write-Verbose "Failed to add inbound network security rule config $ruleName with priority $rulePriotity for port $winrmHttpsPort under security group $securityGroupName : $_.Exception.Message" + + $newPort = [convert]::ToInt32($rulePriotity, 10) + 50; + $rulePriotity = $newPort.ToString() + + Write-Verbose "[Azure Call]Getting network security group $securityGroupName in resource group $resourceGroupName" + $securityGroup = Get-AzNetworkSecurityGroup -ResourceGroupName $resourceGroupName -Name $securityGroupName + Write-Verbose "[Azure Call]Got network security group $securityGroupName in resource group $resourceGroupName" + + + if($retryCnt -eq $maxRetries) + { + throw $_ + } + + continue + } + + Write-Verbose "Successfully added the network security group rule $ruleName with priority $rulePriotity for port $winrmHttpsPort" + break + } + } + } + } +} + +function Import-AzModule +{ + param([string]$moduleName) + + if (!(Get-Module $moduleName)) + { + $module = Get-Module -Name $moduleName -ListAvailable | Sort-Object Version -Descending | Select-Object -First 1 + if (!$module) { + Write-Verbose "No module found with name: $moduleName" + } + else { + # Import the module. + Write-Host "##[command]Import-Module -Name $($module.Path) -Global" + $module = Import-Module -Name $module.Path -Global -PassThru -Force + } + } +} + +Import-AzModule -moduleName "Az.Resources" +Import-AzModule -moduleName "Az.Storage" +Import-AzModule -moduleName "Az.Compute" +Import-AzModule -moduleName "Az.Network" diff --git a/_generated/AzureFileCopyV5/AzureUtilityRest.ps1 b/_generated/AzureFileCopyV5/AzureUtilityRest.ps1 new file mode 100644 index 000000000000..36befc173b47 --- /dev/null +++ b/_generated/AzureFileCopyV5/AzureUtilityRest.ps1 @@ -0,0 +1,154 @@ +Import-Module $PSScriptRoot\ps_modules\VstsAzureRestHelpers_ + +function Get-AzureStorageKeyFromARM +{ + param([string]$storageAccountName, + [object]$serviceEndpoint, + [string][Parameter(Mandatory=$false)]$connectedServiceNameARM) + + if (-not [string]::IsNullOrEmpty($storageAccountName)) + { + # get azure storage account resource group name + $azureResourceGroupName = Get-AzureStorageAccountResourceGroupName -storageAccountName $storageAccountName + + Write-Verbose "[Azure Call]Retrieving storage key for the storage account: $storageAccount in resource group: $azureResourceid" + + $storageKeyDetails = Get-AzRMStorageKeys $azureResourceGroupName $storageAccountName $serviceEndpoint $connectedServiceNameARM + $storageKey = $storageKeyDetails.Key1 + Write-Verbose "[Azure Call]Retrieved storage key successfully for the storage account: $storageAccount in resource group: $azureResourceGroupName" + + return $storageKey + } +} + +function Get-AzureBlobStorageEndpointFromARM +{ + param([string]$storageAccountName, + [object]$endpoint, + [string]$connectedServiceNameARM) + + if(-not [string]::IsNullOrEmpty($storageAccountName)) + { + # get azure storage account resource group name + $azureResourceGroupName = Get-AzureStorageAccountResourceGroupName -storageAccountName $storageAccountName + + Write-Verbose "[Azure Call]Retrieving storage account endpoint for the storage account: $storageAccount in resource group: $azureResourceGroupName" + + $storageAccountInfo = Get-AzRMStorageAccount $azureResourceGroupName $storageAccountName $endpoint $connectedServiceNameARM -ErrorAction Stop + $storageAccountEnpoint = $storageAccountInfo.PrimaryEndpoints[0].blob + Write-Verbose "[Azure Call]Retrieved storage account endpoint successfully for the storage account: $storageAccount in resource group: $azureResourceGroupName" + + return $storageAccountEnpoint + } +} + +function Get-AzureStorageAccountTypeFromARM +{ + param([string]$storageAccountName, + [object]$endpoint, + [string]$connectedServiceNameARM) + + if(-not [string]::IsNullOrEmpty($storageAccountName)) + { + # get azure storage account resource group name + $azureResourceGroupName = Get-AzureStorageAccountResourceGroupName -storageAccountName $storageAccountName + + Write-Verbose "[Azure Call]Retrieving storage account type for the storage account: $storageAccount in resource group: $azureResourceGroupName" + $storageAccountInfo = Get-AzRMStorageAccount $azureResourceGroupName $storageAccountName $endpoint $connectedServiceNameARM -ErrorAction Stop + $storageAccountType = $storageAccountInfo.sku.tier + Write-Verbose "[Azure Call]Retrieved storage account type successfully for the storage account: $storageAccount in resource group: $azureResourceGroupName" + + return $storageAccountType + } +} + +function Get-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name, + [object]$endpoint, + [string]$connectedServiceNameARM) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName)) + { + Write-Host (Get-VstsLocString -Key "AFC_GetCustomScriptExtension" -ArgumentList $name, $vmName) + $customScriptExtension = Get-AzRmVmCustomScriptExtension $resourceGroupName $vmName $name $endpoint $connectedServiceNameARM + Write-Host (Get-VstsLocString -Key "AFC_GetCustomScriptExtensionComplete" -ArgumentList $name, $vmName) + } + + return $customScriptExtension +} + +function Remove-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name, + [object]$endpoint, + [string]$connectedServiceNameARM) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName) -and -not [string]::IsNullOrEmpty($name)) + { + Write-Host (Get-VstsLocString -Key "AFC_RemoveCustomScriptExtension" -ArgumentList $name, $vmName) + $response = Remove-AzRmVMCustomScriptExtension $resourceGroupName $vmName $name $endpoint $connectedServiceNameARM + Write-Host (Get-VstsLocString -Key "AFC_RemoveCustomScriptExtensionComplete" -ArgumentList $name, $vmName) + } + + return $response +} + +function Get-AzureRMResourceGroupResourcesDetailsForAzureStack +{ + param([string]$resourceGroupName, + [object]$azureRMVMResources, + [object]$endpoint, + [string]$connectedServiceNameARM) + + [hashtable]$azureRGResourcesDetails = @{} + [hashtable]$loadBalancerDetails = @{} + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and $azureRMVMResources) + { + Write-Verbose "[Azure Call]Getting network interfaces in resource group $resourceGroupName" + $networkInterfaceResources = Get-AzureNetworkInterfaceDetails $resourceGroupName $endpoint $connectedServiceNameARM + Write-Verbose "[Azure Call]Got network interfaces in resource group $resourceGroupName" + $azureRGResourcesDetails.Add("networkInterfaceResources", $networkInterfaceResources) + + Write-Verbose "[Azure Call]Getting public IP Addresses in resource group $resourceGroupName" + $publicIPAddressResources = Get-AzurePublicIpAddressDetails $resourceGroupName $endpoint $connectedServiceNameARM + Write-Verbose "[Azure Call]Got public IP Addresses in resource group $resourceGroupName" + $azureRGResourcesDetails.Add("publicIPAddressResources", $publicIPAddressResources) + + Write-Verbose "[Azure Call]Getting load balancers in resource group $resourceGroupName" + $lbGroup = Get-AzureLoadBalancersDetails $resourceGroupName $endpoint $connectedServiceNameARM + Write-Verbose "[Azure Call]Got load balancers in resource group $resourceGroupName" + + if($lbGroup) + { + foreach($lb in $lbGroup) + { + $lbDetails = @{} + Write-Verbose "[Azure Call]Getting load balancer in resource group $resourceGroupName" + $loadBalancer = Get-AzureLoadBalancerDetails $resourceGroupName $lb.Name $endpoint $connectedServiceNameARM + Write-Verbose "[Azure Call]Got load balancer in resource group $resourceGroupName" + + Write-Verbose "[Azure Call]Getting LoadBalancer Frontend Ip Config" + $frontEndIPConfigs = Get-AzureRMLoadBalancerFrontendIpConfigDetails -LoadBalancer $loadBalancer + Write-Verbose "[Azure Call]Got LoadBalancer Frontend Ip Config" + + Write-Verbose "[Azure Call]Getting Azure LoadBalancer Inbound NatRule Config" + $inboundRules = Get-AzureRMLoadBalancerInboundNatRuleConfigDetails -LoadBalancer $loadBalancer + Write-Verbose "[Azure Call]Got Azure LoadBalancer Inbound NatRule Config" + + $lbDetails.Add("frontEndIPConfigs", $frontEndIPConfigs) + $lbDetails.Add("inboundRules", $inboundRules) + $loadBalancerDetails.Add($lb.Name, $lbDetails) + } + + $azureRGResourcesDetails.Add("loadBalancerResources", $loadBalancerDetails) + } + } + + return $azureRGResourcesDetails +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/MimeMapping.json b/_generated/AzureFileCopyV5/MimeMapping.json new file mode 100644 index 000000000000..bcca3431f02d --- /dev/null +++ b/_generated/AzureFileCopyV5/MimeMapping.json @@ -0,0 +1,559 @@ +{ + "MIMETypeMapping": { + ".323": "text/h323", + ".3g2": "video/3gpp2", + ".3gp": "video/3gpp", + ".3gp2": "video/3gpp2", + ".3gpp": "video/3gpp", + ".7z": "application/x-7z-compressed", + ".aca": "application/octet-stream", + ".accda": "application/msaccess.addin", + ".accdb": "application/msaccess", + ".accdc": "application/msaccess.cab", + ".accde": "application/msaccess", + ".accdr": "application/msaccess.runtime", + ".accdt": "application/msaccess", + ".accdw": "application/msaccess.webapplication", + ".accft": "application/msaccess.ftemplate", + ".acx": "application/internet-property-stream", + ".AddIn": "text/xml", + ".ade": "application/msaccess", + ".adobebridge": "application/x-bridge-url", + ".adp": "application/msaccess", + ".ADT": "audio/vnd.dlna.adts", + ".ADTS": "audio/aac", + ".afm": "application/octet-stream", + ".ai": "application/postscript", + ".aif": "audio/x-aiff", + ".aifc": "audio/aiff", + ".aiff": "audio/aiff", + ".air": "application/vnd.adobe.air-application-installer-package+zip", + ".amc": "application/x-mpeg", + ".application": "application/x-ms-application", + ".art": "image/x-jg", + ".asa": "application/xml", + ".asax": "application/xml", + ".ascx": "application/xml", + ".asd": "application/octet-stream", + ".asf": "video/x-ms-asf", + ".ashx": "application/xml", + ".asi": "application/octet-stream", + ".asm": "text/plain", + ".asmx": "application/xml", + ".aspx": "application/xml", + ".asr": "video/x-ms-asf", + ".asx": "video/x-ms-asf", + ".atom": "application/atom+xml", + ".au": "audio/basic", + ".avi": "video/x-msvideo", + ".axs": "application/olescript", + ".bas": "text/plain", + ".bcpio": "application/x-bcpio", + ".bin": "application/octet-stream", + ".bmp": "image/bmp", + ".c": "text/plain", + ".cab": "application/octet-stream", + ".caf": "audio/x-caf", + ".calx": "application/vnd.ms-office.calx", + ".cat": "application/vnd.ms-pki.seccat", + ".cc": "text/plain", + ".cd": "text/plain", + ".cdda": "audio/aiff", + ".cdf": "application/x-cdf", + ".cer": "application/x-x509-ca-cert", + ".chm": "application/octet-stream", + ".class": "application/x-java-applet", + ".clp": "application/x-msclip", + ".cmx": "image/x-cmx", + ".cnf": "text/plain", + ".cod": "image/cis-cod", + ".config": "application/xml", + ".contact": "text/x-ms-contact", + ".coverage": "application/xml", + ".cpio": "application/x-cpio", + ".cpp": "text/plain", + ".crd": "application/x-mscardfile", + ".crl": "application/pkix-crl", + ".crt": "application/x-x509-ca-cert", + ".cs": "text/plain", + ".csdproj": "text/plain", + ".csh": "application/x-csh", + ".csproj": "text/plain", + ".css": "text/css", + ".csv": "text/csv", + ".cur": "application/octet-stream", + ".cxx": "text/plain", + ".dat": "application/octet-stream", + ".datasource": "application/xml", + ".dbproj": "text/plain", + ".dcr": "application/x-director", + ".def": "text/plain", + ".deploy": "application/octet-stream", + ".der": "application/x-x509-ca-cert", + ".dgml": "application/xml", + ".dib": "image/bmp", + ".dif": "video/x-dv", + ".dir": "application/x-director", + ".disco": "text/xml", + ".dll": "application/x-msdownload", + ".dll.config": "text/xml", + ".dlm": "text/dlm", + ".doc": "application/msword", + ".docm": "application/vnd.ms-word.document.macroEnabled.12", + ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ".dot": "application/msword", + ".dotm": "application/vnd.ms-word.template.macroEnabled.12", + ".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template", + ".dsp": "application/octet-stream", + ".dsw": "text/plain", + ".dtd": "text/xml", + ".dtsConfig": "text/xml", + ".dv": "video/x-dv", + ".dvi": "application/x-dvi", + ".dwf": "drawing/x-dwf", + ".dwp": "application/octet-stream", + ".dxr": "application/x-director", + ".eml": "message/rfc822", + ".emz": "application/octet-stream", + ".eot": "application/octet-stream", + ".eps": "application/postscript", + ".etl": "application/etl", + ".etx": "text/x-setext", + ".evy": "application/envoy", + ".exe": "application/octet-stream", + ".exe.config": "text/xml", + ".fdf": "application/vnd.fdf", + ".fif": "application/fractals", + ".filters": "Application/xml", + ".fla": "application/octet-stream", + ".flr": "x-world/x-vrml", + ".flv": "video/x-flv", + ".fsscript": "application/fsharp-script", + ".fsx": "application/fsharp-script", + ".generictest": "application/xml", + ".gif": "image/gif", + ".group": "text/x-ms-group", + ".gsm": "audio/x-gsm", + ".gtar": "application/x-gtar", + ".gz": "application/x-gzip", + ".h": "text/plain", + ".hdf": "application/x-hdf", + ".hdml": "text/x-hdml", + ".hhc": "application/x-oleobject", + ".hhk": "application/octet-stream", + ".hhp": "application/octet-stream", + ".hlp": "application/winhlp", + ".hpp": "text/plain", + ".hqx": "application/mac-binhex40", + ".hta": "application/hta", + ".htc": "text/x-component", + ".htm": "text/html", + ".html": "text/html", + ".htt": "text/webviewhtml", + ".hxa": "application/xml", + ".hxc": "application/xml", + ".hxd": "application/octet-stream", + ".hxe": "application/xml", + ".hxf": "application/xml", + ".hxh": "application/octet-stream", + ".hxi": "application/octet-stream", + ".hxk": "application/xml", + ".hxq": "application/octet-stream", + ".hxr": "application/octet-stream", + ".hxs": "application/octet-stream", + ".hxt": "text/html", + ".hxv": "application/xml", + ".hxw": "application/octet-stream", + ".hxx": "text/plain", + ".i": "text/plain", + ".ico": "image/x-icon", + ".ics": "application/octet-stream", + ".idl": "text/plain", + ".ief": "image/ief", + ".iii": "application/x-iphone", + ".inc": "text/plain", + ".inf": "application/octet-stream", + ".inl": "text/plain", + ".ins": "application/x-internet-signup", + ".ipa": "application/x-itunes-ipa", + ".ipg": "application/x-itunes-ipg", + ".ipproj": "text/plain", + ".ipsw": "application/x-itunes-ipsw", + ".iqy": "text/x-ms-iqy", + ".isp": "application/x-internet-signup", + ".ite": "application/x-itunes-ite", + ".itlp": "application/x-itunes-itlp", + ".itms": "application/x-itunes-itms", + ".itpc": "application/x-itunes-itpc", + ".IVF": "video/x-ivf", + ".jar": "application/java-archive", + ".java": "application/octet-stream", + ".jck": "application/liquidmotion", + ".jcz": "application/liquidmotion", + ".jfif": "image/pjpeg", + ".jnlp": "application/x-java-jnlp-file", + ".jpb": "application/octet-stream", + ".jpe": "image/jpeg", + ".jpeg": "image/jpeg", + ".jpg": "image/jpeg", + ".js": "application/x-javascript", + ".json": "application/json", + ".jsx": "text/jscript", + ".jsxbin": "text/plain", + ".latex": "application/x-latex", + ".library-ms": "application/windows-library+xml", + ".lit": "application/x-ms-reader", + ".loadtest": "application/xml", + ".lpk": "application/octet-stream", + ".lsf": "video/x-la-asf", + ".lst": "text/plain", + ".lsx": "video/x-la-asf", + ".lzh": "application/octet-stream", + ".m13": "application/x-msmediaview", + ".m14": "application/x-msmediaview", + ".m1v": "video/mpeg", + ".m2t": "video/vnd.dlna.mpeg-tts", + ".m2ts": "video/vnd.dlna.mpeg-tts", + ".m2v": "video/mpeg", + ".m3u": "audio/x-mpegurl", + ".m3u8": "audio/x-mpegurl", + ".m4a": "audio/m4a", + ".m4b": "audio/m4b", + ".m4p": "audio/m4p", + ".m4r": "audio/x-m4r", + ".m4v": "video/x-m4v", + ".mac": "image/x-macpaint", + ".mak": "text/plain", + ".man": "application/x-troff-man", + ".manifest": "application/x-ms-manifest", + ".map": "text/plain", + ".master": "application/xml", + ".mda": "application/msaccess", + ".mdb": "application/x-msaccess", + ".mde": "application/msaccess", + ".mdp": "application/octet-stream", + ".me": "application/x-troff-me", + ".mfp": "application/x-shockwave-flash", + ".mht": "message/rfc822", + ".mhtml": "message/rfc822", + ".mid": "audio/mid", + ".midi": "audio/mid", + ".mix": "application/octet-stream", + ".mk": "text/plain", + ".mmf": "application/x-smaf", + ".mno": "text/xml", + ".mny": "application/x-msmoney", + ".mod": "video/mpeg", + ".mov": "video/quicktime", + ".movie": "video/x-sgi-movie", + ".mp2": "video/mpeg", + ".mp2v": "video/mpeg", + ".mp3": "audio/mpeg", + ".mp4": "video/mp4", + ".mp4v": "video/mp4", + ".mpa": "video/mpeg", + ".mpe": "video/mpeg", + ".mpeg": "video/mpeg", + ".mpf": "application/vnd.ms-mediapackage", + ".mpg": "video/mpeg", + ".mpp": "application/vnd.ms-project", + ".mpv2": "video/mpeg", + ".mqv": "video/quicktime", + ".ms": "application/x-troff-ms", + ".msi": "application/octet-stream", + ".mso": "application/octet-stream", + ".mts": "video/vnd.dlna.mpeg-tts", + ".mtx": "application/xml", + ".mvb": "application/x-msmediaview", + ".mvc": "application/x-miva-compiled", + ".mxp": "application/x-mmxp", + ".nc": "application/x-netcdf", + ".nsc": "video/x-ms-asf", + ".nws": "message/rfc822", + ".ocx": "application/octet-stream", + ".oda": "application/oda", + ".odc": "text/x-ms-odc", + ".odh": "text/plain", + ".odl": "text/plain", + ".odp": "application/vnd.oasis.opendocument.presentation", + ".ods": "application/oleobject", + ".odt": "application/vnd.oasis.opendocument.text", + ".one": "application/onenote", + ".onea": "application/onenote", + ".onepkg": "application/onenote", + ".onetmp": "application/onenote", + ".onetoc": "application/onenote", + ".onetoc2": "application/onenote", + ".orderedtest": "application/xml", + ".osdx": "application/opensearchdescription+xml", + ".p10": "application/pkcs10", + ".p12": "application/x-pkcs12", + ".p7b": "application/x-pkcs7-certificates", + ".p7c": "application/pkcs7-mime", + ".p7m": "application/pkcs7-mime", + ".p7r": "application/x-pkcs7-certreqresp", + ".p7s": "application/pkcs7-signature", + ".pbm": "image/x-portable-bitmap", + ".pcast": "application/x-podcast", + ".pct": "image/pict", + ".pcx": "application/octet-stream", + ".pcz": "application/octet-stream", + ".pdf": "application/pdf", + ".pfb": "application/octet-stream", + ".pfm": "application/octet-stream", + ".pfx": "application/x-pkcs12", + ".pgm": "image/x-portable-graymap", + ".pic": "image/pict", + ".pict": "image/pict", + ".pkgdef": "text/plain", + ".pkgundef": "text/plain", + ".pko": "application/vnd.ms-pki.pko", + ".pls": "audio/scpls", + ".pma": "application/x-perfmon", + ".pmc": "application/x-perfmon", + ".pml": "application/x-perfmon", + ".pmr": "application/x-perfmon", + ".pmw": "application/x-perfmon", + ".png": "image/png", + ".pnm": "image/x-portable-anymap", + ".pnt": "image/x-macpaint", + ".pntg": "image/x-macpaint", + ".pnz": "image/png", + ".pot": "application/vnd.ms-powerpoint", + ".potm": "application/vnd.ms-powerpoint.template.macroEnabled.12", + ".potx": "application/vnd.openxmlformats-officedocument.presentationml.template", + ".ppa": "application/vnd.ms-powerpoint", + ".ppam": "application/vnd.ms-powerpoint.addin.macroEnabled.12", + ".ppm": "image/x-portable-pixmap", + ".pps": "application/vnd.ms-powerpoint", + ".ppsm": "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", + ".ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow", + ".ppt": "application/vnd.ms-powerpoint", + ".pptm": "application/vnd.ms-powerpoint.presentation.macroEnabled.12", + ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", + ".prf": "application/pics-rules", + ".prm": "application/octet-stream", + ".prx": "application/octet-stream", + ".ps": "application/postscript", + ".psc1": "application/PowerShell", + ".psd": "application/octet-stream", + ".psess": "application/xml", + ".psm": "application/octet-stream", + ".psp": "application/octet-stream", + ".pub": "application/x-mspublisher", + ".pwz": "application/vnd.ms-powerpoint", + ".qht": "text/x-html-insertion", + ".qhtm": "text/x-html-insertion", + ".qt": "video/quicktime", + ".qti": "image/x-quicktime", + ".qtif": "image/x-quicktime", + ".qtl": "application/x-quicktimeplayer", + ".qxd": "application/octet-stream", + ".ra": "audio/x-pn-realaudio", + ".ram": "audio/x-pn-realaudio", + ".rar": "application/octet-stream", + ".ras": "image/x-cmu-raster", + ".rat": "application/rat-file", + ".rc": "text/plain", + ".rc2": "text/plain", + ".rct": "text/plain", + ".rdlc": "application/xml", + ".resx": "application/xml", + ".rf": "image/vnd.rn-realflash", + ".rgb": "image/x-rgb", + ".rgs": "text/plain", + ".rm": "application/vnd.rn-realmedia", + ".rmi": "audio/mid", + ".rmp": "application/vnd.rn-rn_music_package", + ".roff": "application/x-troff", + ".rpm": "audio/x-pn-realaudio-plugin", + ".rqy": "text/x-ms-rqy", + ".rtf": "application/rtf", + ".rtx": "text/richtext", + ".ruleset": "application/xml", + ".s": "text/plain", + ".safariextz": "application/x-safari-safariextz", + ".scd": "application/x-msschedule", + ".sct": "text/scriptlet", + ".sd2": "audio/x-sd2", + ".sdp": "application/sdp", + ".sea": "application/octet-stream", + ".searchConnector-ms": "application/windows-search-connector+xml", + ".setpay": "application/set-payment-initiation", + ".setreg": "application/set-registration-initiation", + ".settings": "application/xml", + ".sgimb": "application/x-sgimb", + ".sgml": "text/sgml", + ".sh": "application/x-sh", + ".shar": "application/x-shar", + ".shtml": "text/html", + ".sit": "application/x-stuffit", + ".sitemap": "application/xml", + ".skin": "application/xml", + ".sldm": "application/vnd.ms-powerpoint.slide.macroEnabled.12", + ".sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide", + ".slk": "application/vnd.ms-excel", + ".sln": "text/plain", + ".slupkg-ms": "application/x-ms-license", + ".smd": "audio/x-smd", + ".smi": "application/octet-stream", + ".smx": "audio/x-smd", + ".smz": "audio/x-smd", + ".snd": "audio/basic", + ".snippet": "application/xml", + ".snp": "application/octet-stream", + ".sol": "text/plain", + ".sor": "text/plain", + ".spc": "application/x-pkcs7-certificates", + ".spl": "application/futuresplash", + ".src": "application/x-wais-source", + ".srf": "text/plain", + ".SSISDeploymentManifest": "text/xml", + ".ssm": "application/streamingmedia", + ".sst": "application/vnd.ms-pki.certstore", + ".stl": "application/vnd.ms-pki.stl", + ".sv4cpio": "application/x-sv4cpio", + ".sv4crc": "application/x-sv4crc", + ".svc": "application/xml", + ".swf": "application/x-shockwave-flash", + ".t": "application/x-troff", + ".tar": "application/x-tar", + ".tcl": "application/x-tcl", + ".testrunconfig": "application/xml", + ".testsettings": "application/xml", + ".tex": "application/x-tex", + ".texi": "application/x-texinfo", + ".texinfo": "application/x-texinfo", + ".tgz": "application/x-compressed", + ".thmx": "application/vnd.ms-officetheme", + ".thn": "application/octet-stream", + ".tif": "image/tiff", + ".tiff": "image/tiff", + ".tlh": "text/plain", + ".tli": "text/plain", + ".toc": "application/octet-stream", + ".tr": "application/x-troff", + ".trm": "application/x-msterminal", + ".trx": "application/xml", + ".ts": "video/vnd.dlna.mpeg-tts", + ".tsv": "text/tab-separated-values", + ".ttf": "application/octet-stream", + ".tts": "video/vnd.dlna.mpeg-tts", + ".txt": "text/plain", + ".u32": "application/octet-stream", + ".uls": "text/iuls", + ".user": "text/plain", + ".ustar": "application/x-ustar", + ".vb": "text/plain", + ".vbdproj": "text/plain", + ".vbk": "video/mpeg", + ".vbproj": "text/plain", + ".vbs": "text/vbscript", + ".vcf": "text/x-vcard", + ".vcproj": "Application/xml", + ".vcs": "text/plain", + ".vcxproj": "Application/xml", + ".vddproj": "text/plain", + ".vdp": "text/plain", + ".vdproj": "text/plain", + ".vdx": "application/vnd.ms-visio.viewer", + ".vml": "text/xml", + ".vscontent": "application/xml", + ".vsct": "text/xml", + ".vsd": "application/vnd.visio", + ".vsi": "application/ms-vsi", + ".vsix": "application/vsix", + ".vsixlangpack": "text/xml", + ".vsixmanifest": "text/xml", + ".vsmdi": "application/xml", + ".vspscc": "text/plain", + ".vss": "application/vnd.visio", + ".vsscc": "text/plain", + ".vssettings": "text/xml", + ".vssscc": "text/plain", + ".vst": "application/vnd.visio", + ".vstemplate": "text/xml", + ".vsto": "application/x-ms-vsto", + ".vsw": "application/vnd.visio", + ".vsx": "application/vnd.visio", + ".vtx": "application/vnd.visio", + ".wav": "audio/wav", + ".wave": "audio/wav", + ".wax": "audio/x-ms-wax", + ".wbk": "application/msword", + ".wbmp": "image/vnd.wap.wbmp", + ".wcm": "application/vnd.ms-works", + ".wdb": "application/vnd.ms-works", + ".wdp": "image/vnd.ms-photo", + ".webarchive": "application/x-safari-webarchive", + ".webtest": "application/xml", + ".wiq": "application/xml", + ".wiz": "application/msword", + ".wks": "application/vnd.ms-works", + ".WLMP": "application/wlmoviemaker", + ".wlpginstall": "application/x-wlpg-detect", + ".wlpginstall3": "application/x-wlpg3-detect", + ".wm": "video/x-ms-wm", + ".wma": "audio/x-ms-wma", + ".wmd": "application/x-ms-wmd", + ".wmf": "application/x-msmetafile", + ".wml": "text/vnd.wap.wml", + ".wmlc": "application/vnd.wap.wmlc", + ".wmls": "text/vnd.wap.wmlscript", + ".wmlsc": "application/vnd.wap.wmlscriptc", + ".wmp": "video/x-ms-wmp", + ".wmv": "video/x-ms-wmv", + ".wmx": "video/x-ms-wmx", + ".wmz": "application/x-ms-wmz", + ".wpl": "application/vnd.ms-wpl", + ".wps": "application/vnd.ms-works", + ".wri": "application/x-mswrite", + ".wrl": "x-world/x-vrml", + ".wrz": "x-world/x-vrml", + ".wsc": "text/scriptlet", + ".wsdl": "text/xml", + ".wvx": "video/x-ms-wvx", + ".x": "application/directx", + ".xaf": "x-world/x-vrml", + ".xaml": "application/xaml+xml", + ".xap": "application/x-silverlight-app", + ".xbap": "application/x-ms-xbap", + ".xbm": "image/x-xbitmap", + ".xdr": "text/plain", + ".xht": "application/xhtml+xml", + ".xhtml": "application/xhtml+xml", + ".xla": "application/vnd.ms-excel", + ".xlam": "application/vnd.ms-excel.addin.macroEnabled.12", + ".xlc": "application/vnd.ms-excel", + ".xld": "application/vnd.ms-excel", + ".xlk": "application/vnd.ms-excel", + ".xll": "application/vnd.ms-excel", + ".xlm": "application/vnd.ms-excel", + ".xls": "application/vnd.ms-excel", + ".xlsb": "application/vnd.ms-excel.sheet.binary.macroEnabled.12", + ".xlsm": "application/vnd.ms-excel.sheet.macroEnabled.12", + ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ".xlt": "application/vnd.ms-excel", + ".xltm": "application/vnd.ms-excel.template.macroEnabled.12", + ".xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template", + ".xlw": "application/vnd.ms-excel", + ".xml": "text/xml", + ".xmta": "application/xml", + ".xof": "x-world/x-vrml", + ".XOML": "text/plain", + ".xpm": "image/x-xpixmap", + ".xps": "application/vnd.ms-xpsdocument", + ".xrm-ms": "text/xml", + ".xsc": "application/xml", + ".xsd": "text/xml", + ".xsf": "text/xml", + ".xsl": "text/xml", + ".xslt": "text/xml", + ".xsn": "application/octet-stream", + ".xss": "application/xml", + ".xtp": "application/octet-stream", + ".xwd": "image/x-xwindowdump", + ".z": "application/x-compress", + ".zip": "application/x-zip-compressed" + } + } \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/PreJobExecutionAzureFileCopy.ts b/_generated/AzureFileCopyV5/PreJobExecutionAzureFileCopy.ts new file mode 100644 index 000000000000..f0bacc48a816 --- /dev/null +++ b/_generated/AzureFileCopyV5/PreJobExecutionAzureFileCopy.ts @@ -0,0 +1,54 @@ +import tl = require('azure-pipelines-task-lib/task'); +import path = require('path'); +import fs = require('fs') +import armStorage = require('azure-pipelines-tasks-azure-arm-rest/azure-arm-storage'); +import msRestAzure = require('azure-pipelines-tasks-azure-arm-rest/azure-arm-common'); +import { AzureRMEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; +import { AzureEndpoint, StorageAccount } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; + +function isNonEmpty(str: string): boolean { + return (!!str && !!str.trim()); +} + +function getResourceGroupNameFromUri(resourceUri: string): string { + if (isNonEmpty(resourceUri)) { + resourceUri = resourceUri.toLowerCase(); + return resourceUri.substring(resourceUri.indexOf("resourcegroups/") + "resourcegroups/".length, resourceUri.indexOf("/providers")); + } + + return ""; +} + +async function run(): Promise { + let tempDirectory: string = tl.getVariable('Agent.TempDirectory'); + let fileName: string = Math.random().toString(36).replace('0.', ''); + let file: string = path.resolve(tempDirectory, fileName); + try { + const taskManifestPath = path.join(__dirname, "task.json"); + tl.debug("Setting resource path to " + taskManifestPath); + tl.setResourcePath(taskManifestPath); + let connectionType = tl.getInput('ConnectedServiceNameSelector', false); + if(connectionType === 'ConnectedServiceNameARM') { + let connectedServiceName = tl.getInput('ConnectedServiceNameARM', true); + let storageAccountName = tl.getInput('StorageAccountRM', true); + var azureEndpoint: AzureEndpoint = await new AzureRMEndpoint(connectedServiceName).getEndpoint(); + const storageArmClient = new armStorage.StorageManagementClient(azureEndpoint.applicationTokenCredentials, azureEndpoint.subscriptionID); + let storageAccount: StorageAccount = await storageArmClient.storageAccounts.get(storageAccountName); + let storageAccountResourceGroupName = getResourceGroupNameFromUri(storageAccount.id); + let accessKeys = await storageArmClient.storageAccounts.listKeys(storageAccountResourceGroupName, storageAccountName, null); + let accessKey: string = accessKeys[0]; + let data: string = `/DestKey:\"${accessKey}\"`; + let options = { encoding : "utf8" } + fs.writeFileSync(file, data, options); + tl.setTaskVariable('AFC_V2_ARM_STORAGE_KEY_FILE', file); + tl.debug("Response file created"); + } + } catch(error) { + if (fs.existsSync(file)) { + fs.unlinkSync(file); + } + console.log(tl.loc("AFC_PreexecutionJob_UnableToGetStorageKey", error)); + } +} + +run() \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/README.md b/_generated/AzureFileCopyV5/README.md new file mode 100644 index 000000000000..d563b42b68d9 --- /dev/null +++ b/_generated/AzureFileCopyV5/README.md @@ -0,0 +1,116 @@ +# Azure File Copy + +### Overview + +The task is used to copy application files and other artifacts that are required to install the application on Azure VMs like PowerShell scripts, PowerShell-DSC modules etc. The task provides the ability to copy files to an Azure blob or directly to Azure VMs. Even when the target is Azure VMs, Azure blobs are used as an intermediary and the files are copied to it first and then downloaded to the VMs. The tasks uses [AzCopy](https://azure.microsoft.com/en-in/documentation/articles/storage-use-azcopy/), the command-line utility built for fast copying of data from and into Azure storage accounts. + +### Contact Information + +Please report a problem at [Developer Community Forum](https://developercommunity.visualstudio.com/spaces/21/index.html) if you are facing problems in making this task work. You can also share feedback about the task like, what more functionality should be added to the task, what other tasks you would like to have, at the same place. + +### Prerequisite for the task + +**Azure Subscription** + +To deploy to Azure, an Azure subscription has to be linked to Team Foundation Server or to Azure Pipelines using the Services tab in the Account Administration section. Add the Azure subscription to use in the Build or Release Management definition by opening the Account Administration screen (gear icon on the top-right of the screen) and then click on the Services Tab. + + - Use 'Azure Resource Manager' endpoint type to create a ARM endpoint, for more details follow the steps listed in the link [here](https://go.microsoft.com/fwlink/?LinkID=623000&clcid=0x409). + - As this version of task uses AzCopy 10, service principal needs to have one of these `Storage Blob Data Contributor` or `Storage Blob Data Owner` roles assigned to access resources. + 1. Click on `Manage` link next to Azure Subscription + 2. Click `Manage Service Principal` which will redirect you to the Application Registration of the Service Principal. Copy the name. + 3. Go back and click `Manage service connection roles` which will redirect you to the IAM blade of the Azure Subscription. Here you need to assign a role to the service principal. Use name copied in previous step to search service principal + +**PowerShell** + +The task needs at least version 3.0 of Powershell on the target machine. + +**Azure PowerShell** + +The task needs Az modules to be installed on the automation agent, and that can be done easily using https://docs.microsoft.com/en-us/powershell/azure/install-az-ps?view=azps-7.0.0. + +**Azure Virtual Machines** + +The task can copy files to the Azure Virtual Machines that are created either using the [new azure portal](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-tutorial/). For copying the files to VMs, they are first copied to an automatically generated container in the Azure storage account, and then from there to the VMs. The container is deleted after the files are copied successfully to the VMs. + +To dynamically deploy Azure resource groups with virtual machines in them use the [Azure Resource Group Deployment](https://github.com/Microsoft/vsts-tasks/tree/master/Tasks/DeployAzureResourceGroup) task. The task has a sample template that can setup the WinRM HTTPS protocol on the virtual machines, open the 5986 port in the Firewall, and install the test certificate. After this the virtual machines are ready for use in the deployment task. + +If the VMs have been created without opening the WinRM HTTPS ports then follow the steps below to setup the machine for WinRM HTTPS: + +- In the target machine, the WinRM HTTPS port (default 5986) should be open in the Firewall. Disable [UAC remote restrictions](https://support.microsoft.com/en-us/kb/951016) and the credentials should be in the format of username like vmuser, where vmuser is the admin user of the VM. +- The trusted certificate should be installed in the Automation agent, and if the trusted certificate is not installed in the Automation agent, then ensure that the Test Certificate option is selected in the task for the application deployment to work. +- For more guidance refer this [blog](https://blogs.msdn.com/b/muthus_blog/archive/2015/11/04/pre-requisites-for-using-azure-vms-in-winrm-based-tasks-in-build-and-rm-workflows.aspx). + +### Parameters of the task: + +The parameters of the task are described in details, including examples, to show how to input the parameters. The parameters listed with a * are required parameters for the task: + +* **Azure Subscription**: The name of Azure subscription, where the Azure storage account is located. The storage account is accessed using the stored credentials of the Azure account in the Services tab. + +* **Source**: The source of the files. As described above using pre-defined system variables like $(Build.Repository.LocalPath) make it easy to specify the location of the build on the Build Automation Agent machine. The variables resolve to the working folder on the agent machine, when the task is run on it. Note that wild cards like *\.zip are not supported. + +* **Storage Account**: The name of an existing storage account in the Azure Subscription specified earlier. + +* **Destination**: The target for copying the files and is either an Azure blob or VMs. The section below details the parameters that need to be filled-out if the target is Azure VMs. + + * **Resource Group**: Name of the resource group that contains the Azure VMs. + + * **Select Machines By**: The parameter is used to copy the files to a subset of VMs and the subset can be specified by the host name of the VMs or the tags on them. [Tags](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) are supported for resources created via the Azure Resource Manager only. + + * **Filter Criteria**: If you are copying to a subset of VMs using machine names filter, you can provide a comma separated list of the VM host names for example, ffweb, ffdb1, ffdb2. If you are using tags then you can specify tags in the format “:, :” for example, role:web, db; OS:win7. The default behavior is to copy to all the VMs in the Resource Group. Note the delimiters used for tags are ,(comma), :(colon) and ;(semicolon). + + * **Admin Login**: Administrator Username for all the Azure VMs in the Resource Group. + + * **Password**: Administrator Username password for all the Azure VMs in the Resource Group. + + * **Destination Folder**: The folder in the Azure VMs where the files will be copied to. Environment variables are also supported like $env:windir, $env:systemroot etc. An example of the destination folder is $env:windir\FabrikamFibre\Web or c:\FabrikamFibre. + + * **Enable Copy Prerequisites**: Enabling this option configures Windows Remote Management (WinRM) listener over HTTPS protocol on port 5986, using a self-signed certificate. This configuration is required for performing copy operation on Azure machines. If the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). If the target Virtual Machines are associated with a Network security group (NSG), configure Inbound security rules for Destination port (5986). Applicable only for ARM VMs. + + * **Copy in Parallel**: Selecting this option will copy files to all the VMs in the Resource Group in-parallel, hence speeding up the process of copying. + + * **Clean Target**: Selecting this option will clean the destination folder prior to copying the files to it. When destination type is AzureBlob, it will delete all the folders/files in that container and If blob prefix is provided then it will delete all the folders/files in that blob prefix. + + * **Test Certificate**: This setting is required while copying the files from the blob containers to the Azure VMs. The copy operation is initiated over the WinRM HTTPS protocol and if the VM has a test certificate installed on it, then select this option to to skip the validation that the server certificate is signed by a trusted certificate authority (CA). + +* **Destination**: If the target is Azure blob then the following parameters need to be filled out. + + * **Container Name**: The name of the container where the files will be copied to. If the container does not exist then a new one will be created with the name provided in this parameter. + + * **Blob Prefix**: A prefix for the Blobs that can be used to filter the blobs like appending the Build number to the blobs, so that all the blobs with the same build number can be downloaded from the Container. + +* **Additional Arguments**: Additional [AzCopy.exe](https://azure.microsoft.com/en-us/documentation/articles/storage-use-azcopy/) arguments that will be applied for uploading to blob and same will be applied for downloading while copy to VM. + * **Blob Destination**: Supported additional arguments for copy to blob are listed in https://docs.microsoft.com/en-us/azure/storage/common/storage-ref-azcopy-copy?toc=/azure/storage/blobs/toc.json. + + * **VM Destination**: Supported additional arguments for copy to blob are listed in https://docs.microsoft.com/en-us/azure/storage/common/storage-ref-azcopy-copy?toc=/azure/storage/blobs/toc.json. + +### Output Variables + +The task creates the following as output variables: +* **StorageContainerUri**: When copying files to an Azure container, this parameter returns the Uri of the container were the files were copied to. +* **StorageContainerSasToken**: When copying files to an Azure container, a SasToken is created and returned. By default, this token expires after 4 hours. + +Following the [output variables](https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#use-output-variables-from-tasks) documentation and naming the step, we can then reference the variables like so: + +```yaml +- task: AzureFileCopy@5 + inputs: + SourcePath: 'Readme.md' + azureSubscription: 'Azure' + Destination: 'AzureBlob' + storage: 'storageAccount' + ContainerName: 'containerName' + BlobPrefix: '' + name: AzureFileCopy + +- script: | + echo $(AzureFileCopy.StorageContainerUri) + echo $(AzureFileCopy.StorageContainerSasToken) +``` + +### Known Limitations : + +* If resource group contains both [resource manager](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-tutorial/) and [classic](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-tutorial-classic-portal/) VMs, then copy operation will be performed only on resource manager VMs. + +### Earlier Versions + +If you want to work with earlier version of this task, please refer README.md present at https://github.com/microsoft/azure-pipelines-tasks/tree/releases/m195/Tasks/AzureFileCopyV4/ . diff --git a/_generated/AzureFileCopyV5/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzureFileCopyV5/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..28987d5df569 --- /dev/null +++ b/_generated/AzureFileCopyV5/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,94 @@ +{ + "loc.friendlyName": "Azure-Dateikopiervorgang", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Hiermit werden Dateien in Azure Blob Storage oder auf virtuelle Computer kopiert.", + "loc.instanceNameFormat": "$(Destination)-Dateikopiervorgang", + "loc.releaseNotes": "Neuerungen in Version 5.0:
   Unterstützung von AzCopy.exe-Version 10.12.2", + "loc.input.label.SourcePath": "Quelle", + "loc.input.help.SourcePath": "Der absolute Pfad des Quellordners oder der Datei auf dem lokalen Computer oder eine UNC-Freigabe. Der Ausdruck muss einen einzelnen Ordner oder eine Datei zurückgeben. Das Platzhaltersymbol (*) wird an beliebiger Stelle im Dateipfad oder im Dateinamen unterstützt.", + "loc.input.label.ConnectedServiceNameARM": "Azure-Abonnement", + "loc.input.help.ConnectedServiceNameARM": "Azure Resource Manager-Abonnement, das als Ziel für den Kopiervorgang von Dateien dient.", + "loc.input.label.Destination": "Zieltyp", + "loc.input.help.Destination": "Wählen Sie als Ziel entweder Azure-Blob oder Azure-VMs aus.", + "loc.input.label.StorageAccountRM": "RM-Speicherkonto", + "loc.input.help.StorageAccountRM": "Geben Sie ein bereits vorhandenes ARM-Speicherkonto an. Es wird auch als Zwischenspeicher zum Kopieren von Dateien in virtuelle Azure-Maschinen verwendet.", + "loc.input.label.ContainerName": "Containername", + "loc.input.help.ContainerName": "Der Name des Containers zum Hochladen der Dateien. Wenn im angegebenen Speicherkonto kein Container mit dem angegebenen Namen vorhanden ist, wird er automatisch erstellt.
Wenn Sie ein virtuelles Verzeichnis innerhalb des Containers erstellen möchten, verwenden Sie die unten aufgeführte Blobpräfixeingabe.
Beispiel: Wenn der Zielort https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/ lautet, geben Sie mycontainer als Containername und vd1/vd2 als Blobpräfix an.", + "loc.input.label.BlobPrefix": "Blobpräfix", + "loc.input.help.BlobPrefix": "Nützlich zum Filtern von Dateien, z. B. das Anfügen der Buildnummer an alle Blobs, um nur Dateien aus diesem Build herunterzuladen. Beispiel: Wenn Sie das Blobpräfix als myvd1/ angeben, wird innerhalb des Containers ein virtuelles Verzeichnis mit diesem Namen erstellt. Das Blobpräfix mit dem nachstehenden \"/\" wird als virtuelles Verzeichnis betrachtet. Andernfalls wird es als Datei behandelt, es sei denn, das Element, das kopiert wird, ist selbst ein Ordner. Die Quelldateien werden in https://myaccount.blob.core.windows.net/mycontainer/myvd1/ kopiert.", + "loc.input.label.EnvironmentNameRM": "Ressourcengruppe", + "loc.input.help.EnvironmentNameRM": "Der Name der Zielressourcengruppe, in die Dateien kopiert werden sollen.", + "loc.input.label.ResourceFilteringMethod": "Computer auswählen nach", + "loc.input.help.ResourceFilteringMethod": "Wählen Sie optional eine Teilmenge der virtuellen Maschinen in der Ressourcengruppe durch Angeben des Hostnamens oder der Tags der virtuellen Maschinen aus. [Tags](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) werden nur für Ressourcen unterstützt, die über den Azure Resource Manager erstellt werden.", + "loc.input.label.MachineNames": "Filterkriterien", + "loc.input.help.MachineNames": "Stellen Sie eine Liste der VM-Hostnamen (z. B. \"ffweb\", \"ffdb\") oder Tags (z. B. \"Role:DB\", \"Web; OS:Win8.1\" bereit. Beachten Sie, dass die für Tags verwendeten Trennzeichen \",\" (Komma), \":\" (Doppelpunkt) und \";\" (Semikolon) sind. Wenn mehrere Tags angegeben werden, wird der Task auf allen virtuellen Maschinen mit den angegebenen Tags ausgeführt. Standardmäßig wird der Task auf allen virtuellen Maschinen ausgeführt.", + "loc.input.label.vmsAdminUserName": "Administratoranmeldung", + "loc.input.help.vmsAdminUserName": "Der Benutzername des Administrators der virtuellen Maschinen.", + "loc.input.label.vmsAdminPassword": "Kennwort", + "loc.input.help.vmsAdminPassword": "Das Administratorkennwort der VMs.
Die in den Build- oder Releasepipelines als \"$(passwordVariable)\" festgelegten Variablen werden akzeptiert.
Sie können die Variable als \"secret\" markieren, um sie abzusichern.", + "loc.input.label.TargetPath": "Zielordner", + "loc.input.help.TargetPath": "Lokaler Pfad auf den Zielcomputern zum Kopieren der Dateien aus der Quelle. Die Umgebungsvariable kann wie folgt verwendet werden: $env:windir\\BudgetIT\\Web.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "Optionale Argumente (für das Hochladen von Dateien in das Blob)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Optionale AzCopy.exe-Argumente, die beim Hochladen in ein Blob angewendet werden, z. B. --check-length=true. Werden hier keine optionalen Argumente angegeben, werden standardmäßig die folgenden optionalen Argumente hinzugefügt.
--log-level=INFO (verwenden Sie bei Ausführung der Pipeline im Debugmodus \"--log-level=DEBUG\"),
--recursive (nur, wenn der Containername nicht \"$root\" lautet),
--blob-type=PageBlob (nur, wenn das angegebene Speicherkonto ein Premium-Konto ist)", + "loc.input.label.AdditionalArgumentsForVMCopy": "Optionale Argumente (für das Herunterladen von Dateien auf die VM)", + "loc.input.help.AdditionalArgumentsForVMCopy": "Optionale AzCopy.exe-Argumente, die beim Herunterladen auf eine VM angewendet werden, z. B. --check-length=true. Werden hier keine optionalen Argumente angegeben, werden standardmäßig die folgenden optionalen Argumente hinzugefügt.
--log-level=INFO (verwenden Sie bei Ausführung der Pipeline im Debugmodus \"--log-level=DEBUG\"),
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "Gültigkeitsdauer des SAS-Tokens in Minuten", + "loc.input.help.sasTokenTimeOutInMinutes": "Geben Sie die Zeit in Minuten an, nach der das SAS-Token für den Container abläuft. Dieses Token läuft standardmäßig nach 4 Stunden ab.", + "loc.input.label.enableCopyPrerequisites": "Kopiervoraussetzungen aktivieren", + "loc.input.help.enableCopyPrerequisites": "Durch das Aktivieren dieser Option wird der Listener der Windows-Remoteverwaltung (Windows Remote Management, WinRM) über das HTTPS-Protokoll an Port 5986 mithilfe eines selbstsignierten Zertifikats konfiguriert. Diese Konfiguration ist zum Ausführen des Kopiervorgangs auf Azure-Computern erforderlich. Wenn die virtuellen Zielcomputer durch Lastenausgleich gesichert werden, stellen Sie sicher, dass die Regeln für eingehenden NAT-Datenverkehr für den Zielport (5986) konfiguriert sind. Gilt nur für virtuelle ARM-Computer.", + "loc.input.label.CopyFilesInParallel": "Parallel kopieren", + "loc.input.help.CopyFilesInParallel": "Wenn diese Option auf \"True\" festgelegt ist, werden Dateien parallel auf die Zielcomputer kopiert.", + "loc.input.label.CleanTargetBeforeCopy": "Ziel bereinigen", + "loc.input.help.CleanTargetBeforeCopy": "Wenn diese Option auf \"True\" festgelegt ist, wird der Zielordner vor dem Kopieren der Dateien bereinigt.", + "loc.input.label.skipCACheck": "Testzertifikat", + "loc.input.help.skipCACheck": "Wenn diese Option ausgewählt wird, überspringt der Client die Überprüfung, ob das Serverzertifikat von einer vertrauenswürdigen Zertifizierungsstelle (CA) signiert wurde, wenn eine Verbindung über HTTPS (Hypertext Transfer Protocol über Secure Socket Layer) hergestellt wird.", + "loc.messages.AFC_StorageAccountNotFound": "Das Speicherkonto \"{0}\" wurde nicht gefunden. Die ausgewählte Dienstverbindung \"Dienstprinzipal\" unterstützt nur Speicherkonten des Azure Resource Manager-Typs.", + "loc.messages.AFC_ResourceGroupNotFound": "Die angegebene Ressourcengruppe \"{0}\" ist nicht vorhanden.", + "loc.messages.AFC_GetVMStatus": "[Azure-Aufruf]Der Status für den virtuellen Computer \"{0}\" wird abgerufen.", + "loc.messages.AFC_GetVMStatusComplete": "[Azure-Aufruf]Der Status für den virtuellen Computer \"{0}\" wurde abgerufen.", + "loc.messages.AFC_GetCustomScriptExtension": "[Azure-Aufruf]Die benutzerdefinierte Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\" wird abgerufen.", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Azure-Aufruf]Die benutzerdefinierte Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\" wurde abgerufen.", + "loc.messages.AFC_SetCustomScriptExtension": "[Azure-Aufruf]Die benutzerdefinierte Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\" wird festgelegt.", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Azure-Aufruf]Die benutzerdefinierte Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\" wird festgelegt.", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Azure-Aufruf]Die benutzerdefinierte Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\" wird entfernt.", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Azure-Aufruf]Die benutzerdefinierte Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\" wurde entfernt.", + "loc.messages.AFC_NoNetworkInterface": "[Azure-Aufruf]Es wurde keine Netzwerkschnittstelle mit der ID \"{0}\" des virtuellen Computers unter der Ressourcengruppe \"{1}\" gefunden.", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Azure-Aufruf]Der Name der Ressourcengruppe und die ID des virtuellen Computers dürfen nicht NULL oder leer sein.", + "loc.messages.AFC_AzurePSNotInstalled": "Die erforderliche Mindestversion {0} der Azure PowerShell-Cmdlets ist nicht installiert. Sie können die Anweisungen unter https://azure.microsoft.com/en-in/documentation/articles/powershell-install-configure/ befolgen, um das aktuellste Azure PowerShell-Modul abzurufen.", + "loc.messages.AFC_ClassicStorageAccountNotFound": "Das Speicherkonto \"{0}\" wurde nicht gefunden. Die ausgewählte Dienstverbindung \"Zertifikat\" unterstützt nur Speicherkonten des Typs \"Azure klassisch\".", + "loc.messages.AFC_GenericStorageAccountNotFound": "Das Speicherkonto \"{0}\" wurde nicht gefunden. Bitte geben Sie ein vorhandenes Speicherkonto an.", + "loc.messages.AFC_AzureFileCopyMoreHelp": "Weitere Informationen finden Sie unter {0}.", + "loc.messages.AFC_UploadFilesStorageAccount": "Dateien werden aus dem Quellpfad \"{0}\" in das Speicherkonto \"{1}\" im Container \"{2}\" mit dem Blobpräfix \"{3}\" hochgeladen.", + "loc.messages.AFC_UploadContainerStorageAccount": "Fehler beim Hochladen in den Container \"{0}\" im Speicherkonto \"{1}\" mit dem Blobpräfix \"{2}\": \"{3}\"", + "loc.messages.AFC_UploadFileSuccessful": "Dateien wurden aus dem Quellpfad \"{0}\" in das Speicherkonto \"{1}\" im Container \"{2}\" mit dem Blobpräfix \"{3}\" erfolgreich hochgeladen.", + "loc.messages.AFC_IncorrectTags": "Tags wurden falsch angegeben. Sie müssen das folgende Format aufweisen: \"Role:Web,DB;Location:East US;Dept.:Finance,HR\".", + "loc.messages.AFC_MachineDoesNotExist": "Die folgenden Computer sind in der Ressourcengruppe nicht vorhanden, oder ihre Namen wurde nicht richtig angegeben: {0}. Geben Sie die genauen Namen der Computer an, die in der Ressourcengruppe vorhanden sind. Verwenden Sie Kommas, um mehrere Computernamen zu trennen.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "\"{0}\" für alle Ressourcen in der folgenden ResourceGroup können nicht abgerufen werden: \"{1}\"", + "loc.messages.AFC_MachineNameFromIdError": "\"{0}\" für \"{1}\"-Ressourcen in der folgenden ResourceGroup können nicht abgerufen werden: \"{2}\"", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "Die Ressource \"{1}\" kann mithilfe der ausgewählten Dienstverbindung \"{0}\" nicht gefunden werden. Die ausgewählte Dienstverbindung \"{0}\" unterstützt nur klassische Ressourcen (Dienstverwaltungsmodell).", + "loc.messages.AFC_NoClassicVMResources": "Unter der Ressourcengruppe \"{0}\" ist kein Computer zum Kopieren vorhanden. Die ausgewählte Dienstverbindung \"{1}\" unterstützt nur virtuelle Computer des Typs \"Azure klassisch\".", + "loc.messages.AFC_NoARMVMResources": "Unter der Ressourcengruppe \"{0}\" ist kein Computer zum Kopieren vorhanden. Die ausgewählte Dienstverbindung \"{1}\" unterstützt nur virtuelle Computer des Typs \"Azure Resource Manager\".", + "loc.messages.AFC_NoGenericVMResources": "Unter der Ressourcengruppe \"{0}\" ist kein Computer zum Kopieren vorhanden.", + "loc.messages.AFC_FilteringNoVMResources": "Unter der Ressourcengruppe ist kein Computer vorhanden: \"{0}\" mit den folgenden {1} \"{2}\".", + "loc.messages.AFC_CopyStarted": "Der Kopiervorgang wurde für den Computer gestartet: \"{0}\"", + "loc.messages.AFC_CopyCompleted": "Kopierstatus für den Computer \"{0}\": \"{1}\"", + "loc.messages.AFC_WinRMHelpMessage": "Wählen Sie zum Beheben von Problemen, die sich auf die WinRM-Dienstverbindung beziehen, die Option \"Kopiervoraussetzungen aktivieren\" in der Aufgabe aus. Wenn diese Einstellung bereits festgelegt ist und die virtuellen Zielcomputer durch einen Lastenausgleich gesichert sind, stellen Sie sicher, dass die Regeln für eingehenden NAT-Datenverkehr für den Zielport (5986) konfiguriert sind. Gilt nur für virtuelle ARM-Computer.", + "loc.messages.AFC_CopyFailed": "Fehler beim Kopieren auf dem Computer \"{0}\". Weitere Informationen finden Sie in den Protokollen.", + "loc.messages.AFC_ParallelCopyFailed": "Fehler beim Kopieren auf mindestens einen Computer. Weitere Informationen finden Sie in den Protokollen.", + "loc.messages.AFC_CopySuccessful": "Dateien wurden erfolgreich aus dem Quellpfad \"{0}\" auf virtuelle Azure-Zielcomputer in der Ressourcengruppe \"{1}\" kopiert.", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "Fehler beim Festlegen der benutzerdefinierten Skripterweiterung \"{0}\" für den virtuellen Computer \"{1}\": {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "Fehler beim Hinzufügen der Netzwerksicherheitsregel: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "Die benutzerdefinierte Skripterweiterung \"{0}\" kann nicht für den virtuellen Computer \"{1}\" festgelegt werden: {2}", + "loc.messages.AFC_CopyPrereqsFailed": "Fehler beim Aktivieren der Kopiervoraussetzungen. {0}", + "loc.messages.AFC_BlobStorageNotFound": "Das Speicherkonto \"{0}\" wurde nicht gefunden. Bitte geben Sie ein vorhandenes Speicherkonto an.", + "loc.messages.AFC_RootContainerAndDirectory": "Die Option \"/S\" gilt nicht für \"$root\"-Container.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "Der HTTP-Antwortcode \"{0}\" ist kein gültiger Umleitungsstatuscode.", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "Der Adressheader der Umleitungsantwort ist NULL.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "\"AzCopy.exe\" wurde mit einem Exitcode ungleich null beendet, während Dateien in den Blobspeicher hochgeladen wurden.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "Der Speicherkontoschlüssel konnte nicht abgerufen werden. Fehler: {0}", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "Deinstallieren Sie das benutzerdefinierte WinRM-Skript manuell, und wiederholen Sie die Bereitstellung.", + "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", + "loc.messages.UnsupportedAuthScheme": "Nicht unterstütztes Authentifizierungsschema \"{0}\" für Endpunkt.", + "loc.messages.ServicePrincipalError": "Fehler im für die Bereitstellung verwendeten Dienstprinzipal.", + "loc.messages.AzModuleNotFound": "Die Module \"Az.Accounts\" wurden nicht gefunden. Wenn das Modul vor kurzem installiert wurde, wiederholen Sie den Vorgang nach einem Neustart des Azure Pipelines-Task-Agents." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzureFileCopyV5/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..ad1d27e9e142 --- /dev/null +++ b/_generated/AzureFileCopyV5/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,94 @@ +{ + "loc.friendlyName": "Azure file copy", + "loc.helpMarkDown": "[Learn more about this task](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Copy files to Azure Blob Storage or virtual machines", + "loc.instanceNameFormat": "$(Destination) File Copy", + "loc.releaseNotes": "What's new in Version 5.0:
   Support AzCopy.exe version 10.12.2", + "loc.input.label.SourcePath": "Source", + "loc.input.help.SourcePath": "Absolute path of the source folder, or file on the local machine, or a UNC share. Expression should return a single folder or a file. Wild card symbol (*) is supported anywhere in the file path or file name.", + "loc.input.label.ConnectedServiceNameARM": "Azure Subscription", + "loc.input.help.ConnectedServiceNameARM": "Azure Resource Manager subscription to target for copying the files.", + "loc.input.label.Destination": "Destination Type", + "loc.input.help.Destination": "Select the destination, either Azure Blob or Azure VMs.", + "loc.input.label.StorageAccountRM": "RM Storage Account", + "loc.input.help.StorageAccountRM": "Specify a pre-existing ARM storage account. It is also used as an intermediary for copying files to Azure VMs", + "loc.input.label.ContainerName": "Container Name", + "loc.input.help.ContainerName": "Name of the Container for uploading the files. If a container with the given name does not exist in the specified storage account, it will automatically be created.
If you need to create a virtual directory inside the container, use the blob prefix input below.
Example: If your target location is https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/, then specify mycontainer as container name and vd1/vd2/ as blob prefix.", + "loc.input.label.BlobPrefix": "Blob Prefix", + "loc.input.help.BlobPrefix": "Useful for filtering files, for example, append build number to all the blobs to download files from that build only. Example: If you specify blob prefix as myvd1/, a virtual directory with this name will be created inside the container. Blob prefix with a trailing '/' will be considered a virtual directory. Otherwise, it will be treated as a file, unless the item being copied is itself a folder. The source files will be copied to https://myaccount.blob.core.windows.net/mycontainer/myvd1/.", + "loc.input.label.EnvironmentNameRM": "Resource Group", + "loc.input.help.EnvironmentNameRM": "Name of the target Resource Group for copying files to.", + "loc.input.label.ResourceFilteringMethod": "Select Machines By", + "loc.input.help.ResourceFilteringMethod": "Optionally, select a subset of VMs in resource group either by providing VMs host name or tags. [Tags](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) are supported for resources created via the Azure Resource Manager only.", + "loc.input.label.MachineNames": "Filter Criteria", + "loc.input.help.MachineNames": "Provide a list of VMs host name like ffweb, ffdb, or tags like Role:DB, Web; OS:Win8.1. Note the delimiters used for tags are ,(comma), :(colon) and ;(semicolon). If multiple tags are provided, then the task will run in all the VMs with the specified tags. The default is to run the task in all the VMs.", + "loc.input.label.vmsAdminUserName": "Admin Login", + "loc.input.help.vmsAdminUserName": "Administrator Username of the VMs.", + "loc.input.label.vmsAdminPassword": "Password", + "loc.input.help.vmsAdminPassword": "The administrator password of the VMs.
It can accept variable defined in build or release pipelines as '$(passwordVariable)'.
You may mark variable as 'secret' to secure it.", + "loc.input.label.TargetPath": "Destination Folder", + "loc.input.help.TargetPath": "Local path on the target machines for copying the files from the source. Environment variable can be used like $env:windir\\BudgetIT\\Web.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "Optional Arguments (for uploading files to blob)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Optional AzCopy.exe arguments that will be applied when uploading to blob like, --check-length=true. If no optional arguments are specified here, the following optional arguments will be added by default.
--log-level=INFO (if the pipeline is running in debug mode set --log-level=DEBUG),
--recursive (only if container name is not $root),
--blob-type=PageBlob (only if specified storage account is a premium account).", + "loc.input.label.AdditionalArgumentsForVMCopy": "Optional Arguments (for downloading files to VM)", + "loc.input.help.AdditionalArgumentsForVMCopy": "Optional AzCopy.exe arguments that will be applied when downloading to VM like, --check-length=true. If no optional arguments are specified here, the following optional arguments will be added by default.
--log-level=INFO (if the pipeline is running in debug mode set --log-level=DEBUG),
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "SAS Token Expiration Period In Minutes", + "loc.input.help.sasTokenTimeOutInMinutes": "Provide the time in minutes after which SAS token for the container will expire. By default, this token expires after 4 hours.", + "loc.input.label.enableCopyPrerequisites": "Enable Copy Prerequisites", + "loc.input.help.enableCopyPrerequisites": "Enabling this option configures Windows Remote Management (WinRM) listener over HTTPS protocol on port 5986, using a self-signed certificate. This configuration is required for performing copy operation on Azure machines. If the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). Applicable only for ARM VMs.", + "loc.input.label.CopyFilesInParallel": "Copy in Parallel", + "loc.input.help.CopyFilesInParallel": "Setting it to true will copy files in parallel to the target machines.", + "loc.input.label.CleanTargetBeforeCopy": "Clean Target", + "loc.input.help.CleanTargetBeforeCopy": "Setting it to true will clean-up the destination folder before copying the files.", + "loc.input.label.skipCACheck": "Test Certificate", + "loc.input.help.skipCACheck": "If this option is selected, client skips the validation that the server certificate is signed by a trusted certificate authority (CA) when connecting over Hypertext Transfer Protocol over Secure Socket Layer (HTTPS).", + "loc.messages.AFC_StorageAccountNotFound": "Storage account: {0} not found. The selected service connection 'Service Principal' supports storage accounts of Azure Resource Manager type only.", + "loc.messages.AFC_ResourceGroupNotFound": "Provided resource group '{0}' does not exist.", + "loc.messages.AFC_GetVMStatus": "[Azure Call]Getting the status for vm '{0}'", + "loc.messages.AFC_GetVMStatusComplete": "[Azure Call]Got the status for vm '{0}'", + "loc.messages.AFC_GetCustomScriptExtension": "[Azure Call]Getting the custom script extension '{0}' for vm '{1}'", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Azure Call]Got the custom script extension '{0}' for vm '{1}'", + "loc.messages.AFC_SetCustomScriptExtension": "[Azure Call]Setting the custom script extension '{0}' for vm '{1}'", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Azure Call]Set the custom script extension '{0}' for vm '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Azure Call]Removing the custom script extension '{0}' for vm '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Azure Call]Removed the custom script extension '{0}' for vm '{1}'", + "loc.messages.AFC_NoNetworkInterface": "[Azure Call]No network interface found with virtual machine ID {0} under resource group {1}", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Azure Call]Resource group name and virtual machine ID should not be null or empty", + "loc.messages.AFC_AzurePSNotInstalled": "The required minimum version {0} of the Azure Powershell Cmdlets are not installed. You can follow the instructions at https://azure.microsoft.com/en-in/documentation/articles/powershell-install-configure/ to get the latest Azure powershell", + "loc.messages.AFC_ClassicStorageAccountNotFound": "Storage account: {0} not found. The selected service connection 'Certificate' supports storage accounts of Azure Classic type only.", + "loc.messages.AFC_GenericStorageAccountNotFound": "Storage account: {0} not found. Please specify existing storage account", + "loc.messages.AFC_AzureFileCopyMoreHelp": "For more info please refer to {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "Uploading files from source path: '{0}' to storage account: '{1}' in container: '{2}' with blob prefix: '{3}'", + "loc.messages.AFC_UploadContainerStorageAccount": "Upload to container: '{0}' in storage account: '{1}' with blob prefix: '{2}' failed with error: '{3}'", + "loc.messages.AFC_UploadFileSuccessful": "Uploaded files successfully from source path: '{0}' to storage account: '{1}' in container: '{2}' with blob prefix: '{3}'", + "loc.messages.AFC_IncorrectTags": "Tags have been incorrectly specified. They have to be in the format Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "The following machines either do not exist in the resource group or their names have not been specified correctly: {0}. Provide the exact same machine names present in the resource group. Use comma to separate multiple machine names.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "Unable to get {0} for all resources in ResourceGroup : '{1}'", + "loc.messages.AFC_MachineNameFromIdError": "Unable to get {0} for '{1}' resources in ResourceGroup : '{2}'", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "Unable to find the resource '{1}' using selected service connection '{0}'. Selected service connection '{0}' supports classic resources only (Service Management model).", + "loc.messages.AFC_NoClassicVMResources": "No machine exists under resource group: '{0}' for copy. Selected service connection '{1}' supports Virtual Machines of Azure Classic type only.", + "loc.messages.AFC_NoARMVMResources": "No machine exists under resource group: '{0}' for copy. Selected service connection '{1}' supports Virtual Machines of Azure Resource Manager type only.", + "loc.messages.AFC_NoGenericVMResources": "No machine exists under resource group: '{0}' for copy.", + "loc.messages.AFC_FilteringNoVMResources": "No machine exists under resource group: '{0}' with the following {1} '{2}'.", + "loc.messages.AFC_CopyStarted": "Copy started for machine: '{0}'", + "loc.messages.AFC_CopyCompleted": "Copy status for machine '{0}' : '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "To fix WinRM service connection related issues, select the 'Enable Copy Prerequisites' option in the task. If set already, and the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). Applicable only for ARM VMs.", + "loc.messages.AFC_CopyFailed": "Copy failed on machine '{0}'. Refer logs for more details.", + "loc.messages.AFC_ParallelCopyFailed": "Copy to one or more machines failed. Refer logs for more details.", + "loc.messages.AFC_CopySuccessful": "Copied files from source path: '{0}' to target azure VMs in resource group: '{1}' successfully", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "Setting the custom script extension '{0}' for virtual machine '{1}' failed with error : {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "Failed to add the network security rule: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "Unable to set the custom script extension '{0}' for virtual machine '{1}': {2}", + "loc.messages.AFC_CopyPrereqsFailed": "Failed to enable copy prerequisites. {0}", + "loc.messages.AFC_BlobStorageNotFound": "Storage account: {0} not found. Please specify existing storage account", + "loc.messages.AFC_RootContainerAndDirectory": "'/S' option is not valid for $root containers.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "The HTTP response code: '{0}' is not a valid redirect status code", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "Redirect response location header is null.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "AzCopy.exe exited with non-zero exit code while uploading files to blob storage.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "Unable to fetch storage account key. Error: '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "Uninstall WinRM custom script manually and retry deployment.", + "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "loc.messages.UnsupportedAuthScheme": "Unsupported authentication scheme '{0}' for endpoint.", + "loc.messages.ServicePrincipalError": "There was an error with the service principal used for the deployment.", + "loc.messages.AzModuleNotFound": "Could not find the modules: 'Az.Accounts'. If the module was recently installed, retry after restarting the Azure Pipelines task agent." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzureFileCopyV5/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..30ba52347712 --- /dev/null +++ b/_generated/AzureFileCopyV5/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,94 @@ +{ + "loc.friendlyName": "Copia de archivos de Azure", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Copiar archivos en Azure Blob Storage o en máquinas virtuales", + "loc.instanceNameFormat": "Copia de archivo $(Destination)", + "loc.releaseNotes": "Novedades de la versión 5.0:
   Compatibilidad con AzCopy.exe versión 10.12.2", + "loc.input.label.SourcePath": "Origen", + "loc.input.help.SourcePath": "Ruta de acceso absoluta de la carpeta de origen, archivo en la máquina local o recurso compartido UNC. La expresión debe devolver un único archivo o carpeta. El uso del símbolo de comodín (*) se admite en cualquier parte de la ruta de acceso del archivo o del nombre de este.", + "loc.input.label.ConnectedServiceNameARM": "Suscripción a Azure", + "loc.input.help.ConnectedServiceNameARM": "Suscripción de Azure Resource Manager de destino para la copia de los archivos.", + "loc.input.label.Destination": "Tipo de destino", + "loc.input.help.Destination": "Seleccione un destino, ya sea un blob de Azure o máquinas virtuales de Azure.", + "loc.input.label.StorageAccountRM": "Cuenta de almacenamiento del Administrador de recursos", + "loc.input.help.StorageAccountRM": "Especifique una cuenta de almacenamiento de ARM preexistente. Se utiliza también como agente intermedio para copiar archivos a máquinas virtuales de Azure.", + "loc.input.label.ContainerName": "Nombre del contenedor", + "loc.input.help.ContainerName": "Nombre del contenedor para cargar los archivos. Si no existe un contenedor con el nombre especificado en la cuenta de almacenamiento especificada, se creará automáticamente.
Si necesita crear un directorio virtual dentro del contenedor, use la entrada de prefijo de blob siguiente.
Ejemplo: Si la ubicación de destino es https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/, especifique mycontainer como nombre de contenedor y vd1/vd2/ como prefijo de blob.", + "loc.input.label.BlobPrefix": "Prefijo de blob", + "loc.input.help.BlobPrefix": "Es útil para filtrar archivos, por ejemplo, anexar el número de compilación a todos los blobs para descargar solo los archivos de esa compilación. Ejemplo: Si especifica el prefijo de blob como myvd1/, se creará un directorio virtual con este nombre dentro del contenedor. El prefijo de blob con un \"/\" final se considerará un directorio virtual. De lo contrario, se tratará como un archivo, a menos que el elemento que se copia sea en sí una carpeta. Los archivos de origen se copiarán en https://myaccount.blob.core.windows.net/mycontainer/myvd1/.", + "loc.input.label.EnvironmentNameRM": "Grupo de recursos", + "loc.input.help.EnvironmentNameRM": "Nombre del Grupo de recursos de destino en el que copiar los archivos.", + "loc.input.label.ResourceFilteringMethod": "Seleccionar máquinas por", + "loc.input.help.ResourceFilteringMethod": "También puede seleccionar un subconjunto de máquinas virtuales del grupo de recursos si proporciona las etiquetas o el nombre de host de las máquinas virtuales. Las [etiquetas](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) solo son compatibles con los recursos creados mediante Azure Resource Manager.", + "loc.input.label.MachineNames": "Criterios de filtro", + "loc.input.help.MachineNames": "Proporcione una lista de nombres de host de las máquinas virtuales, como ffweb o ffdb, o etiquetas, como Role:DB, Web; OS:Win8.1. Tenga en cuenta que los delimitadores usados para las etiquetas son ,(coma), :(dos puntos) y ;(punto y coma). Si se proporcionan varias etiquetas, la tarea se ejecutará en todas las máquinas virtuales que tengan las etiquetas especificadas. La opción predeterminada es ejecutar la tarea en todas las máquinas virtuales.", + "loc.input.label.vmsAdminUserName": "Inicio de sesión del administrador", + "loc.input.help.vmsAdminUserName": "Nombre de usuario del administrador de las máquinas virtuales.", + "loc.input.label.vmsAdminPassword": "Contraseña", + "loc.input.help.vmsAdminPassword": "La contraseña del administrador de las máquinas virtuales.
Puede aceptar una variable definida en las canalizaciones de compilación o versión como '$(passwordVariable)'.
Marque el tipo de variable como 'secret' para protegerlo.", + "loc.input.label.TargetPath": "Carpeta de destino", + "loc.input.help.TargetPath": "La ruta de acceso local de las máquinas de destino para copiar los archivos del origen. Puede usarse una variable de entorno, por ejemplo, $env:windir\\BudgetIT\\Web.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "Argumentos opcionales (para cargar archivos en el blob)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Argumentos opcionales de AzCopy.exe que se aplicarán al cargar en blob, como --check-length=true. Si no se especifican argumentos opcionales aquí, se agregarán los siguientes de forma predeterminada.
--log-level=INFO (si la canalización se ejecuta en modo de depuración, establezca --log-level=DEBUG);
--recursive (solo si el nombre del contenedor no es $root);
--blob-type=PageBlob (solo si la cuenta de almacenamiento especificada es una cuenta Premium)", + "loc.input.label.AdditionalArgumentsForVMCopy": "Argumentos opcionales (para descargar archivos en la máquina virtual)", + "loc.input.help.AdditionalArgumentsForVMCopy": "Argumentos opcionales de AzCopy.exe que se aplicarán al descargar en una instancia de VM, como --check-length=true. Si no se especifican argumentos opcionales aquí, se agregarán los siguientes de forma predeterminada.
--log-level=INFO (si la canalización se ejecuta en modo de depuración, establezca --log-level=DEBUG);
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "Período de expiración del token de SAS en minutos", + "loc.input.help.sasTokenTimeOutInMinutes": "Especifique el tiempo, en minutos, transcurrido el cual expirará el token de SAS del contenedor. De forma predeterminada, este token expira después de 4 horas.", + "loc.input.label.enableCopyPrerequisites": "Habilitar los requisitos previos de copia", + "loc.input.help.enableCopyPrerequisites": "Al habilitar esta opción, se configura el agente de escucha de Administración remota de Windows (WinRM) a través del protocolo HTTPS en el puerto 5986, mediante un certificado autofirmado. Esta configuración es necesaria para realizar operaciones de copia en máquinas de Azure. Si las máquinas virtuales de destino están respaldadas por un equilibrador de carga, asegúrese de que haya reglas NAT de entrada configuradas para el puerto de destino (5986). Solo se aplica a máquinas virtuales de ARM.", + "loc.input.label.CopyFilesInParallel": "Copiar en paralelo", + "loc.input.help.CopyFilesInParallel": "Si se establece en true, copiará los archivos en paralelo en las máquinas de destino.", + "loc.input.label.CleanTargetBeforeCopy": "Limpiar destino", + "loc.input.help.CleanTargetBeforeCopy": "Si se establece en true, limpiará la carpeta de destino antes de copiar los archivos.", + "loc.input.label.skipCACheck": "Certificado de prueba", + "loc.input.help.skipCACheck": "Si esta opción está seleccionada, el cliente omite la validación relativa a si el certificado del servidor está firmado por una entidad de certificación de confianza al conectar a través del Protocolo de transferencia de hipertexto con cifrado de Capa de sockets seguros (HTTPS).", + "loc.messages.AFC_StorageAccountNotFound": "No se encontró la cuenta de almacenamiento {0}. La conexión de servicio seleccionada 'Entidad de servicio' admite solo cuentas de almacenamiento del tipo Azure Resource Manager.", + "loc.messages.AFC_ResourceGroupNotFound": "El grupo de recursos proporcionado '{0}' no existe.", + "loc.messages.AFC_GetVMStatus": "[Llamada de Azure] Obteniendo el estado de la máquina virtual '{0}'", + "loc.messages.AFC_GetVMStatusComplete": "[Llamada de Azure] Se ha obtenido el estado de la máquina virtual '{0}'", + "loc.messages.AFC_GetCustomScriptExtension": "[Llamada de Azure] Obteniendo la extensión de script personalizado '{0}' para la máquina virtual '{1}'", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Llamada de Azure] Se ha obtenido la extensión de script personalizado '{0}' para la máquina virtual '{1}'", + "loc.messages.AFC_SetCustomScriptExtension": "[Llamada de Azure] Estableciendo la extensión de script personalizado '{0}' para la máquina virtual '{1}'", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Llamada de Azure] Establecer la extensión de script personalizado '{0}' para la máquina virtual '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Llamada de Azure] Quitando la extensión de script personalizado '{0}' para la máquina virtual '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Llamada de Azure]Se ha quitado la extensión de script personalizado '{0}' para la máquina virtual '{1}'", + "loc.messages.AFC_NoNetworkInterface": "[Llamada de Azure] No se encontró ninguna interfaz de red con el identificador de máquina virtual {0} en el grupo de recursos {1}", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Llamada de Azure] El nombre del grupo de recursos y el id. de máquina virtual no deben ser un valor nulo ni quedarse vacíos", + "loc.messages.AFC_AzurePSNotInstalled": "No está instalada la versión mínima requerida {0} de los cmdlets de Azure PowerShell. Puede seguir las instrucciones de https://azure.microsoft.com/en-in/documentation/articles/powershell-install-configure/ para obtener la versión más reciente de Azure PowerShell", + "loc.messages.AFC_ClassicStorageAccountNotFound": "No se encontró la cuenta de almacenamiento {0}. La conexión de servicio seleccionada 'Certificate' admite solo cuentas de almacenamiento del tipo Azure clásico.", + "loc.messages.AFC_GenericStorageAccountNotFound": "No se encontró la cuenta de almacenamiento: {0}. Especifique una cuenta de almacenamiento existente.", + "loc.messages.AFC_AzureFileCopyMoreHelp": "Para más información, consulte {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "Cargando archivos de la ruta de acceso de origen '{0}' en el contenedor '{1}' de la cuenta de almacenamiento '{2}' con el prefijo de blob '{3}'", + "loc.messages.AFC_UploadContainerStorageAccount": "No se pudo realizar la carga en el contenedor '{0}' de la cuenta de almacenamiento '{1}' con el prefijo de blob '{2}' debido al siguiente error: '{3}'", + "loc.messages.AFC_UploadFileSuccessful": "Los archivos se cargaron correctamente de la ruta de acceso de origen '{0}' a la cuenta de almacenamiento '{1}' en el contenedor '{2}' con el prefijo de blob '{3}'", + "loc.messages.AFC_IncorrectTags": "Las etiquetas se han especificado incorrectamente. Tienen que estar en el formato Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "Las siguientes máquinas no existen en el grupo de recursos o sus nombres no se han especificado correctamente: {0}. Especifique los nombres exactos de las máquinas tal como están en el grupo de recursos, separados por comas.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "No se pueden obtener {0} para todos los recursos de ResourceGroup: '{1}'", + "loc.messages.AFC_MachineNameFromIdError": "No se puede obtener {0} para '{1}' recursos en ResourceGroup: '{2}'", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "No se encuentra el recurso '{1}' mediante la conexión de servicio seleccionada '{0}'. La conexión de servicio seleccionada '{0}' solo admite recursos clásicos (modelo de administración de servicios).", + "loc.messages.AFC_NoClassicVMResources": "No hay ninguna máquina en el grupo de recursos '{0}' para copiar. La conexión de servicio '{1}' seleccionada admite solo máquinas virtuales de tipo Azure clásico.", + "loc.messages.AFC_NoARMVMResources": "No hay ninguna máquina en el grupo de recursos '{0}' para copiar. La conexión de servicio '{1}' seleccionada admite solo máquinas virtuales de tipo Azure Resource Manager.", + "loc.messages.AFC_NoGenericVMResources": "No existe ninguna máquina en el grupo de recursos: '{0}' para la copia.", + "loc.messages.AFC_FilteringNoVMResources": "No existe ninguna máquina en el grupo de recursos: '{0}' con el siguiente {1} '{2}'.", + "loc.messages.AFC_CopyStarted": "Copia iniciada para la máquina: '{0}'", + "loc.messages.AFC_CopyCompleted": "Estado de copia de la máquina '{0}': '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "Para solucionar problemas relacionados con la conexión de servicio de WinRM, seleccione la opción 'Habilitar los requisitos previos de copia' en la tarea. Si ya están establecidos, y las máquinas virtuales de destino están respaldadas por un equilibrador de carga, asegúrese de que las reglas NAT de entrada están configuradas para el puerto de destino (5986). Solo es aplicable a las máquinas virtuales de ARM.", + "loc.messages.AFC_CopyFailed": "No se pudo copiar en la máquina '{0}'. Consulte los registros para obtener más detalles.", + "loc.messages.AFC_ParallelCopyFailed": "No se pudo copiar en una o varias máquinas. Consulte los registros para obtener más detalles.", + "loc.messages.AFC_CopySuccessful": "Archivos copiados correctamente desde la ruta de origen '{0}' a las máquinas virtuales de Azure de destino en el grupo de recursos: '{1}'", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "No se pudo establecer la extensión de script personalizado '{0}' para la máquina virtual '{1}'. Error: {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "No se pudo agregar la regla de seguridad de red: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "No se puede establecer la extensión de script personalizado '{0}' para la máquina virtual '{1}': {2}", + "loc.messages.AFC_CopyPrereqsFailed": "No se pudieron habilitar los requisitos previos de copia. {0}", + "loc.messages.AFC_BlobStorageNotFound": "No se encontró la cuenta de almacenamiento: {0}. Especifique una cuenta de almacenamiento existente.", + "loc.messages.AFC_RootContainerAndDirectory": "La opción '/S' no es válida para contenedores de $root.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "El código de respuesta HTTP '{0}' no es un código de estado de redireccionamiento válido", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "El encabezado de ubicación de la respuesta de redireccionamiento es NULL.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "AzCopy.exe terminó con el código de salida distinto de cero al cargar archivos en el almacenamiento de blobs.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "No se puede recuperar la clave de la cuenta de almacenamiento. Error: '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "Desinstale el script personalizado de WinRM de forma manual y reintente la implementación.", + "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", + "loc.messages.UnsupportedAuthScheme": "Esquema de autenticación no admitido '{0}' para el punto de conexión.", + "loc.messages.ServicePrincipalError": "Error con la entidad de servicio que se usó para la implementación.", + "loc.messages.AzModuleNotFound": "No se pudieron encontrar los módulos: 'Az.Accounts'. Si el módulo se instaló recientemente, vuelva a intentarlo después de reiniciar el agente de tareas de Azure Pipelines." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzureFileCopyV5/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..c4cb43f509da --- /dev/null +++ b/_generated/AzureFileCopyV5/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,94 @@ +{ + "loc.friendlyName": "Copie de fichiers Azure", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Copier des fichiers sur le Stockage Blob Azure ou des machines virtuelles", + "loc.instanceNameFormat": "Copie de fichiers $(Destination)", + "loc.releaseNotes": "Nouveautés de la version 5.0 :
   Prise en charge d'AzCopy.exe version 10.12.2", + "loc.input.label.SourcePath": "Source", + "loc.input.help.SourcePath": "Chemin absolu du dossier ou fichier source sur la machine locale, ou partage UNC. L'expression doit retourner un seul dossier ou fichier. Le symbole de caractère générique (*) est pris en charge n'importe où dans le chemin ou le nom de fichier.", + "loc.input.label.ConnectedServiceNameARM": "Abonnement Azure", + "loc.input.help.ConnectedServiceNameARM": "Abonnement Azure Resource Manager à cibler pour la copie des fichiers.", + "loc.input.label.Destination": "Type de destination", + "loc.input.help.Destination": "Sélectionnez la destination, objet blob ou machines virtuelles Azure.", + "loc.input.label.StorageAccountRM": "Compte de stockage RM", + "loc.input.help.StorageAccountRM": "Spécifiez un compte de stockage ARM préexistant. Il sert également d'intermédiaire pour la copie de fichiers vers des machines virtuelles Azure", + "loc.input.label.ContainerName": "Nom du conteneur", + "loc.input.help.ContainerName": "Nom du conteneur pour le chargement des fichiers. Si un conteneur portant le nom indiqué n'existe pas dans le compte de stockage spécifié, il est automatiquement créé.
Si vous devez créer un répertoire virtuel dans le conteneur, utilisez l'entrée de préfixe d'objet blob ci-dessous.
Exemple : Si votre emplacement cible est https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/, spécifiez mycontainer comme nom de conteneur et vd1/vd2 comme préfixe d’objet blob.", + "loc.input.label.BlobPrefix": "Préfixe d’objet blob", + "loc.input.help.BlobPrefix": "Utile pour filtrer les fichiers, par exemple, ajouter le numéro de build à tous les objets blob pour télécharger les fichiers à partir de cette build uniquement. Exemple : si vous spécifiez le préfixe d’objet blob myvd1/, un répertoire virtuel portant ce nom est créé dans le conteneur. Le préfixe d’objet blob avec un '/' de fin sera considéré comme un répertoire virtuel. Sinon, il sera traité comme un fichier, sauf si l’élément en cours de copie est lui-même un dossier. Les fichiers sources seront copiés dans https://myaccount.blob.core.windows.net/mycontainer/myvd1/.", + "loc.input.label.EnvironmentNameRM": "Groupe de ressources", + "loc.input.help.EnvironmentNameRM": "Nom du groupe de ressources cible où copier les fichiers.", + "loc.input.label.ResourceFilteringMethod": "Sélectionner les machines par", + "loc.input.help.ResourceFilteringMethod": "Vous pouvez également sélectionner un sous-ensemble de machines virtuelles dans le groupe de ressources, en indiquant les noms d’hôtes ou les balises des machines virtuelles. Les [balises](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) sont prises en charge pour les ressources créées via Azure Resource Manager uniquement.", + "loc.input.label.MachineNames": "Critères de filtre", + "loc.input.help.MachineNames": "Indiquez une liste de noms d'hôtes de machines virtuelles, par exemple ffweb, ffdb, ou des balises telles que Role:DB, Web; OS:Win8.1. Notez que les délimiteurs employés pour les balises sont ,(virgule), :(deux-points) et ;(point-virgule). Si plusieurs balises sont fournies, la tâche s'exécute sur toutes les machines virtuelles correspondant aux balises spécifiées. Par défaut, la tâche s'exécute sur toutes les machines virtuelles.", + "loc.input.label.vmsAdminUserName": "Connexion d'administrateur", + "loc.input.help.vmsAdminUserName": "Nom d'utilisateur d'administrateur des machines virtuelles.", + "loc.input.label.vmsAdminPassword": "Mot de passe", + "loc.input.help.vmsAdminPassword": "Mot de passe d'administrateur des machines virtuelles.
Il peut accepter une variable définie dans les pipelines de build ou de mise en production sous la forme '$(passwordVariable)'.
Vous pouvez marquer la variable comme étant de type 'secret' pour la sécuriser.", + "loc.input.label.TargetPath": "Dossier de destination", + "loc.input.help.TargetPath": "Chemin d'accès local sur les machines cibles pour la copie des fichiers à partir de la source. Une variable d'environnement peut être utilisée, par ex., $env:windir\\BudgetIT\\Web.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "Arguments facultatifs (pour le chargement des fichiers vers un objet blob)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Arguments AzCopy.exe facultatifs copiés durant le chargement dans l'objet blob, par exemple --check-length=true. Si aucun argument facultatif n'est spécifié ici, les arguments facultatifs suivants sont ajoutés par défaut.
--log-level=INFO (si le pipeline s'exécute en mode de débogage défini --log-level=DEBUG),
--recursive (uniquement si le nom du conteneur n'est pas $root),
--blob-type=PageBlob (uniquement si le compte de stockage spécifié est un compte premium).", + "loc.input.label.AdditionalArgumentsForVMCopy": "Arguments facultatifs (pour le téléchargement des fichiers sur une machine virtuelle)", + "loc.input.help.AdditionalArgumentsForVMCopy": "Arguments AzCopy.exe facultatifs appliqués durant le téléchargement sur une machine virtuelle, par exemple --check-length=true. Si aucun argument facultatif n'est spécifié ici, les arguments facultatifs suivants sont ajoutés par défaut.
--log-level=INFO (si le pipeline s'exécute en mode de débogage défini --log-level=DEBUG),
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "Délai d'expiration du jeton SAP en minutes", + "loc.input.help.sasTokenTimeOutInMinutes": "Indiquez la durée en minutes à partir de laquelle le jeton SAS du conteneur doit expirer. Par défaut, ce jeton expire au bout de 4 heures.", + "loc.input.label.enableCopyPrerequisites": "Activer les conditions préalables à la copie", + "loc.input.help.enableCopyPrerequisites": "L'activation de cette option configure l'écouteur Windows Remote Management (WinRM) via le protocole HTTPS sur le port 5986, à l'aide d'un certificat auto-signé. Cette configuration est obligatoire pour effectuer une opération de copie sur des machines Azure. Si les machines virtuelles cibles sont associées à un équilibreur de charge, vérifiez que des règles NAT de trafic entrant sont configurées pour le port cible (5986). S'applique uniquement aux machines virtuelles ARM.", + "loc.input.label.CopyFilesInParallel": "Copier en parallèle", + "loc.input.help.CopyFilesInParallel": "Si la valeur est true, les fichiers sont copiés en parallèle sur les machines cibles.", + "loc.input.label.CleanTargetBeforeCopy": "Nettoyer la cible", + "loc.input.help.CleanTargetBeforeCopy": "Si la valeur est true, le dossier de destination est nettoyé avant la copie des fichiers.", + "loc.input.label.skipCACheck": "Certificat de test", + "loc.input.help.skipCACheck": "Si cette option est sélectionnée, le client ignore la validation permettant de vérifier que le certificat du serveur est signé par une autorité de certification approuvée lors de la connexion via HTTP ou Secure Socket Layer (HTTPS).", + "loc.messages.AFC_StorageAccountNotFound": "Le compte de stockage {0} est introuvable. La connexion de service sélectionnée, 'Principal du service', prend uniquement en charge les comptes de stockage de type Azure Resource Manager.", + "loc.messages.AFC_ResourceGroupNotFound": "Le groupe de ressources indiqué '{0}' n'existe pas.", + "loc.messages.AFC_GetVMStatus": "[Appel Azure]Obtention de l'état de la machine virtuelle '{0}'", + "loc.messages.AFC_GetVMStatusComplete": "[Appel Azure]Obtention de l'état de la machine virtuelle '{0}'", + "loc.messages.AFC_GetCustomScriptExtension": "[Appel Azure]Obtention de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Appel Azure]Obtention réussie de l'extension de script personnalisé '{1}' pour la machine virtuelle '{0}'", + "loc.messages.AFC_SetCustomScriptExtension": "[Appel Azure]Définition de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Appel Azure]Définition de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Appel Azure]Suppression de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Appel Azure]Suppression réussie de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'", + "loc.messages.AFC_NoNetworkInterface": "[Appel Azure]Interface réseau introuvable pour l'ID de machine virtuelle {0} dans le groupe de ressources {1}", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Appel Azure]Le nom du groupe de ressources et l'ID de machine virtuelle ne doivent pas avoir la valeur nul ou être vides", + "loc.messages.AFC_AzurePSNotInstalled": "La version minimale nécessaire {0} pour les applets de commande Azure PowerShell n'est pas installée. Vous pouvez suivre les instructions fournies sur https://azure.microsoft.com/fr-fr/documentation/articles/powershell-install-configure/ pour obtenir la dernière version d'Azure PowerShell", + "loc.messages.AFC_ClassicStorageAccountNotFound": "Le compte de stockage {0} est introuvable. La connexion de service sélectionnée, 'Certificat', prend uniquement en charge les comptes de stockage de type Azure Classic.", + "loc.messages.AFC_GenericStorageAccountNotFound": "Le compte de stockage {0} est introuvable. Spécifiez un compte de stockage existant", + "loc.messages.AFC_AzureFileCopyMoreHelp": "Pour plus d'informations, consultez {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "Chargement des fichiers à partir du chemin source '{0}' vers le compte de stockage '{1}' dans le conteneur '{2}' ayant pour préfixe blob '{3}'", + "loc.messages.AFC_UploadContainerStorageAccount": "Échec du chargement vers le conteneur '{0}' dans le compte de stockage '{1}' ayant pour préfixe blob '{2}'. Erreur : '{3}'", + "loc.messages.AFC_UploadFileSuccessful": "Les fichiers ont été chargés correctement du chemin source '{0}' vers le compte de stockage '{1}' dans le conteneur '{2}' ayant pour préfixe blob '{3}'", + "loc.messages.AFC_IncorrectTags": "Les étiquettes ont été spécifiées de manière incorrecte. Elles doivent être au format Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "Les machines suivantes n'existent pas dans le groupe de ressources, ou leurs noms n'ont pas été spécifiés correctement : {0}. Indiquez le nom exact des machines présentes dans le groupe de ressources. Utilisez une virgule pour séparer plusieurs noms de machines.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "Impossible d'obtenir {0} pour l'ensemble des ressources dans ResourceGroup : '{1}'", + "loc.messages.AFC_MachineNameFromIdError": "Impossible d'obtenir {0} pour les ressources '{1}' dans le ResourceGroup '{2}'", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "La ressource '{1}' est introuvable à l'aide de la connexion de service sélectionnée '{0}'. La connexion de service sélectionnée '{0}' prend en charge uniquement les ressources classiques (modèle de management des services).", + "loc.messages.AFC_NoClassicVMResources": "Il n'existe aucune machine à copier dans le groupe de ressources '{0}'. La connexion de service sélectionnée '{1}' prend uniquement en charge les machines virtuelles de type Azure Classic.", + "loc.messages.AFC_NoARMVMResources": "Il n'existe aucune machine à copier dans le groupe de ressources '{0}'. La connexion de service sélectionnée '{1}' prend uniquement en charge les machines virtuelles de type Azure Resource Manager.", + "loc.messages.AFC_NoGenericVMResources": "Il n'existe aucune machine à copier dans le groupe de ressources '{0}'.", + "loc.messages.AFC_FilteringNoVMResources": "Il n'existe aucune machine dans le groupe de ressources '{0}' avec pour {1} '{2}'.", + "loc.messages.AFC_CopyStarted": "Copie démarrée pour la machine '{0}'", + "loc.messages.AFC_CopyCompleted": "État de la copie pour la machine '{0}' : '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "Pour corriger les problèmes de connexion de service de WinRM, sélectionnez la tâche 'Activer les conditions préalables à la copie' dans la tâche. Si cela est déjà fait, et si les machines virtuelles cibles sont associées à un équilibreur de charge, vérifiez que des règles NAT de trafic entrant sont configurées pour le port cible (5986). Ceci est applicable uniquement aux machines virtuelles ARM.", + "loc.messages.AFC_CopyFailed": "Échec de la copie sur la machine '{0}'. Pour plus d'informations, consultez les journaux.", + "loc.messages.AFC_ParallelCopyFailed": "Échec de la copie vers une ou plusieurs machines. Pour plus d'informations, consultez les journaux.", + "loc.messages.AFC_CopySuccessful": "Fichiers correctement copiés du chemin source '{0}' vers les machines virtuelles Azure cibles du groupe de ressources '{1}'", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "Échec de la définition de l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}'. Erreur : {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "Échec de l'ajout de la règle de sécurité réseau : {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "Impossible de définir l'extension de script personnalisé '{0}' pour la machine virtuelle '{1}' : {2}", + "loc.messages.AFC_CopyPrereqsFailed": "Échec de l'activation des conditions préalables de copie. {0}", + "loc.messages.AFC_BlobStorageNotFound": "Le compte de stockage {0} est introuvable. Spécifiez un compte de stockage existant", + "loc.messages.AFC_RootContainerAndDirectory": "L'option '/S' est non valide pour les conteneurs $root.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "Le code de réponse HTTP '{0}' n’est pas un code d’état de redirection valide", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "L'en-tête d'emplacement pour la réponse de redirection a une valeur nul.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "AzCopy.exe s'est arrêté avec un code de sortie différent de zéro durant le chargement des fichiers vers le Stockage Blob.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "Impossible de récupérer (fetch) la clé du compte de stockage. Erreur : '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "Désinstallez manuellement le script personnalisé WinRM, puis réessayez d'effectuer le déploiement.", + "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", + "loc.messages.UnsupportedAuthScheme": "Schéma d'authentification '{0}' non pris en charge pour le point de terminaison.", + "loc.messages.ServicePrincipalError": "Erreur liée au principal du service utilisé pour le déploiement.", + "loc.messages.AzModuleNotFound": "Les modules 'Az.Accounts' sont introuvables. Si le module a été installé récemment, réessayez l'opération après avoir redémarré l'agent de tâche Azure Pipelines." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzureFileCopyV5/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..6655b79b0087 --- /dev/null +++ b/_generated/AzureFileCopyV5/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,94 @@ +{ + "loc.friendlyName": "Copia dei file di Azure", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Copia i file in Archiviazione BLOB di Azure nelle macchine virtuali", + "loc.instanceNameFormat": "Copia dei file $(Destination)", + "loc.releaseNotes": "Novità della versione 5.0:
   Supporto di AzCopy.exe versione10.12.2", + "loc.input.label.SourcePath": "Origine", + "loc.input.help.SourcePath": "Percorso assoluto della cartella o del file di origine nel computer locale oppure condivisione UNC. L'espressione deve restituire una sola cartella o file. Il simbolo del carattere jolly (*) è supportato in qualsiasi punto del percorso o del nome file.", + "loc.input.label.ConnectedServiceNameARM": "Sottoscrizione di Azure", + "loc.input.help.ConnectedServiceNameARM": "Sottoscrizione di Azure Resource Manager usata come destinazione per la copia dei file.", + "loc.input.label.Destination": "Tipo di destinazione", + "loc.input.help.Destination": "Consente di selezionare la destinazione, nel BLOB o nelle macchine virtuali di Azure.", + "loc.input.label.StorageAccountRM": "Account di archiviazione di Gestione risorse", + "loc.input.help.StorageAccountRM": "Consente di specificare un account di archiviazione di ARM preesistente. Viene usato anche come intermediario per la copia dei file nelle macchine virtuali di Azure", + "loc.input.label.ContainerName": "Nome contenitore", + "loc.input.help.ContainerName": "Nome del contenitore per il caricamento dei file. Se nell'account di archiviazione non esiste un contenitore con il nome specificato, verrà creato automaticamente.
Se è necessario creare una directory virtuale all'interno del contenitore, usare il valore di input seguente come prefisso BLOB.
Esempio: se il percorso di destinazione è https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/, specificare contenitore come nome del contenitore e vd1/vd2/ come prefisso BLOB.", + "loc.input.label.BlobPrefix": "Prefisso BLOB", + "loc.input.help.BlobPrefix": "Utile per filtrare i file, ad esempio aggiungere il numero di build a tutti i BLOB per scaricare i file solo da quella build. Esempio: se si specifica il prefisso BLOB come myvd1/, all'interno del contenitore verrà creata una directory virtuale con questo nome. Il prefisso BLOB con '/' finale verrà considerato una directory virtuale. In caso contrario, verrà considerato come file, a meno che l'elemento da copiare non sia di per sé una cartella. I file di origine verranno copiati in https://myaccount.blob.core.windows.net/mycontainer/myvd1/.", + "loc.input.label.EnvironmentNameRM": "Gruppo di risorse", + "loc.input.help.EnvironmentNameRM": "Nome del gruppo di risorse di destinazione in cui copiare i file.", + "loc.input.label.ResourceFilteringMethod": "Seleziona computer per", + "loc.input.help.ResourceFilteringMethod": "Facoltativamente, selezionare un sottoinsieme di macchine virtuali nel gruppo di risorse specificando il nome host o i tag delle macchine virtuali. I [tag](https://learn.microsoft.com/it-it/azure/virtual-machines/tag-template/) sono supportati solo per le risorse create tramite Azure Resource Manager.", + "loc.input.label.MachineNames": "Criteri di filtro", + "loc.input.help.MachineNames": "Consente di specificare un elenco di nomi host di macchine virtuali, come ffweb, ffdb o tag come Role:DB, Web; OS:Win8.1. Nota: i delimitatori usati per i tag sono ,(virgola), :(due punti) e ;(punto e virgola). Se si specificano più tag, l'attività verrà eseguita in tutte le macchine virtuali con i tag specificati. Per impostazione predefinita, l'attività viene eseguita in tutte le macchine virtuali.", + "loc.input.label.vmsAdminUserName": "Account di accesso amministratore", + "loc.input.help.vmsAdminUserName": "Nome utente dell'amministratore delle macchine virtuali.", + "loc.input.label.vmsAdminPassword": "Password", + "loc.input.help.vmsAdminPassword": "Password dell'amministratore per le macchine virtuali.
Può accettare la variabile definita nelle pipeline di compilazione o versione come '$(passwordVariable)'.
Per proteggere la variabile, è possibile contrassegnarla come 'secret'.", + "loc.input.label.TargetPath": "Cartella di destinazione", + "loc.input.help.TargetPath": "Percorso locale nei computer di destinazione per la copia dei file dall'origine. È possibile usare una variabile di ambiente come $env:windir\\BudgetIT\\Web.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "Argomenti facoltativi (per il caricamento dei file nel BLOB)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Argomenti facoltativi di AzCopy.exe, come --check-length=true, che verranno applicati durante il caricamento nel BLOB. Se non si specifica alcun argomento facoltativo, gli argomenti facoltativi seguenti verranno aggiunti per impostazione predefinita.
--log-level=INFO (se la pipeline è in esecuzione nella modalità di debug impostata --log-level=DEBUG)
--recursive (solo se il nome del contenitore non è $root)
--blob-type=PageBlob (solo se l'account di archiviazione specificato è un account Premium).", + "loc.input.label.AdditionalArgumentsForVMCopy": "Argomenti facoltativi (per il download dei file nella macchina virtuale)", + "loc.input.help.AdditionalArgumentsForVMCopy": "Argomenti facoltativi di AzCopy.exe, come --check-length=true, che verranno applicati durante il download nella macchina virtuale. Se non si specifica alcun argomento facoltativo, gli argomenti facoltativi seguenti verranno aggiunti per impostazione predefinita.
--log-level=INFO (se la pipeline è in esecuzione nella modalità di debug impostata --log-level=DEBUG)
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "Periodo di scadenza del token di firma di accesso condiviso in minuti", + "loc.input.help.sasTokenTimeOutInMinutes": "Specificare il tempo in minuti dopo il quale il token di firma di accesso condiviso per il contenitore scadrà. Per impostazione predefinita, questo token scade dopo 4 ore.", + "loc.input.label.enableCopyPrerequisites": "Abilita prerequisiti di copia", + "loc.input.help.enableCopyPrerequisites": "Se si abilita questa opzione, il listener di Gestione remota Windows (WinRM) verrà configurato con il protocollo HTTPS sulla porta 5986 usando un certificato autofirmato. Questa configurazione è necessaria per eseguire l'operazione di copia su computer Azure. Se le macchine virtuali di destinazione sono supportate da un servizio Load Balancer, assicurarsi che le regole NAT in ingresso siano configurate per la porta di destinazione (5986). Applicabile solo per le macchine virtuali ARM.", + "loc.input.label.CopyFilesInParallel": "Copia in parallelo", + "loc.input.help.CopyFilesInParallel": "Se è impostato su true, i file verranno copiati in parallelo nei computer di destinazione.", + "loc.input.label.CleanTargetBeforeCopy": "Pulisci destinazione", + "loc.input.help.CleanTargetBeforeCopy": "Se è impostato su true, la cartella di destinazione verrà pulita prima della copia dei file.", + "loc.input.label.skipCACheck": "Certificato di test", + "loc.input.help.skipCACheck": "Se questa opzione è selezionata, il client non esegue la convalida per verificare che il certificato server sia firmato da un'Autorità di certificazione (CA) attendibile quando si connette tramite il protocollo HTTPS (Hypertext Transfer Protocol over Secure Socket Layer).", + "loc.messages.AFC_StorageAccountNotFound": "L'account di archiviazione {0} non è stato trovato. La connessione al servizio selezionata 'Entità servizio' supporta solo account di archiviazione di tipo Azure Resource Manager.", + "loc.messages.AFC_ResourceGroupNotFound": "Il gruppo di risorse specificato '{0}' non esiste.", + "loc.messages.AFC_GetVMStatus": "[Chiamata di Azure]Recupero dello stato per la macchina virtuale '{0}'", + "loc.messages.AFC_GetVMStatusComplete": "[Chiamata di Azure]Lo stato della macchina virtuale '{0}' è stato recuperato", + "loc.messages.AFC_GetCustomScriptExtension": "[Chiamata di Azure]Recupero dell'estensione per script personalizzati '{0}' per la macchina virtuale '{1}'", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Chiamata di Azure]L'estensione per script personalizzati '{0}' per la macchina virtuale '{1}' è stata recuperata", + "loc.messages.AFC_SetCustomScriptExtension": "[Chiamata di Azure]Impostazione dell'estensione per script personalizzati '{0}' per la macchina virtuale '{1}'", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Chiamata di Azure]L'estensione per script personalizzati '{0}' per la macchina virtuale '{1}' è stata impostata", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Chiamata di Azure]Rimozione dell'estensione per script personalizzati '{0}' per la macchina virtuale '{1}'", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Chiamata di Azure]L'estensione per script personalizzati {0}' per la macchina virtuale '{1}' è stata rimossa", + "loc.messages.AFC_NoNetworkInterface": "[Chiamata di Azure]Non è stata trovata alcuna interfaccia di rete con l'ID macchina virtuale {0} nel gruppo di risorse {1}", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Chiamata di Azure]Il nome del gruppo di risorse e l'ID macchina virtuale non devono essere Null o vuoti", + "loc.messages.AFC_AzurePSNotInstalled": "La versione minima richiesta {0} dei cmdlet di Azure Powershell non è installata. Per scaricare la versione più recente di Azure Powershell, seguire le istruzioni disponibili all'indirizzo https://azure.microsoft.com/it-it/documentation/articles/powershell-install-configure/", + "loc.messages.AFC_ClassicStorageAccountNotFound": "L'account di archiviazione {0} non è stato trovato. La connessione al servizio selezionata 'Certificato' supporta solo account di archiviazione di tipo Azure classico.", + "loc.messages.AFC_GenericStorageAccountNotFound": "L'account di archiviazione {0} non è stato trovato. Specificarne uno esistente", + "loc.messages.AFC_AzureFileCopyMoreHelp": "Per altre informazioni, vedere {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "Il caricamento dei file dal percorso di origine '{0}' nell'account di archiviazione '{1}' nel contenitore '{2}' con prefisso BLOB '{3}' è in corso", + "loc.messages.AFC_UploadContainerStorageAccount": "Il caricamento nel contenitore '{0}' nell'account di archiviazione '{1}' con prefisso BLOB '{2}' non è riuscito. Errore: '{3}'", + "loc.messages.AFC_UploadFileSuccessful": "Il caricamento dei file dal percorso di origine '{0}' nell'account di archiviazione '{1}' nel contenitore '{2}' con prefisso BLOB '{3}' è stato completato", + "loc.messages.AFC_IncorrectTags": "I tag specificati non sono corretti. Specificarli nel formato Ruolo:Web,DB;Località:Stati Uniti orientali;Reparto:Finanza,HR", + "loc.messages.AFC_MachineDoesNotExist": "I computer seguenti non esistono nel gruppo di risorse oppure i relativi nomi non sono stati specificati correttamente: {0}. Specificare gli stessi nomi di computer presenti nel gruppo di risorse e usare la virgola come delimitatore tra più nomi di computer.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "Non è possibile ottenere {0} per tutte le risorse nel gruppo di risorse '{1}'", + "loc.messages.AFC_MachineNameFromIdError": "Non è possibile ottenere {0} per le risorse '{1}' nel gruppo di risorse '{2}'", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "La risorsa '{1}' non è stata trovata usando la connessione al servizio selezionata '{0}'. La connessione al servizio selezionata {0}' supporta solo risorse classiche (modello di gestione servizi).", + "loc.messages.AFC_NoClassicVMResources": "Nel gruppo di risorse '{0}' non esistono computer per la copia. La connessione al servizio selezionata '{1}' supporta solo macchine virtuali di tipo Azure classico.", + "loc.messages.AFC_NoARMVMResources": "Nel gruppo di risorse '{0}' non esistono computer per la copia. La connessione al servizio selezionata '{1}' supporta solo macchine virtuali di tipo Azure Resource Manager.", + "loc.messages.AFC_NoGenericVMResources": "Nel gruppo di risorse '{0}' non esiste alcun computer per la copia.", + "loc.messages.AFC_FilteringNoVMResources": "Nel gruppo di risorse '{0}' non esiste alcun computer con l'elemento {1} '{2}'.", + "loc.messages.AFC_CopyStarted": "Copia avviata per il computer: '{0}'", + "loc.messages.AFC_CopyCompleted": "Stato della copia per il computer '{0}': '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "Per risolvere i problemi correlati alla connessione al servizio WinRM, selezionare l'opzione 'Abilita prerequisiti di copia' nell'attività. Se l'opzione è già impostata e le macchine virtuali di destinazione sono supportate da un servizio di bilanciamento del carico, assicurarsi che le regole NAT in ingresso siano configurate per la porta di destinazione (5986). Applicabile solo per le macchine virtuali ARM.", + "loc.messages.AFC_CopyFailed": "La copia nel computer '{0}' non è riuscita. Per maggiori dettagli, vedere i log.", + "loc.messages.AFC_ParallelCopyFailed": "La copia in uno o più computer non è riuscita. Per maggiori dettagli, vedere i log.", + "loc.messages.AFC_CopySuccessful": "La copia dei file dal percorso di origine '{0}' alle macchine virtuali di Azure di destinazione nel gruppo di risorse '{1}' è stata completata", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "L'impostazione dell'estensione per script personalizzati '{0}' per la macchina virtuale '{1}' non è riuscita. Errore: {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "Non è stato possibile aggiungere la regola di sicurezza di rete: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "Non è possibile impostare l'estensione per script personalizzati '{0}' per la macchina virtuale '{1}': {2}", + "loc.messages.AFC_CopyPrereqsFailed": "Non è stato possibile abilitare i prerequisiti di copia. {0}", + "loc.messages.AFC_BlobStorageNotFound": "L'account di archiviazione {0} non è stato trovato. Specificarne uno esistente", + "loc.messages.AFC_RootContainerAndDirectory": "L'opzione '/S' non è valida per i contenitori $root.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "Il codice di risposta HTTP '{0}' non è un codice di stato di reindirizzamento valido", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "L'intestazione del percorso della risposta di reindirizzamento è Null.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "AzCopy.exe è stato terminato con il codice di uscita diverso da zero durante il caricamento dei file nell'archivio BLOB.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "Non è possibile recuperare la chiave dell'account di archiviazione. Errore: '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "Disinstallare manualmente lo script personalizzato di WinRM e ripetere la distribuzione.", + "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", + "loc.messages.UnsupportedAuthScheme": "Lo schema di autenticazione '{0}' non è supportato per l'endpoint.", + "loc.messages.ServicePrincipalError": "Si è verificato un errore con l'entità servizio usata per la distribuzione.", + "loc.messages.AzModuleNotFound": "Non è stato possibile trovare i moduli 'Az.Accounts'. Se il modulo è stato installato di recente, riprovare dopo aver riavviato l'agente delle attività Azure Pipelines." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzureFileCopyV5/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..5a729f25484c --- /dev/null +++ b/_generated/AzureFileCopyV5/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,94 @@ +{ + "loc.friendlyName": "Azure ファイル コピー", + "loc.helpMarkDown": "[このタスクに関する詳細](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Azure Blob Storage または仮想マシンにファイルをコピーします", + "loc.instanceNameFormat": "$(Destination) ファイル コピー", + "loc.releaseNotes": "バージョン 5.0 の新機能:
   AzCopy.exe バージョン 10.12.2 のサポート", + "loc.input.label.SourcePath": "ソース", + "loc.input.help.SourcePath": "ソース フォルダーまたはローカル コンピューター上のファイルの絶対パス、もしくは UNC 共有。式は単一のフォルダーまたはファイルを返す必要があります。ワイルド カード記号 (*) はファイル パスまたはファイル名の任意の場所で使用できます。", + "loc.input.label.ConnectedServiceNameARM": "Azure サブスクリプション", + "loc.input.help.ConnectedServiceNameARM": "ファイルをコピーする対象の Azure Resource Manager サブスクリプション。", + "loc.input.label.Destination": "コピー先のタイプ", + "loc.input.help.Destination": "Azure BLOB または Azure VM のいずれかをコピー先として選択します。", + "loc.input.label.StorageAccountRM": "RM ストレージ アカウント", + "loc.input.help.StorageAccountRM": "既存の ARM ストレージ アカウントを指定します。Azure VM にファイルをコピーするための仲介役としても使用されます", + "loc.input.label.ContainerName": "コンテナー名", + "loc.input.help.ContainerName": "ファイルをアップロードするためのコンテナーの名前です。指定した名前のコンテナーが指定したストレージ アカウントに存在しない場合、自動的に作成されます。
そのコンテナー内に仮想ディレクトリを作成する必要がある場合は、BLOB プレフィックスの入力を以下のように使用します。
例: 対象の場所が https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/ であれば、コンテナー名を mycontainer と指定し、BLOB プレフィックスを vd1/vd2/ と指定します。", + "loc.input.label.BlobPrefix": "BLOB プレフィックス", + "loc.input.help.BlobPrefix": "ファイルをフィルター処理する場合に便利です。たとえば、すべての BLOB にビルド番号を追加して、そのビルドのみからファイルをダウンロードします。例: BLOB プレフィックスを myvd1/ として指定すると、この名前の仮想ディレクトリがコンテナー内に作成されます。末尾に '/' が付いた BLOB プレフィックスは、仮想ディレクトリとみなされます。それ以外の場合、コピーするアイテム自体がフォルダーでない限り、ファイルとして取り扱われます。ソース ファイルは https://myaccount.blob.core.windows.net/mycontainer/myvd1/ にコピーされます。", + "loc.input.label.EnvironmentNameRM": "リソース グループ", + "loc.input.help.EnvironmentNameRM": "ファイルのコピー先のターゲット リソース グループの名前。", + "loc.input.label.ResourceFilteringMethod": "以下の条件でコンピューターを選択", + "loc.input.help.ResourceFilteringMethod": "必要に応じて、VM ホスト名またはタグを指定してリソース グループ内での VM のサブセットを選びます。[タグ](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) は、Azure Resource Manager を通して作成されたリソースでのみサポートされています。", + "loc.input.label.MachineNames": "フィルター条件", + "loc.input.help.MachineNames": "VM ホスト名 (ffweb, ffdb) またはタグ (Role:DB, Web; OS:Win8.1) のリストをご指定ください。タグに使用される区切り文字が ,(コンマ)、:(コロン) および ;(セミコロン) であることにご注意ください。複数のタグが指定されている場合、指定されたタグを含むすべての VM でタスクが実行されます。既定値ではすべての VM でタスクが実行されます。", + "loc.input.label.vmsAdminUserName": "管理者ログイン", + "loc.input.help.vmsAdminUserName": "VM の管理者ユーザー名。", + "loc.input.label.vmsAdminPassword": "パスワード", + "loc.input.help.vmsAdminPassword": "VM の管理者パスワード。
ビルドまたはリリース パイプラインで '$(passwordVariable)' として定義された変数を入力することができます。
変数を 'シークレット' とマークしてセキュリティで保護することもできます。", + "loc.input.label.TargetPath": "コピー先フォルダー", + "loc.input.help.TargetPath": "ソースからのファイルのコピー先となるターゲット コンピューター上のローカル パス。$env:windir\\BudgetIT\\Web のように、環境変更を使用できます。", + "loc.input.label.AdditionalArgumentsForBlobCopy": "オプションの引数 (BLOB へのファイルのアップロード用)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "BLOB にアップロードするときに適用される、 --check-length=true などのオプションの AzCopy.exe 引数です。ここでオプション引数を指定しない場合、既定で、次のオプション引数が追加されます。
--log-level=INFO (パイプラインがデバッグ モードで実行されている場合は、--log-level=DEBUG が設定されます)
--recursive (コンテナー名が $root 以外の場合のみ)
--blob-type=PageBlob (指定されたストレージ アカウントが Premium アカウントの場合のみ)。", + "loc.input.label.AdditionalArgumentsForVMCopy": "オプションの引数 (VM へのファイルのダウンロード用)", + "loc.input.help.AdditionalArgumentsForVMCopy": "VM にダウンロードするときに適用される、 --check-length=true などのオプションの AzCopy.exe 引数です。ここでオプション引数を指定しない場合、既定で、次のオプション引数が追加されます。
--log-level=INFO (パイプラインがデバッグ モードで実行されている場合は、--log-level=DEBUG が設定されます)
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "SAS トークンの有効期間 (分)", + "loc.input.help.sasTokenTimeOutInMinutes": "コンテナーの SAS トークンの有効期限が切れるまでの時間を分単位で指定します。既定では、このトークンは 4 時間後に有効期限が切れます。", + "loc.input.label.enableCopyPrerequisites": "コピーの前提条件を有効にする", + "loc.input.help.enableCopyPrerequisites": "このオプションを有効にすると、自己署名証明書を使って、Windows リモート管理 (WinRM) リスナーをポート 5986 の HTTPS プロトコル経由で構成できます。この構成は Azure コンピューター上でコピー操作を実行するために必要です。ターゲットの仮想マシンがロード バランサーでバックアップされている場合は、インバウンド NAT 規則がターゲット ポート (5986) に対して構成されていることを確認します。ARM VM にのみ適用されます。", + "loc.input.label.CopyFilesInParallel": "並列でコピー", + "loc.input.help.CopyFilesInParallel": "true に設定すると、ファイルを並列でターゲット コンピューターにコピーします。", + "loc.input.label.CleanTargetBeforeCopy": "ターゲットをクリーンにする", + "loc.input.help.CleanTargetBeforeCopy": "true に設定すると、ファイルをコピーする前にコピー先フォルダーの内容を消去します。", + "loc.input.label.skipCACheck": "テスト証明書", + "loc.input.help.skipCACheck": "このオプションを選ぶと、クライアントは HTTPS (Hypertext Transfer Protocol over Secure Socket Layer) を介して接続するときに、サーバー証明書が信頼できる証明機関 (CA) によって署名されていることの検証をスキップします。", + "loc.messages.AFC_StorageAccountNotFound": "ストレージ アカウント: {0} は見つかりません。選択されたサービス接続 'Service Principal' は、種類が Azure Resource Manager のストレージ アカウントのみをサポートします。", + "loc.messages.AFC_ResourceGroupNotFound": "指定されたリソース グループ '{0}' は存在しません。", + "loc.messages.AFC_GetVMStatus": "[Azure の呼び出し]VM '{0}' の状態を取得しています", + "loc.messages.AFC_GetVMStatusComplete": "[Azure の呼び出し]VM '{0}' の状態を取得しました", + "loc.messages.AFC_GetCustomScriptExtension": "[Azure の呼び出し]VM '{1}' のカスタム スクリプト拡張機能 '{0}' を取得しています", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Azure の呼び出し]VM '{1}' のカスタム スクリプト拡張機能 '{0}' を取得しました", + "loc.messages.AFC_SetCustomScriptExtension": "[Azure の呼び出し]VM '{1}' のカスタム スクリプト拡張機能 '{0}' を設定しています", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Azure の呼び出し]VM '{1}' のカスタム スクリプト拡張機能 '{0}' を設定しました", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Azure の呼び出し]VM '{1}' のカスタム スクリプト拡張機能 '{0}' を削除しています", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Azure の呼び出し]VM '{1}' のカスタム スクリプト拡張機能 '{0}' を削除しました", + "loc.messages.AFC_NoNetworkInterface": "[Azure の呼び出し]リソース グループ {1} の下に仮想マシン ID が {0} のネットワーク インターフェイスが見つかりませんでした", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Azure の呼び出し]リソース グループ名と仮想マシン ID を null または空白にすることはできません", + "loc.messages.AFC_AzurePSNotInstalled": "Azure PowerShell コマンドレットの必須の最小バージョン {0} がインストールされていません。https://azure.microsoft.com/ja-jp/documentation/articles/powershell-install-configure/ にある指示に従って、最新の Azure PowerShell を入手できます", + "loc.messages.AFC_ClassicStorageAccountNotFound": "ストレージ アカウント: {0} 見つかりません。選択したサービス接続 'Certificate' では、Azure クラシック タイプのストレージ アカウントのみがサポートされます。", + "loc.messages.AFC_GenericStorageAccountNotFound": "ストレージ アカウント {0} が見つかりません。既存のストレージ アカウントを指定してください", + "loc.messages.AFC_AzureFileCopyMoreHelp": "詳細については、{0} を参照してください", + "loc.messages.AFC_UploadFilesStorageAccount": "ソース パス '{0}' からコンテナー: '{2}' 内のストレージ アカウント: '{1}' に BLOB プレフィックス: '{3}' でファイルをアップロードしています:", + "loc.messages.AFC_UploadContainerStorageAccount": "ストレージ アカウント: '{1}'(BLOB プレフィックス: '{2}') のコンテナー '{0}' へのアップロードは、エラー: '{3}' で失敗しました", + "loc.messages.AFC_UploadFileSuccessful": "ソース パス '{0}' からコンテナー: '{2}' のストレージ アカウント: '{1}' にファイルが BLOB プレフィックス: '{3}' で正常にアップロードされました", + "loc.messages.AFC_IncorrectTags": "タグが正しく指定されていません。次の形式にする必要があります: Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "次のコンピューターが、リソース グループ内に見つからないか、名前の指定が正しくありません: {0}。リソース グループ内に存在するコンピューター名と正確に同じコンピューター名を指定してください。複数のコンピューター名を区切るにはコンマを使用します。", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "ResourceGroup '{1}' のすべてのリソースに対して {0} を取得できません", + "loc.messages.AFC_MachineNameFromIdError": "ResourceGroup '{2}' の '{1}' つのリソースに対して {0} を取得できません", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "選択されたサービス接続 '{0}' を使用して、リソース '{1}' を見つけることができません。選択されたサービス接続 '{0}' は、クラシック リソース (サービス管理モデル) のみをサポートします。", + "loc.messages.AFC_NoClassicVMResources": "リソース グループ '{0}' の下にコピー対象のマシンは存在しません。選択したサービス接続 '{1}' は Azure クラシック タイプの仮想マシンのみをサポートしています。", + "loc.messages.AFC_NoARMVMResources": "リソース グループ '{0}' にコピー用のマシンが存在しません。選択したサービス接続 '{1}' では、Azure Resource Manager タイプの Virtual Machines のみがサポートされます。", + "loc.messages.AFC_NoGenericVMResources": "リソース グループ '{0}' にコピー用のマシンが存在しません。", + "loc.messages.AFC_FilteringNoVMResources": "リソース グループ '{0}' に次の {1} '{2}' を持つマシンが存在しません。", + "loc.messages.AFC_CopyStarted": "コンピューター: '{0}' のコピーが開始されました", + "loc.messages.AFC_CopyCompleted": "コンピューター '{0}' のコピーの状態: '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "WinRM サービス接続に関連する問題を修正するには、タスクで [コピーの前提条件を有効にする] オプションを選びます。既に設定されており、対象の Virtual Machines がロード バランサーの対象となっている場合は、インバウンド NAT 規則がターゲット ポート (5986) 用に構成されていることを確認してください。ARM VM にのみ適用されます。", + "loc.messages.AFC_CopyFailed": "マシン '{0}' でコピーに失敗しました。詳細についてはログを参照してください。", + "loc.messages.AFC_ParallelCopyFailed": "1 台または複数のマシンへのコピーが失敗しました。詳細についてはログを参照してください。", + "loc.messages.AFC_CopySuccessful": "ソース パス '{0}' からリソース グループ '{1}' 内のターゲット Azure VM へのファイルのコピーが正常に完了しました", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "仮想マシン '{1}' のカスタム スクリプト拡張機能 '{0}' を設定できませんでした。エラー: {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "ネットワークのセキュリティ規則を追加できませんでした: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "仮想マシン '{1}' のカスタム スクリプト拡張機能 '{0}' を設定できません: {2}", + "loc.messages.AFC_CopyPrereqsFailed": "コピーの前提条件を有効にすることができませんでした。{0}", + "loc.messages.AFC_BlobStorageNotFound": "ストレージ アカウント {0} が見つかりません。既存のストレージ アカウントを指定してください", + "loc.messages.AFC_RootContainerAndDirectory": "$root コンテナーには、'/S' オプションは無効です。", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "HTTP 応答コード: '{0}' は無効なリダイレクト状態コードです。", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "リダイレクト応答の場所ヘッダーが null です。", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "AzCopy.exe が Blob Storage にファイルをアップロードしている間に、ゼロ以外の終了コードで終了しました。", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "ストレージ アカウント キーをフェッチできません。エラー: '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "WinRM カスタム スクリプトを手動でアンインストールしてから、デプロイを再試行してください。", + "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", + "loc.messages.UnsupportedAuthScheme": "'{0}' はエンドポイントではサポートされていない認証スキームです。", + "loc.messages.ServicePrincipalError": "デプロイに使用されたサービス プリンシパルにエラーがありました。", + "loc.messages.AzModuleNotFound": "モジュール 'Az.Accounts' が見つかりませんでした。モジュールが最近インストールされた場合は、Azure Pipelines タスク エージェントを再起動してから再試行してください。" +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzureFileCopyV5/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..3a3942bd8693 --- /dev/null +++ b/_generated/AzureFileCopyV5/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,94 @@ +{ + "loc.friendlyName": "Azure 파일 복사", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Azure Blob Storage 또는 가상 머신에 파일을 복사합니다.", + "loc.instanceNameFormat": "$(Destination) 파일 복사", + "loc.releaseNotes": "버전 5.0의 새로운 기능:
   AzCopy.exe 버전 10.12.2 지원", + "loc.input.label.SourcePath": "원본", + "loc.input.help.SourcePath": "소스 폴더, 로컬 머신의 파일 또는 UNC 공유에 대한 절대 경로입니다. 식은 단일 폴더 또는 파일을 반환해야 합니다. 와일드카드 기호(*)는 파일 경로 또는 파일 이름의 모든 위치에서 지원됩니다.", + "loc.input.label.ConnectedServiceNameARM": "Azure 구독", + "loc.input.help.ConnectedServiceNameARM": "파일 복사를 위한 대상으로 지정할 Azure Resource Manager 구독입니다.", + "loc.input.label.Destination": "대상 유형", + "loc.input.help.Destination": "대상으로 Azure Blob 또는 Azure VM 중 하나를 선택합니다.", + "loc.input.label.StorageAccountRM": "RM 저장소 계정", + "loc.input.help.StorageAccountRM": "기존 ARM 저장소 계정을 지정합니다. 파일을 Azure VM에 복사하기 위한 중간자로도 사용됩니다.", + "loc.input.label.ContainerName": "컨테이너 이름", + "loc.input.help.ContainerName": "파일을 업로드하기 위한 컨테이너의 이름입니다. 지정한 스토리지 계정에 지정된 이름을 가진 컨테이너가 없을 경우 자동으로 만들어집니다.
컨테이너 안에 가상 디렉터리를 만들어야 하는 경우 아래 Blob 접두사 입력을 사용하세요.
예: 대상 위치가 https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/인 경우 mycontainer를 컨테이너 이름으로, vd1/vd2/를 Blob 접두사로 지정하세요.", + "loc.input.label.BlobPrefix": "Blob 접두사", + "loc.input.help.BlobPrefix": "파일을 필터링하는 데 유용합니다. 예를 들어 모든 Blob에 빌드 번호를 추가하여 해당 빌드에서만 파일을 다운로드할 수 있습니다. 예: Blob 접두사를 myvd1/로 지정하면 이 이름의 가상 디렉터리가 컨테이너 내부에 만들어집니다. 후행 '/'가 있는 Blob 접두사는 가상 디렉터리로 간주됩니다. 후행 '/'가 없으면 복사되는 항목 자체가 폴더가 아니라면 파일로 처리됩니다. 원본 파일이 https://myaccount.blob.core.windows.net/mycontainer/myvd1/로 복사됩니다.", + "loc.input.label.EnvironmentNameRM": "리소스 그룹", + "loc.input.help.EnvironmentNameRM": "파일을 복사할 대상 리소스 그룹의 이름입니다.", + "loc.input.label.ResourceFilteringMethod": "컴퓨터 선택 기준", + "loc.input.help.ResourceFilteringMethod": "필요한 경우 VM 호스트 이름이나 태그를 제공하여 리소스 그룹에서 VM의 하위 집합을 선택합니다. [태그](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/)는 Azure Resource Manager를 통해 만든 리소스에만 지원됩니다.", + "loc.input.label.MachineNames": "필터 조건", + "loc.input.help.MachineNames": "ffweb, ffdb 등과 같은 VMs 호스트 이름이나 Role:DB, Web; OS:Win8.1 등과 같은 태그의 목록을 지정하세요. 태그에 사용되는 구분 기호는 ,(쉼표), :(콜론) 및 ;(세미콜론)입니다. 여러 태그를 지정하는 경우 작업이 지정된 태그가 있는 모든 VM에서 실행됩니다. 기본값은 모든 VM에서 작업을 실행하는 것입니다.", + "loc.input.label.vmsAdminUserName": "관리자 로그인", + "loc.input.help.vmsAdminUserName": "VM의 관리자 사용자 이름입니다.", + "loc.input.label.vmsAdminPassword": "암호", + "loc.input.help.vmsAdminPassword": "VM의 관리자 암호입니다.
빌드 또는 릴리스 파이프라인에서 '$(passwordVariable)'(으)로 정의된 변수를 사용할 수 있습니다.
변수를 'secret'으로 표시하여 보호할 수도 있습니다.", + "loc.input.label.TargetPath": "대상 폴더", + "loc.input.help.TargetPath": "소스에서 파일을 복사하기 위한 대상 컴퓨터의 로컬 경로입니다. $env:windir\\BudgetIT\\Web과 같은 환경 변수를 사용할 수 있습니다.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "선택적 인수(Blob에 파일을 업로드하는 경우)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Blob으로 업로드할 때 적용되는 선택적 AzCopy.exe 인수(예: --check-length=true)입니다. 여기에서 선택적 인수를 지정하지 않으면 다음과 같은 선택적 인수가 기본적으로 추가됩니다.
--log-level=INFO(파이프라인이 디버그 모드에서 실행되는 경우 --log-level=DEBUG 설정),
--recursive(컨테이너 이름이 $root가 아닌 경우에만),
--blob-type=PageBlob(지정한 스토리지 계정이 프리미엄 계정인 경우에만)", + "loc.input.label.AdditionalArgumentsForVMCopy": "선택적 인수(VM에 파일을 다운로드하는 경우)", + "loc.input.help.AdditionalArgumentsForVMCopy": "VM으로 다운로드할 때 적용되는 선택적 AzCopy.exe 인수(예: --check-length=true)입니다. 여기에서 선택적 인수를 지정하지 않으면 다음과 같은 선택적 인수가 기본적으로 추가됩니다.
--log-level=INFO(파이프라인이 디버그 모드에서 실행되는 경우 --log-level=DEBUG 설정),
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "SAS 토큰 만료 기간(분)", + "loc.input.help.sasTokenTimeOutInMinutes": "컨테이너에 대한 SAS 토큰이 만료되기까지의 시간(분)을 제공합니다. 기본적으로 이 토큰은 4시간 후에 만료됩니다.", + "loc.input.label.enableCopyPrerequisites": "복사 필수 구성 요소 사용", + "loc.input.help.enableCopyPrerequisites": "이 옵션을 사용하도록 설정하면 자체 서명된 인증서를 사용하여 포트 5986의 HTTP 프로토콜에서 WinRM(Windows 원격 관리) 수신기가 구성됩니다. 이 구성은 Azure 컴퓨터에서 복사 작업을 수행하는 데 필요합니다. 대상 가상 머신이 Load Balancer에서 지원되는 경우 인바운드 NAT 규칙이 대상 포트(5986)에 대해 구성되었는지 확인하세요. ARM VM에 대해서만 적용할 수 있습니다.", + "loc.input.label.CopyFilesInParallel": "동시 복사", + "loc.input.help.CopyFilesInParallel": "true로 설정하면 파일이 대상 컴퓨터에 동시에 복사됩니다.", + "loc.input.label.CleanTargetBeforeCopy": "클린 대상", + "loc.input.help.CleanTargetBeforeCopy": "true로 설정하면 파일을 복사하기 전에 대상 폴더가 정리됩니다.", + "loc.input.label.skipCACheck": "테스트 인증서", + "loc.input.help.skipCACheck": "이 옵션을 선택하면 클라이언트에서 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)를 통해 연결할 때 서버 인증서에 신뢰할 수 있는 CA(인증 기관)의 서명이 있는지 확인하는 단계를 건너뜁니다.", + "loc.messages.AFC_StorageAccountNotFound": "스토리지 계정 {0}을(를) 찾을 수 없습니다. 선택한 서비스 연결 'Service Principal'은 Azure Resource Manager 유형의 스토리지 계정만 지원합니다.", + "loc.messages.AFC_ResourceGroupNotFound": "제공된 리소스 그룹 '{0}'이(가) 없습니다.", + "loc.messages.AFC_GetVMStatus": "[Azure 호출]VM '{0}'의 상태를 가져오는 중", + "loc.messages.AFC_GetVMStatusComplete": "[Azure 호출]VM '{0}'의 상태를 가져왔습니다.", + "loc.messages.AFC_GetCustomScriptExtension": "[Azure 호출]VM '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 가져오는 중", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Azure 호출]VM '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 가져왔습니다.", + "loc.messages.AFC_SetCustomScriptExtension": "[Azure 호출]VM '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 설정하는 중", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Azure 호출]VM '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 설정했습니다.", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Azure 호출]VM '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 제거하는 중", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Azure 호출]VM '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 제거했습니다.", + "loc.messages.AFC_NoNetworkInterface": "[Azure 호출]리소스 그룹 {1}에 가상 머신 ID가 {0}인 네트워크 인터페이스가 없습니다.", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Azure 호출]리소스 그룹 이름 및 가상 머신 ID는 null이거나 비워 둘 수 없습니다.", + "loc.messages.AFC_AzurePSNotInstalled": "필요한 Azure PowerShell Cmdlet의 최소 버전 {0}이(가) 설치되어 있지 않습니다. https://azure.microsoft.com/ko-kr/documentation/articles/powershell-install-configure/의 지침에 따라 최신 Azure PowerShell을 다운로드할 수 있습니다.", + "loc.messages.AFC_ClassicStorageAccountNotFound": "스토리지 계정 {0}을(를) 찾을 수 없습니다. 선택한 서비스 연결 'Certificate'는 Azure 클래식 유형의 스토리지 계정만 지원합니다.", + "loc.messages.AFC_GenericStorageAccountNotFound": "저장소 계정 {0}을(를) 찾을 수 없습니다. 기존 저장소 계정을 지정하세요.", + "loc.messages.AFC_AzureFileCopyMoreHelp": "자세한 내용은 {0}을(를) 참조하세요.", + "loc.messages.AFC_UploadFilesStorageAccount": "Blob 접두사 '{3}'(으)로 소스 경로 '{0}'의 파일을 '{2}' 컨테이너의 저장소 계정 '{1}'에 업로드하는 중", + "loc.messages.AFC_UploadContainerStorageAccount": "Blob 접두사 '{2}'(으)로 저장소 계정 '{1}'에 '{0}' 컨테이너를 업로드하지 못했습니다. 오류: '{3}'", + "loc.messages.AFC_UploadFileSuccessful": "Blob 접두사 '{3}'(으)로 소스 경로 '{0}'의 파일을 '{2}' 컨테이너의 저장소 계정 '{1}'에 업로드했습니다.", + "loc.messages.AFC_IncorrectTags": "태그가 잘못 지정되었습니다. 태그는 Role:Web,DB;Location:East US;Dept.:Finance,HR 형식이어야 합니다.", + "loc.messages.AFC_MachineDoesNotExist": "다음 컴퓨터는 리소스 그룹에 없거나 해당 이름이 올바르게 지정되지 않았습니다. {0}. 리소스 그룹에 있는 그대로 정확하게 같은 컴퓨터 이름을 제공하세요. 여러 컴퓨터 이름을 구분하려면 쉼표를 사용하세요.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "ResourceGroup '{1}'에서 모든 리소스에 대한 {0}을(를) 가져올 수 없습니다.", + "loc.messages.AFC_MachineNameFromIdError": "ResourceGroup '{2}'에서 '{1}' 리소스에 대한 {0}을(를) 가져올 수 없습니다.", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "선택한 서비스 연결 '{0}'을(를) 사용하여 '{1}' 리소스를 찾을 수 없습니다. 선택한 서비스 연결 '{0}'은(는) 클래식 리소스만 지원합니다(서비스 관리 모델).", + "loc.messages.AFC_NoClassicVMResources": "복사에 사용할 머신이 리소스 그룹 '{0}'에 없습니다. 선택한 서비스 연결 '{1}'은(는) Azure 클래식 유형의 Virtual Machines만 지원합니다.", + "loc.messages.AFC_NoARMVMResources": "복사에 사용할 머신이 리소스 그룹 '{0}'에 없습니다. 선택한 서비스 연결 '{1}'은(는) Azure Resource Manager 유형의 Virtual Machines만 지원합니다.", + "loc.messages.AFC_NoGenericVMResources": "복사에 사용할 컴퓨터가 리소스 그룹 '{0}'에 없습니다.", + "loc.messages.AFC_FilteringNoVMResources": "다음의 {1} '{2}'을(를) 포함하는 컴퓨터가 리소스 그룹 '{0}'에 없습니다.", + "loc.messages.AFC_CopyStarted": "다음 컴퓨터에 대한 복사 시작됨: '{0}'", + "loc.messages.AFC_CopyCompleted": "'{0}' 컴퓨터의 상태 복사: '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "WinRM 서비스 연결 관련 문제를 해결하려면 작업에서 '복사 필수 구성 요소 사용' 옵션을 선택하세요. 이미 설정되어 있고 대상 가상 머신이 부하 분산 장치로 지원되면 대상 포트(5986)에 대해 인바운드 NAT 규칙이 구성되어 있는지 확인합니다. ARM VM에만 적용됩니다.", + "loc.messages.AFC_CopyFailed": "'{0}' 머신에 복사하지 못했습니다. 자세한 내용은 로그를 참조하세요.", + "loc.messages.AFC_ParallelCopyFailed": "하나 이상의 머신에 복사하지 못했습니다. 자세한 내용은 로그를 참조하세요.", + "loc.messages.AFC_CopySuccessful": "소스 경로 '{0}'의 파일을 리소스 그룹의 대상 Azure VM '{1}'에 복사했습니다.", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "가상 머신 '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 설정하지 못했습니다. 오류: {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "네트워크 보안 규칙 {0}을(를) 추가하지 못했습니다.", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "가상 머신 '{1}'의 사용자 지정 스크립트 확장 '{0}'을(를) 설정할 수 없습니다. {2}", + "loc.messages.AFC_CopyPrereqsFailed": "복사 필수 구성 요소를 사용하도록 설정하지 못했습니다. {0}", + "loc.messages.AFC_BlobStorageNotFound": "저장소 계정 {0}을(를) 찾을 수 없습니다. 기존 저장소 계정을 지정하세요.", + "loc.messages.AFC_RootContainerAndDirectory": "$root 컨테이너에 대해 '/S' 옵션이 잘못되었습니다.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "HTTP 응답 코드: '{0}'은(는) 유효한 리디렉션 상태 코드가 아닙니다.", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "리디렉션 응답 위치 헤더가 null입니다.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "Blob Storage에 파일을 업로드하는 중 AzCopy.exe가 0이 아닌 종료 코드로 종료되었습니다.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "스토리지 계정 키를 페치할 수 없습니다. 오류: '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "WinRM 사용자 지정 스크립트를 수동으로 제거하고 배포를 다시 시도하세요.", + "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", + "loc.messages.UnsupportedAuthScheme": "엔드포인트에 대해 인증 체계 '{0}'은(는) 지원되지 않습니다.", + "loc.messages.ServicePrincipalError": "배포에 사용되는 서비스 사용자에 오류가 발생했습니다.", + "loc.messages.AzModuleNotFound": "'Az.Accounts' 모듈을 찾을 수 없습니다. 모듈이 최근에 설치된 경우 Azure Pipelines 작업 에이전트를 다시 시작한 후 다시 시도하세요." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzureFileCopyV5/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..19fb9e0370f3 --- /dev/null +++ b/_generated/AzureFileCopyV5/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,94 @@ +{ + "loc.friendlyName": "Копирование файлов Azure", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://aka.ms/azurefilecopyreadme)", + "loc.description": "Копировать файлы в хранилище BLOB-объектов Azure или виртуальные машины", + "loc.instanceNameFormat": "Копирование файлов $(Destination)", + "loc.releaseNotes": "Новые возможности версии 5.0:
   поддержка AzCopy.exe версии 10.12.2", + "loc.input.label.SourcePath": "Источник", + "loc.input.help.SourcePath": "Абсолютный путь к исходной папке или файлу на локальном компьютере или общему ресурсу UNC. Выражение должно возвращать одну папку или один файл. Подстановочный знак (*) поддерживается в любом месте пути к файлу или имени файла.", + "loc.input.label.ConnectedServiceNameARM": "Подписка Azure", + "loc.input.help.ConnectedServiceNameARM": "Подписка на Azure Resource Manager, предназначенная для копирования файлов.", + "loc.input.label.Destination": "Целевой тип", + "loc.input.help.Destination": "Выберите назначение: BLOB-объект Azure или виртуальные машины Azure.", + "loc.input.label.StorageAccountRM": "Учетная запись хранения Диспетчера ресурсов", + "loc.input.help.StorageAccountRM": "Укажите существующую учетную запись хранения ARM. Она также используется в качестве промежуточной для копирования файлов на виртуальные машины Azure", + "loc.input.label.ContainerName": "Имя контейнера", + "loc.input.help.ContainerName": "Имя контейнера для отправки файлов. Если контейнер с данным именем не существует в указанной учетной записи хранения, он будет создан автоматически.
Для создания виртуального каталога внутри контейнера используйте приведенный ниже входной префикс BLOB-объекта.
Пример. Если конечным расположением является https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/, укажите mycontainer в качестве имени контейнера и vd1/vd2/ в качестве префикса BLOB-объекта.", + "loc.input.label.BlobPrefix": "Префикс BLOB-объекта", + "loc.input.help.BlobPrefix": "Удобно для фильтрации файлов, например добавьте номер сборки ко всем BLOB-объектам для скачивания файлов только из этой сборки. Пример. Если префикс BLOB-объекта указан как myvd1/, в контейнере будет создан виртуальный каталог с таким именем. Префикс BLOB-объекта с конечным \"/\" будет считаться виртуальным каталогом. В противном случае он будет рассматриваться как файл, если копируемый элемент не является папкой. Исходные файлы будут скопированы в https://myaccount.blob.core.windows.net/mycontainer/myvd1/.", + "loc.input.label.EnvironmentNameRM": "Группа ресурсов", + "loc.input.help.EnvironmentNameRM": "Название целевой группы ресурсов, в которую копируются файлы.", + "loc.input.label.ResourceFilteringMethod": "Выбор компьютеров по", + "loc.input.help.ResourceFilteringMethod": "Можно также выбрать подмножество виртуальных машин в группе ресурсов, указав имя узла виртуальных машин или теги. [Теги](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) поддерживаются только для ресурсов, созданных в Azure Resource Manager.", + "loc.input.label.MachineNames": "Условия фильтра", + "loc.input.help.MachineNames": "Укажите список имен узлов виртуальных машин (например, ffweb, ffdb) или тегов (например, Role:DB, Web; OS:Win8.1). Для тегов используются следующие разделители: , (запятая), : (двоеточие) и ; (точка с запятой). Если указывается несколько тегов, задача будет обрабатывать все виртуальные машины с указанными тегами. По умолчанию задача запускается на всех виртуальных машинах.", + "loc.input.label.vmsAdminUserName": "Имя для входа администратора", + "loc.input.help.vmsAdminUserName": "Имя администратора виртуальных машин.", + "loc.input.label.vmsAdminPassword": "Пароль", + "loc.input.help.vmsAdminPassword": "Пароль администратора для виртуальных машин.
Допустимы переменные, заданные в конвейерах сборки или выпуска как \"$(passwordVariable)\".
Чтобы защитить переменную, пометьте ее как secret.", + "loc.input.label.TargetPath": "Целевая папка", + "loc.input.help.TargetPath": "Локальный путь на целевых компьютерах для копирования файлов из источника. Переменную среды можно использовать как $env:windir\\BudgetIT\\Web.", + "loc.input.label.AdditionalArgumentsForBlobCopy": "Необязательные аргументы (для отправки файлов в большой двоичный объект)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "Необязательные аргументы AzCopy.exe, которые будут применены при отправке в BLOB-объект, например --check-length=true. Если здесь не указаны дополнительные аргументы, по умолчанию будут добавлены указанные ниже необязательные аргументы.
--log-level=INFO (если конвейер находится в режиме отладки, укажите --log-level=DEBUG),
--recursive (только если имя контейнера отличается от $root),
--blob-type=PageBlob (только если указанная учетная запись хранения относится к ценовой категории \"Премиум\").", + "loc.input.label.AdditionalArgumentsForVMCopy": "Необязательные аргументы (для скачивания файлов в виртуальную машину)", + "loc.input.help.AdditionalArgumentsForVMCopy": "Необязательные аргументы AzCopy.exe, которые будут применены при скачивании на виртуальную машину, например --check-length=true. Если здесь не указаны дополнительные аргументы, по умолчанию будут добавлены указанные ниже необязательные аргументы.
--log-level=INFO (если конвейер находится в режиме отладки, укажите --log-level=DEBUG),
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "Период истечения срока действия маркера SAS в минутах", + "loc.input.help.sasTokenTimeOutInMinutes": "Укажите время в минутах, по истечении которого закончится срок действия маркера SAS для контейнера. По умолчанию срок действия маркера истекает через 4 часа.", + "loc.input.label.enableCopyPrerequisites": "Включить необходимые компоненты для копирования", + "loc.input.help.enableCopyPrerequisites": "При включении этого параметра выполняется настройка прослушивателя службы удаленного управления Windows (WinRM) по протоколу HTTPS на порте 5986 с использованием самозаверяющего сертификата. Эта конфигурация требуется для выполнения копирования на виртуальных машинах Azure. Если средства Load Balancer поддерживают целевые виртуальные машины, убедитесь, что правила NAT для входящего трафика настроены для целевого порта (5986). Применимо только для виртуальных машин ARM.", + "loc.input.label.CopyFilesInParallel": "Копировать параллельно", + "loc.input.help.CopyFilesInParallel": "Если задано значение \"true\", будет выполнено параллельное копирование файлов на целевые компьютеры.", + "loc.input.label.CleanTargetBeforeCopy": "Очистить целевой объект", + "loc.input.help.CleanTargetBeforeCopy": "Если задано значение \"true\", конечная папка будет очищена до копирования файлов.", + "loc.input.label.skipCACheck": "Тестовый сертификат", + "loc.input.help.skipCACheck": "Если выбрать этот параметр, клиент пропускает проверку того, подписан ли сертификат сервера доверенным центром сертификации при подключении по протоколу HTTP через SSL (HTTPS).", + "loc.messages.AFC_StorageAccountNotFound": "Учетная запись хранения \"{0}\" не найдена. Выбранное подключение к службе \"Субъект-служба\" поддерживает учетные записи хранения только типа Azure Resource Manager.", + "loc.messages.AFC_ResourceGroupNotFound": "Указанная группа ресурсов \"{0}\" не существует.", + "loc.messages.AFC_GetVMStatus": "[Вызов Azure] Выполняется получение состояния виртуальной машины \"{0}\"", + "loc.messages.AFC_GetVMStatusComplete": "[Вызов Azure] Состояние виртуальной машины \"{0}\" получено", + "loc.messages.AFC_GetCustomScriptExtension": "[Вызов Azure] Идет получение расширения пользовательских скриптов \"{0}\" для виртуальной машины \"{1}\"", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Вызов Azure] Расширение пользовательских скриптов \"{0}\" для виртуальной машины \"{1}\" получено", + "loc.messages.AFC_SetCustomScriptExtension": "[Вызов Azure] Выполняется задание расширения пользовательских скриптов \"{0}\" для виртуальной машины \"{1}\"", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Вызов Azure] Расширение пользовательских скриптов \"{0}\" для виртуальной машины \"{1}\" задано", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Вызов Azure] Идет удаление расширения пользовательских скриптов \"{0}\" для виртуальной машины \"{1}\"", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Вызов Azure] Расширение пользовательских скриптов \"{0}\" для виртуальной машины \"{1}\" удалено", + "loc.messages.AFC_NoNetworkInterface": "[Вызов Azure] Сетевые интерфейсы с идентификатором виртуальной машины {0} не найдены в группе ресурсов {1}", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Вызов Azure] ИД виртуальной машины и имя группы ресурсов не должны иметь значение NULL или быть пустыми", + "loc.messages.AFC_AzurePSNotInstalled": "Минимальная требуемая версия ({0}) командлетов Azure PowerShell не установлена. Для получения последней версии Azure PowerShell можно выполнить инструкции на странице https://azure.microsoft.com/ru-ru/documentation/articles/powershell-install-configure/.", + "loc.messages.AFC_ClassicStorageAccountNotFound": "Учетная запись хранения \"{0}\" не найдена. Выбранное подключение к службе \"Сертификат\" поддерживает учетные записи хранения только типа \"классическая Azure\".", + "loc.messages.AFC_GenericStorageAccountNotFound": "Учетная запись хранения \"{0}\" не найдена. Укажите существующую учетную запись хранения", + "loc.messages.AFC_AzureFileCopyMoreHelp": "Дополнительные сведения см. в {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "Идет отправка файлов из исходного пути \"{0}\" в учетную запись хранения \"{1}\" в контейнере \"{2}\" с префиксом BLOB-объекта \"{3}\"", + "loc.messages.AFC_UploadContainerStorageAccount": "Сбой отправки в контейнер \"{0}\" в учетной записи хранения \"{1}\" с префиксом BLOB-объекта \"{2}\". Ошибка: \"{3}\"", + "loc.messages.AFC_UploadFileSuccessful": "Файлы успешно отправлены из исходного пути \"{0}\" в учетную запись хранения \"{1}\" в контейнере \"{2}\" с префиксом BLOB-объекта \"{3}\"", + "loc.messages.AFC_IncorrectTags": "Теги указаны неверно. Они должны быть в следующем формате: Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "Следующие компьютеры не существуют в группе ресурсов, или их имена указаны неправильно: {0}. Укажите именно те имена компьютеров, которые содержатся в группе ресурсов. Используйте запятые для разделения нескольких имен.", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "Не удается получить {0} для всех ресурсов в группе ресурсов: \"{1}\"", + "loc.messages.AFC_MachineNameFromIdError": "Не удается получить {0} для ресурсов \"{1}\" в группе ресурсов: \"{2}\"", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "Не удается найти ресурс \"{1}\", используя выбранное подключение к службе (\"{0}\"). Выбранное подключение к службе (\"{0}\") поддерживает только классические ресурсы (модель управления службами).", + "loc.messages.AFC_NoClassicVMResources": "В группе ресурсов \"{0}\" нет компьютеров для копирования. Выбранное подключение к службе, \"{1}\", поддерживает виртуальные машины только типа \"классическая Azure\".", + "loc.messages.AFC_NoARMVMResources": "В группе ресурсов \"{0}\" нет компьютеров для копирования. Выбранное подключение к службе, \"{1}\", поддерживает виртуальные машины только типа Azure Resource Manager.", + "loc.messages.AFC_NoGenericVMResources": "В группе ресурсов \"{0}\" нет компьютеров для копирования.", + "loc.messages.AFC_FilteringNoVMResources": "В группе ресурсов \"{0}\" нет компьютеров со следующим: {1} \"{2}\".", + "loc.messages.AFC_CopyStarted": "Началось копирование для компьютера: \"{0}\"", + "loc.messages.AFC_CopyCompleted": "Копирование состояния для компьютера \"{0}\": \"{1}\"", + "loc.messages.AFC_WinRMHelpMessage": "Чтобы исправить проблемы, связанные с подключением к службе WinRM, выберите в задаче параметр \"Включить необходимые компоненты для копирования\". Если этот параметр уже задан и балансировщик нагрузки поддерживает целевые виртуальные машины, необходимо настроить правила NAT для входящего трафика для целевого порта (5986). Применимо только к виртуальным машинам ARM.", + "loc.messages.AFC_CopyFailed": "Сбой копирования на компьютере \"{0}\". Дополнительные сведения см. в журналах.", + "loc.messages.AFC_ParallelCopyFailed": "Сбой копирования на один или несколько компьютеров. Дополнительные сведения см. в журналах.", + "loc.messages.AFC_CopySuccessful": "Файлы успешно скопированы из исходного пути \"{0}\" на целевые виртуальные машины Azure в группе ресурсов \"{1}\"", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "Сбой задания расширения пользовательских скриптов \"{0}\" для виртуальной машины \"{1}\" с ошибкой: \"{2}\".", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "Не удалось добавить правило безопасности сети: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "Не удается задать расширение пользовательских скриптов \"{0}\" для виртуальной машины \"{1}\": {2}", + "loc.messages.AFC_CopyPrereqsFailed": "Не удалось включить необходимые компоненты для копирования. {0}", + "loc.messages.AFC_BlobStorageNotFound": "Учетная запись хранения \"{0}\" не найдена. Укажите существующую учетную запись хранения", + "loc.messages.AFC_RootContainerAndDirectory": "Параметр \"/S\" является недопустимым для контейнеров $root.", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "Код ответа HTTP \"{0}\" не является допустимым кодом состояния перенаправления", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "Заголовок расположения ответа перенаправления равен NULL.", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "Программа AzCopy.exe завершила работу с ненулевым кодом выхода при отправке файлов в хранилище BLOB-объектов.", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "Не удалось получить ключ учетной записи хранения. Ошибка: \"{0}\"", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "Удалите пользовательский скрипт WinRM вручную и повторите попытку развертывания.", + "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", + "loc.messages.UnsupportedAuthScheme": "Схема проверки подлинности \"{0}\" не поддерживается для конечной точки.", + "loc.messages.ServicePrincipalError": "Произошла ошибка с субъектом-службой, используемой для развертывания.", + "loc.messages.AzModuleNotFound": "Не удалось найти модули \"Az.Accounts\". Если модуль был установлен недавно, повторите попытку, перезапустив агент задач Azure Pipelines." +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzureFileCopyV5/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..242a01d9fff6 --- /dev/null +++ b/_generated/AzureFileCopyV5/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,94 @@ +{ + "loc.friendlyName": "Azure 文件复制", + "loc.helpMarkDown": "[了解有关此任务的详细信息](https://aka.ms/azurefilecopyreadme)", + "loc.description": "将文件复制到 Azure Blob 存储或虚拟机", + "loc.instanceNameFormat": "$(Destination) 文件复制", + "loc.releaseNotes": "版本 5.0 中的新增功能:
    支持 AzCopy.exe 版本 10.12.2", + "loc.input.label.SourcePath": "源", + "loc.input.help.SourcePath": "源文件夹、本地计算机上的文件或 UNC 共享的绝对路径。表达式应返回单个文件夹或文件。支持在文件路径或文件名的任何位置使用通配符(*)。", + "loc.input.label.ConnectedServiceNameARM": "Azure 订阅", + "loc.input.help.ConnectedServiceNameARM": "用于复制文件的目标帐户的 Azure 资源管理器订阅。", + "loc.input.label.Destination": "目标类型", + "loc.input.help.Destination": "选择目标,即 Azure Blob 或 Azure VM。", + "loc.input.label.StorageAccountRM": "RM 存储帐户", + "loc.input.help.StorageAccountRM": "指定预先存在的 ARM 存储帐户。它还用作将文件复制到 Azure VM 的中间帐户", + "loc.input.label.ContainerName": "容器名", + "loc.input.help.ContainerName": "用于上载文件的容器的名称。如果指定存储帐户中不存在具有给定名称的容器,将自动创建该容器。
如果需要在容器中创建虚拟目录,请使用下面的 blob 前缀输入。
示例: 如果目标位置是 https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/,则指定 mycontainer 作为容器名称,vd1/vd2/ 作为 blob 前缀。", + "loc.input.label.BlobPrefix": "Blob 前缀", + "loc.input.help.BlobPrefix": "用于筛选文件,例如,将生成号追加到所有 blob 以仅从该生成下载文件。示例: 如果将 blob 前缀指定为 myvd1/,则将在容器内创建具有此名称的虚拟目录。带有尾随“/”的 Blob 前缀将被视为虚拟目录。否则,除非要复制的项本身是文件夹,否则它将被视为文件。源文件将被复制到 https://myaccount.blob.core.windows.net/mycontainer/myvd1/。", + "loc.input.label.EnvironmentNameRM": "资源组", + "loc.input.help.EnvironmentNameRM": "要将文件复制到的目标资源组的名称。", + "loc.input.label.ResourceFilteringMethod": "计算机选择依据", + "loc.input.help.ResourceFilteringMethod": "(可选)通过提供 VM 主机名或标记选择资源组中 VM 的子集。仅通过 Azure 资源管理器创建的资源支持 [标记](https://learn.microsoft.com/zh-cn/azure/virtual-machines/tag-template/)。", + "loc.input.label.MachineNames": "筛选条件", + "loc.input.help.MachineNames": "提供 VM 主机名(ffweb、ffdb等)或标记(Role:DB、Web; OS:Win8.1等)的列表。请注意,标记所用的分隔符为 ,(冒号)、:(句点)和 ;(分号)。如果提供了多个标记,则任务将使用指定标记在所有 VM 中运行。默认为在所有 VM 中运行任务。", + "loc.input.label.vmsAdminUserName": "管理员登录名", + "loc.input.help.vmsAdminUserName": "VM 的管理员用户名。", + "loc.input.label.vmsAdminPassword": "密码", + "loc.input.help.vmsAdminPassword": "VM 的管理员密码。
可接受在生成/发布管道中定义为 \"$(passwordVariable)\" 的变量。
可将变量类型标记为“机密”来保护它。", + "loc.input.label.TargetPath": "目标文件夹", + "loc.input.help.TargetPath": "用于从源复制文件的目标计算机上的本地路径。可以使用环境变量,如 $env: windir\\BudgetIT\\Web。", + "loc.input.label.AdditionalArgumentsForBlobCopy": "可选参数(用于将文件上载到 blob)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "上传到 blob 时将应用的可选 AzCopy.exe 参数,如 --check-length=true。如果此处未指定任何可选参数,将默认添加以下可选参数。
--log-level=INFO (如果管道以调试模式运行,则设为 --log-level=DEBUG)、
--recursive (仅当容器名称不是 $root 时)、
--blob-type=PageBlob (仅当指定的存储帐户为高级帐户时)。", + "loc.input.label.AdditionalArgumentsForVMCopy": "可选参数(用于将文件下载到 VM)", + "loc.input.help.AdditionalArgumentsForVMCopy": "下载到 VM 时将应用的可选 AzCopy.exe 参数,如 --check-length=true。如果此处未指定任何可选参数,将默认添加以下可选参数。
--log-level=INFO (如果管道以调试模式运行,则设为 --log-level=DEBUG)、
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "SAS 令牌有效期(分钟)", + "loc.input.help.sasTokenTimeOutInMinutes": "提供容器的 SAS 令牌过期前的时间(分钟)。默认情况下,此令牌将在 4 小时后过期。", + "loc.input.label.enableCopyPrerequisites": "启用复制先决条件", + "loc.input.help.enableCopyPrerequisites": "使用自签名证书启用此选项将在端口 5986 上配置针对 HTTPS 协议的 Windows 远程管理(WinRM)侦听器。需要此配置才能在 Azure 计算机上执行复制操作。如果目标虚拟机受 Load Balancer 支持,请确保为目标端口(5986)配置了入站 NAT 规则。仅适用于 ARM VM。", + "loc.input.label.CopyFilesInParallel": "并行复制", + "loc.input.help.CopyFilesInParallel": "将其设置为 true 会将文件并行复制到目标计算机。", + "loc.input.label.CleanTargetBeforeCopy": "清理目标", + "loc.input.help.CleanTargetBeforeCopy": "将其设置为 true 会在复制文件之前清理目标文件夹。", + "loc.input.label.skipCACheck": "测试证书", + "loc.input.help.skipCACheck": "如果选择了此选项,则在通过安全套接字层超文本传输协议(HTTPS)连接时,客户端将跳过验证服务器证书是否由受信任的证书颁发机构(CA)签署这一步骤。", + "loc.messages.AFC_StorageAccountNotFound": "未找到存储帐户 {0}。选定的服务连接“服务主体”仅支持 Azure 资源管理器类型的存储帐户。", + "loc.messages.AFC_ResourceGroupNotFound": "提供的资源组“{0}”不存在。", + "loc.messages.AFC_GetVMStatus": "[Azure Call]正在获取 VM“{0}”的状态", + "loc.messages.AFC_GetVMStatusComplete": "[Azure Call]已获得 VM“{0}”的状态", + "loc.messages.AFC_GetCustomScriptExtension": "[Azure Call]正在获取 VM“{1}”的自定义脚本扩展“{0}”", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Azure Call]已获得 VM“{1}”的自定义脚本扩展“{0}”", + "loc.messages.AFC_SetCustomScriptExtension": "[Azure Call]正在设置 VM“{1}”的自定义脚本扩展“{0}”", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Azure Call]已设置 VM“{1}”的自定义脚本扩展“{0}”", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Azure Call]正在删除 VM“{1}”的自定义脚本扩展“{0}”", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Azure Call]已删除 VM“{1}”的自定义脚本扩展“{0}”", + "loc.messages.AFC_NoNetworkInterface": "[Azure Call]在资源组 {1} 下,未找到虚拟机 ID 为 {0} 的网络接口", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Azure Call]资源组名称和虚拟机 ID 不应为 null 或空", + "loc.messages.AFC_AzurePSNotInstalled": "未安装 Azure Powershell Cmdlet 所需的最低版本 {0}。可以按照 https://azure.microsoft.com/en-in/documentation/articles/powershell-install-configure/ 中的说明进行操作,以获得最新的 Azure Powershell", + "loc.messages.AFC_ClassicStorageAccountNotFound": "未找到存储帐户 {0}。选定的服务连接“证书”仅支持 Azure 经典类型的存储帐户。", + "loc.messages.AFC_GenericStorageAccountNotFound": "未找到存储帐户 {0}。请指定现有的存储帐户", + "loc.messages.AFC_AzureFileCopyMoreHelp": "有关详细信息,请参阅 {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "正在将文件从源路径“{0}”上传到具有 blob 前缀“{3}”的容器“{2}”中的存储帐户“{1}”", + "loc.messages.AFC_UploadContainerStorageAccount": "上传到存储帐户“{1}”中具有 blob 前缀“{2}”的容器“{0}”失败,出现错误:“{3}”", + "loc.messages.AFC_UploadFileSuccessful": "已成功将文件从源路径“{0}”上传到具有 blob 前缀“{3}”的容器“{2}”中的存储帐户“{1}”", + "loc.messages.AFC_IncorrectTags": "错误地指定了标记。其格式必须为 Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "以下计算机未出现在资源组中,或它们的名称指定错误: {0}。请提供资源组中显示的确实相同的计算机名称。使用逗号将多个计算机名称分隔开。", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "无法获得资源组“{1}”中所有资源的 {0}", + "loc.messages.AFC_MachineNameFromIdError": "无法获得资源组“{2}”中“{1}”资源的 {0}", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "无法使用选定的服务连接“{1}”找到资源“{0}”。选定的服务连接“{0}”仅支持经典资源(服务管理模型)。", + "loc.messages.AFC_NoClassicVMResources": "资源组“{0}”下不存在要复制的计算机。选定的服务连接“{1}”仅支持 Azure 经典类型的虚拟机。", + "loc.messages.AFC_NoARMVMResources": "资源组“{0}”下不存在要复制的计算机。选定的服务连接“{1}”仅支持 Azure 资源管理器类型的虚拟机。", + "loc.messages.AFC_NoGenericVMResources": "资源组“{0}”下不存在要复制的计算机。", + "loc.messages.AFC_FilteringNoVMResources": "具有以下 {1}“{2}”的资源组“{0}”下不存在计算机。", + "loc.messages.AFC_CopyStarted": "计算机“{0}”的复制已开始", + "loc.messages.AFC_CopyCompleted": "复制计算机“{0}”的状态:“{1}”", + "loc.messages.AFC_WinRMHelpMessage": "若要修复 WinRM 服务连接相关的问题,请在任务中选择“启用复制先决条件”选项。如果已经设置,且目标虚拟机由负载均衡器提供支持,请确保为目标端口(5986)配置入站 NAT 规则。仅适用于 ARM VM。", + "loc.messages.AFC_CopyFailed": "在计算机“{0}”上复制失败。有关详细信息,请参阅日志。", + "loc.messages.AFC_ParallelCopyFailed": "复制到一个或多个计算机失败。有关详细信息,请参阅日志。", + "loc.messages.AFC_CopySuccessful": "已成功将文件从源路径“{0}”复制到了资源组“{1}”中的目标 Azure VM", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "对虚拟机“{1}”的自定义脚本扩展“{0}”的设置失败,错误: {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "未能添加网络安全规则: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "无法设置虚拟机“{1}”的自定义脚本扩展“{0}”: {2}", + "loc.messages.AFC_CopyPrereqsFailed": "无法启用复制先决条件。{0}", + "loc.messages.AFC_BlobStorageNotFound": "未找到存储帐户 {0}。请指定现有的存储帐户", + "loc.messages.AFC_RootContainerAndDirectory": "\"/S\" 选项对 $root 容器无效。", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "HTTP 响应代码:“{0}”不是有效的重定向状态代码", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "重定向响应位置标头为 null。", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "将文件上传到 blob 存储时,AzCopy.exe 以非零退出代码退出。", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "无法提取存储帐户密钥。错误: “{0}”", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "请手动卸载 WinRM 自定义脚本,然后重试部署。", + "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", + "loc.messages.UnsupportedAuthScheme": "终结点不支持的身份验证方案 \"{0}\"。", + "loc.messages.ServicePrincipalError": "用于部署的服务主体有错。", + "loc.messages.AzModuleNotFound": "找不到版本为 'Az.Accounts' 的模块。如果最近安装了该模块,请在重启 Azure Pipelines 任务代理后重试。" +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzureFileCopyV5/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..f92e913fee03 --- /dev/null +++ b/_generated/AzureFileCopyV5/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,94 @@ +{ + "loc.friendlyName": "Azure 檔案複製", + "loc.helpMarkDown": "[深入了解此工作](https://aka.ms/azurefilecopyreadme) (英文)", + "loc.description": "將檔案複製到 Azure Blob 儲存體或虛擬機器", + "loc.instanceNameFormat": "$(Destination) 檔案複製", + "loc.releaseNotes": "5.0 版的新功能:
   支援 AzCopy.exe 10.12.2 版", + "loc.input.label.SourcePath": "來源", + "loc.input.help.SourcePath": "來源資料夾、本機電腦檔案或 UNC 共用的絕對路徑。運算式應該傳回單一資料夾或檔案。支援在檔案路徑或檔案名稱的任何位置使用萬用字元符號 (*)。", + "loc.input.label.ConnectedServiceNameARM": "Azure 訂用帳戶", + "loc.input.help.ConnectedServiceNameARM": "要作為複製檔案目標的 Azure Resource Manager 訂用帳戶。", + "loc.input.label.Destination": "目的地類型", + "loc.input.help.Destination": "選取目的地,可以是 Azure Blob 或 Azure VM。", + "loc.input.label.StorageAccountRM": "RM 儲存體帳戶", + "loc.input.help.StorageAccountRM": "指定預先存在的 ARM 儲存體帳戶。其也作為將檔案複製到 Azure VM 的中繼項目", + "loc.input.label.ContainerName": "容器名稱", + "loc.input.help.ContainerName": "用於上傳檔案的容器名稱。如果具有指定名稱的容器不存在於指定的儲存體帳戶中,會自動予以建立。
如需在容器內建立虛擬目錄,請使用以下 Blob 前置詞輸入。
範例: 如果您的目標位置是 https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/,則指定 mycontainer 作為容器名稱及指定 vd1/vd2/ 作為 Blob 前置詞。", + "loc.input.label.BlobPrefix": "Blob 前置詞", + "loc.input.help.BlobPrefix": "適用於篩選檔案,例如將組建編號附加到所有 Blob,以只從該組建下載檔案。範例: 如果您將 Blob 前置詞指定為 myvd1,會在容器內建立具有此名稱的虛擬目錄。尾端為 '/' 的 Blob 前置詞會被視為虛擬目錄。否則,除非要複製的項目本身是資料夾,否則它會被視為檔案。來源檔案會複製到 https://myaccount.blob.core.windows.net/mycontainer/myvd1/。", + "loc.input.label.EnvironmentNameRM": "資源群組", + "loc.input.help.EnvironmentNameRM": "要將檔案複製到其中的目標資源群組名稱。", + "loc.input.label.ResourceFilteringMethod": "選取電腦依據", + "loc.input.help.ResourceFilteringMethod": "您也可以提供 VM 主機名稱或標記,選擇是否要從資源群組中選取一組 VM。只有透過 Azure Resource Manager 建立的群組才支援 [標記](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/)。", + "loc.input.label.MachineNames": "篩選準則", + "loc.input.help.MachineNames": "提供 VM 主機名稱 (例如 ffweb、ffdb) 或標記 (例如 Role:DB、Web; OS:Win8.1) 的清單。請注意,標記可使用的分隔符號為 , (逗號)、: (冒號) 及 ; (分號)。如有提供多個標記,工作將會在所有具有指定標籤的 VM 上執行。根據預設,將會在所有的 VM 上執行工作。", + "loc.input.label.vmsAdminUserName": "系統管理員登入", + "loc.input.help.vmsAdminUserName": "VM 的系統管理員使用者名稱。", + "loc.input.label.vmsAdminPassword": "密碼", + "loc.input.help.vmsAdminPassword": "VM 的系統管理員密碼。
其可接受組建或發行管線中定義的變數為 '$(passwordVariable)'。
您可將變數標記為 'secret' 來加以保護。", + "loc.input.label.TargetPath": "目的地資料夾", + "loc.input.help.TargetPath": "從來源複製檔案時,目標電腦上所需的本機路徑。可使用環境變數,例如 $env:windir\\BudgetIT\\Web。", + "loc.input.label.AdditionalArgumentsForBlobCopy": "選擇性引數 (用於將檔案上傳到 Blob)", + "loc.input.help.AdditionalArgumentsForBlobCopy": "上傳至 Blob 要套用的選用 AzCopy.exe 引數,例如 --check-length=true。根據預設,如未在此處指定任何選用引數,即會新增下列選用引數。
--log-level=INFO (如果管線正在偵錯模式中執行,請設定 --log-level=DEBUG),
--recursive (只有當容器名稱不是 $root 時),
--blob-type=PageBlob (只有當指定的儲存體帳戶為進階帳戶時)。", + "loc.input.label.AdditionalArgumentsForVMCopy": "選擇性引數 (用於將檔案下載到 VM)", + "loc.input.help.AdditionalArgumentsForVMCopy": "下載到 VM 時要套用的選用 AzCopy.exe 引數,例如 --check-length=true。根據預設,如未在此處指定任何選用引數,即會新增下列選用引數。
--log-level=INFO (如果管線正在偵錯模式中執行,請設定 --log-level=DEBUG),
--recursive", + "loc.input.label.sasTokenTimeOutInMinutes": "SAS 權杖到期期限 (分鐘)", + "loc.input.help.sasTokenTimeOutInMinutes": "提供容器 SAS 權杖到期前經過的分鐘數。根據預設,此權杖會在 4 小時後到期。", + "loc.input.label.enableCopyPrerequisites": "啟用複製必要條件", + "loc.input.help.enableCopyPrerequisites": "啟用此選項即可使用自我簽署憑證,透過連接埠 5986 上的 HTTPS 通訊協定來設定 Windows 遠端管理 (WinRM) 接聽程式。必須要有此設定,才能在 Azure 機器上執行複製作業。若目標虛擬機器受 Load Balancer 支援,請確認已設定目標連接埠 (5986) 的輸入 NAT 規則。僅適用於 ARM VM。", + "loc.input.label.CopyFilesInParallel": "平行複製", + "loc.input.help.CopyFilesInParallel": "若將其設定為 Ture,檔案會平行複製到目標電腦。", + "loc.input.label.CleanTargetBeforeCopy": "清除目標", + "loc.input.help.CleanTargetBeforeCopy": "若將其設定為 Ture,將會在複製檔案前先清除目的地資料夾。", + "loc.input.label.skipCACheck": "測試憑證", + "loc.input.help.skipCACheck": "若選取此選項,用戶端會在透過超文字安全傳輸通訊協定 (HTTPS) 連線時,略過驗證伺服器憑證是否已經由信任的憑證授權單位 (CA) 簽署。", + "loc.messages.AFC_StorageAccountNotFound": "找不到儲存體帳戶: {0}。選取的服務連線 'Service Principal' 僅支援 Azure Resource Manager 類型的儲存體帳戶。", + "loc.messages.AFC_ResourceGroupNotFound": "提供的資源群組 '{0}' 不存在。", + "loc.messages.AFC_GetVMStatus": "[Azure 呼叫]正在取得 VM '{0}' 的狀態", + "loc.messages.AFC_GetVMStatusComplete": "[Azure 呼叫]已取得 VM '{0}' 的狀態", + "loc.messages.AFC_GetCustomScriptExtension": "[Azure 呼叫]正在取得 VM '{1}' 的自訂指令碼延伸模組 '{0}'", + "loc.messages.AFC_GetCustomScriptExtensionComplete": "[Azure 呼叫]已取得 VM '{1}' 的自訂指令碼延伸模組 '{0}'", + "loc.messages.AFC_SetCustomScriptExtension": "[Azure 呼叫]正在設定 VM '{1}' 的自訂指令碼延伸模組 '{0}'", + "loc.messages.AFC_SetCustomScriptExtensionComplete": "[Azure 呼叫]設定 VM '{1}' 的自訂指令碼延伸模組 '{0}'", + "loc.messages.AFC_RemoveCustomScriptExtension": "[Azure 呼叫]正在移除 VM '{1}' 的自訂指令碼延伸模組 '{0}'", + "loc.messages.AFC_RemoveCustomScriptExtensionComplete": "[Azure 呼叫]已移除 VM '{1}' 的自訂指令碼延伸模組 '{0}'", + "loc.messages.AFC_NoNetworkInterface": "[Azure 呼叫]資源群組 {1} 下找不到虛擬機器識別碼為 {0} 的網路介面", + "loc.messages.AFC_NullOrEmptyResourceGroup": "[Azure 呼叫]資源群組名稱及虛擬機器識別碼不應為 null 或空白", + "loc.messages.AFC_AzurePSNotInstalled": "未安裝 Azure Powershell Cmdlet 要求的最低版本 {0}。您可以遵循下方網址中的指示取得最新 Azure Powershell: https://azure.microsoft.com/zh-tw/documentation/articles/powershell-install-configure/ (英文)", + "loc.messages.AFC_ClassicStorageAccountNotFound": "找不到儲存體帳戶: {0}。選取的服務連線 'Certificate' 僅支援 Azure 傳統類型的儲存體帳戶。", + "loc.messages.AFC_GenericStorageAccountNotFound": "找不到儲存體帳戶: {0}。請指定現有的儲存體帳戶", + "loc.messages.AFC_AzureFileCopyMoreHelp": "如需詳細資訊,請參閱 {0}", + "loc.messages.AFC_UploadFilesStorageAccount": "正在將檔案從來源路徑 '{0}' 上傳到儲存體帳戶 '{1}' 之 Blob 前置詞為 '{3}' 的容器 '{2}' 中", + "loc.messages.AFC_UploadContainerStorageAccount": "上傳到儲存體帳戶 '{0}' 中 Blob 前置詞為 '{2}' 的容器 '{1}' 失敗。錯誤: '{3}'", + "loc.messages.AFC_UploadFileSuccessful": "已成功將檔案從來源路徑 '{0}' 上傳到儲存體帳戶 '{1}' 之 Blob 前置詞為 '{3}' 的容器 '{2}' 中", + "loc.messages.AFC_IncorrectTags": "未正確指定標記。標記的格式必須為 Role:Web,DB;Location:East US;Dept.:Finance,HR", + "loc.messages.AFC_MachineDoesNotExist": "下列機器不存在於資源群組中,或未正確指定其名稱: {0}。請提供與資源群組中所顯示的機器名稱完全相同者。請使用逗號分隔多個機器名稱。", + "loc.messages.AFC_MachineNameFromIdErrorAllResources": "無法為 ResourceGroup 中的所有資源取得 {0}: '{1}'", + "loc.messages.AFC_MachineNameFromIdError": "無法為 ResourceGroup 中的 '{1}' 項資源取得 {0}: '{2}'", + "loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection": "使用選取的服務連線 '{1}' 找不到資源 '{0}'。選取的服務連線 '{0}' 僅支援傳統資源 (服務管理模型)。", + "loc.messages.AFC_NoClassicVMResources": "資源群組 '{0}' 下沒有任何機器可複製。選取的服務連線 '{1}' 僅支援 Azure 傳統類型的虛擬機器。", + "loc.messages.AFC_NoARMVMResources": "資源群組 '{0}' 下沒有任何機器可複製。選取的服務連線 '{1}' 僅支援 Azure Resource Manager 類型的虛擬機器。", + "loc.messages.AFC_NoGenericVMResources": "資源群組: '{0}' 下沒有任何機器可複製。", + "loc.messages.AFC_FilteringNoVMResources": "資源群組: '{0}' 下沒有任何機器具有下列 {1} '{2}'。", + "loc.messages.AFC_CopyStarted": "已開始電腦的複製: '{0}'", + "loc.messages.AFC_CopyCompleted": "複製電腦 '{0}' 的狀態: '{1}'", + "loc.messages.AFC_WinRMHelpMessage": "若要修正 WinRM 服務連線相關問題,請在工作中選取 [啟用複製必要條件] 選項。若已設定,且負載平衡器支援目標虛擬機器,請確認已為目標連接埠 (5986) 設定輸入 NAT 規則。僅適用於 ARM VM。", + "loc.messages.AFC_CopyFailed": "機器 '{0}' 上的複製失敗。如需詳細資料,請參閱記錄檔。", + "loc.messages.AFC_ParallelCopyFailed": "無法複製到一或多部機器。如需詳細資料,請參閱記錄檔。", + "loc.messages.AFC_CopySuccessful": "已成功從來源路徑 '{0}' 將檔案複製到資源群組 '{1}' 中的目標 Azure VM", + "loc.messages.AFC_SetCustomScriptExtensionFailed": "為虛擬機器 '{1}' 設定自訂指令碼延伸模組 '{0}' 失敗,發生錯誤: {2}", + "loc.messages.AFC_AddNetworkSecurityRuleFailed": "無法新增網路安全性規則: {0}", + "loc.messages.AFC_UnableToSetCustomScriptExtension": "無法為虛擬機器 '{2}' 設定自訂指令碼延伸模組 '{0}': {1}", + "loc.messages.AFC_CopyPrereqsFailed": "無法啟用複製必要條件。{0}", + "loc.messages.AFC_BlobStorageNotFound": "找不到儲存體帳戶: {0}。請指定現有的儲存體帳戶", + "loc.messages.AFC_RootContainerAndDirectory": "'/S' 選項對 $root 容器而言無效。", + "loc.messages.AFC_RedirectResponseInvalidStatusCode": "HTTP 回應碼: '{0}' 不是有效的重新導向狀態碼", + "loc.messages.AFC_RedirectResponseLocationHeaderIsNull": "重新導向回應位置標頭為 null。", + "loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode": "將檔案上傳至 Blob 儲存體時 AzCopy.exe 已結束,結束代碼不為零。", + "loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey": "無法擷取儲存體帳戶金鑰。錯誤: '{0}'", + "loc.messages.AFC_UninstallWinRMCustomScriptExtension": "請手動將 WinRM 自訂指令碼解除安裝,並重試部署。", + "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", + "loc.messages.UnsupportedAuthScheme": "端點不支援驗證配置 '{0}'。", + "loc.messages.ServicePrincipalError": "部署用的服務主體有錯誤。", + "loc.messages.AzModuleNotFound": "找不到模組 'Az.Accounts'。若最近才安裝該模組,請重新啟動 Azure Pipelines 工作代理程式,然後重試。" +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0.ts b/_generated/AzureFileCopyV5/Tests/L0.ts new file mode 100644 index 000000000000..b555f8259cb8 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0.ts @@ -0,0 +1,106 @@ +/// +/// +/// + +import Q = require('q'); +import assert = require('assert'); +import path = require('path'); + +var psm = require('../../../Tests/lib/psRunner'); +var psr = null; + +describe('AzureFileCopy Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + before((done) => { + if (psm.testSupported()) { + psr = new psm.PSRunner(); + psr.start(); + } + done(); + }); + + after(function () { + if (psr) { + psr.kill(); + } + }); + + if (psm.testSupported()) { + it('Validate AzureFileCopy.Utility Get-AzureUtility', (done) => { + psr.run(path.join(__dirname, 'L0GetAzureUtility.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Validate-AzurePowershellVersion', (done) => { + psr.run(path.join(__dirname, 'L0ValidateAzurePSVersion.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-StorageKey', (done) => { + psr.run(path.join(__dirname, 'L0GetStorageKey.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-StorageAccountType', (done) => { + psr.run(path.join(__dirname, 'L0GetStorageAccountType.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-blobStorageEndpoint', (done) => { + psr.run(path.join(__dirname, 'L0GetblobStorageEndpoint.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-StorageKey', (done) => { + psr.run(path.join(__dirname, 'L0UtilityThrowError.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Upload-FilesToAzureContainer', (done) => { + psr.run(path.join(__dirname, 'L0UploadFilesToAzureContainer.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Does-AzureVMMatchTagFilterCriteria', (done) => { + psr.run(path.join(__dirname, 'L0DoesAzureVMMatchTagFilter.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-TagBasedFilteredAzureVMs', (done) => { + psr.run(path.join(__dirname, 'L0GetTagBasedFilteredAzureVMs.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-MachineBasedFilteredAzureVMs', (done) => { + psr.run(path.join(__dirname, 'L0GetMachineBasedFilteredAzureVMs.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-FilteredAzureVMsInResourceGroup', (done) => { + psr.run(path.join(__dirname, 'L0GetFilteredAzureVmsInResourceGroup.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-FilteredAzureRMVMsInResourceGroup', (done) => { + psr.run(path.join(__dirname, 'L0GetFilteredAzureRMVmsInResourceGroup.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-MachineNameFromId', (done) => { + psr.run(path.join(__dirname, 'L0GetMachineNameFromId.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-MachinesFqdnsForLB', (done) => { + psr.run(path.join(__dirname, 'L0GetMachinesFqdnForLB.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-FrontEndPorts', (done) => { + psr.run(path.join(__dirname, 'L0GetFrontEndPorts.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-AzureRMVMsConnectionDetailsInResourceGroup', (done) => { + psr.run(path.join(__dirname, 'L0GetRMVMConnectionDetailsInRG.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-AzureVMResourcesProperties', (done) => { + psr.run(path.join(__dirname, 'L0GetAzureVMResourcesProperties.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Get-AzureVMsCredentials', (done) => { + psr.run(path.join(__dirname, 'L0GetAzureVMsCredentials.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Copy-FilesParallelyToAzureVMs', (done) => { + psr.run(path.join(__dirname, 'L0CopyFilesParallelyToAzureVMs.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Copy-FilesToAzureVMsFromStorageContainer', (done) => { + psr.run(path.join(__dirname, 'L0CopyFilesToAzureVMsFromStorageContainer.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Validate-CustomScriptExecutionStatus', (done) => { + psr.run(path.join(__dirname, 'L0ValidateCustomScriptExecutionStatus.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Add-AzureVMCustomScriptExtension', (done) => { + psr.run(path.join(__dirname, 'L0AddAzureVMCustomScriptExtension.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Is-WinRMCustomScriptExtensionExists', (done) => { + psr.run(path.join(__dirname, 'L0IsWinRMCustomScriptExtensionExists.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Copy-FilesSequentiallyToAzureVMs', (done) => { + psr.run(path.join(__dirname, 'L0CopyFilesSequentiallyToAzureVMs.ps1'), done); + }); + it('Validate AzureFileCopy.Utility Check-ContainerNameAndArgs', (done) => { + psr.run(path.join(__dirname, 'L0CheckContainerNameAndArgs.ps1'), done); + }); + } +}); diff --git a/_generated/AzureFileCopyV5/Tests/L0AddAzureVMCustomScriptExtension.ps1 b/_generated/AzureFileCopyV5/Tests/L0AddAzureVMCustomScriptExtension.ps1 new file mode 100644 index 000000000000..807b1a875a4b --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0AddAzureVMCustomScriptExtension.ps1 @@ -0,0 +1,68 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Write-Telemetry { } +Register-Mock Get-TargetUriFromFwdLink { "http://externalFile" } + +# Test 1 "Should throw Resource group name is null" +Assert-Throws { + Add-AzureVMCustomScriptExtension -resourceGroupName $null -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName +} -MessagePattern "AFC_CopyPrereqsFailed *" + + +# Test 2 "Should throw when VM name is null" +Assert-Throws { + Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $null -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName +} -MessagePattern "AFC_CopyPrereqsFailed *" + +# Test 3 "should throw when VM name is invalid" +Register-Mock Get-Endpoint {} +Assert-Throws { + Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $invalidMachineName -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName +} -MessagePattern "AFC_CopyPrereqsFailed AFC_UnableToSetCustomScriptExtension *" + +# Test 4 "Should fail to provision winrm custom script extension and remove the failed extension" +$extensionName="WinRMCustomScriptExtension" +Register-Mock Set-AzureMachineCustomScriptExtension { + return Set-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName -fileUri $configWinRMScriptFile, $makeCertFile -run $invalidCustomScriptName -argument $dnsName -location $location +} -ParametersEvaluator { $run -eq $scriptToRun } + +Assert-Throws { + Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName +} -MessagePattern "AFC_CopyPrereqsFailed *" + +Assert-AreEqual 0 $vmInstanceViews[$vm0Name]["Extensions"].Count + +# Test 5 "Should fail to deploy winrm custom script extension and remove the failed extension" +$extensionName="WinRMCustomScriptExtension" +Unregister-Mock Set-AzureMachineCustomScriptExtension +Register-Mock Set-AzureMachineCustomScriptExtension { + return Set-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName -fileUri $configWinRMScriptFile, $makeCertFile -run $invalidCustomScriptName -argument $dnsName -location $location +} -ParametersEvaluator { $run -eq $scriptToRun } + +Assert-Throws { + Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName +} -MessagePattern "AFC_CopyPrereqsFailed *" + +Assert-AreEqual 0 $vmInstanceViews[$vm0Name]["Extensions"].Count + +# Test 6 "Should configure winrm successfully on target azure vm for valid Input" +Unregister-Mock Set-AzureMachineCustomScriptExtension +Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName +$tempStatus = Get-AzureMachineStatus -resourceGroupName $validRG -name $vm0Name +$tempStatus.Extensions.Statuses.DisplayStatus.Contains("Provisioning succeeded"); + +# Test 7 "Should skip configuring winrm on target azure vm" +Register-Mock Set-AzureMachineCustomScriptExtension { return $null } +Register-Mock Is-WinRMCustomScriptExtensionExists { return $true } +Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName + +Assert-WasCalled Set-AzureMachineCustomScriptExtension -Times 0 + +#Clean the extension +$vmInstanceViews[$vm0Name]["Extensions"]=@() \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0CheckContainerNameAndArgs.ps1 b/_generated/AzureFileCopyV5/Tests/L0CheckContainerNameAndArgs.ps1 new file mode 100644 index 000000000000..0b00285d6200 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0CheckContainerNameAndArgs.ps1 @@ -0,0 +1,15 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\..\Utility.ps1 + +Register-Mock Write-Warning { } + +Check-ContainerNameAndArgs -containerName '$root' -additionalArguments " --recursive " +Check-ContainerNameAndArgs -containerName '$root' -additionalArguments " --recursive --log-level=ERROR " +Check-ContainerNameAndArgs -containerName '$root' -additionalArguments " --recursive --log-level=ERROR" + +Assert-WasCalled Write-Warning -Times 3 + +Unregister-Mock Write-Warning \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0CopyFilesParallelyToAzureVMs.ps1 b/_generated/AzureFileCopyV5/Tests/L0CopyFilesParallelyToAzureVMs.ps1 new file mode 100644 index 000000000000..2f35bd2e381b --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0CopyFilesParallelyToAzureVMs.ps1 @@ -0,0 +1,34 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vmName = "myVM0" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$vmWinRMHttpsPort1 = '40001' +$vmWinRMHttpsPort2 = '40003' +$vmWinRMHttpsPort3 = '40005' +$azureVMsProperties = Get-AzureVMResourcesProperties -resourceGroupName $validRG -resourceFilteringMethod 'tags' +$azureVMCredntials = Get-AzureVMsCredentials -vmsAdminUserName $validInputVmsAdminUserName -vmsAdminPassword $validInputVmsAdminPassword + +Register-Mock ConvertTo-SecureString { return $securedMockPassword } +$invokeRemoteScriptParams = Get-InvokeRemoteScriptParameters -azureVMResourcesProperties $azureVMsProperties -networkCredentials $azureVMCredntials + +# Test 1 "Should throw if failed on one vm and passed on other vm" + +Register-Mock Invoke-RemoteScript { return $invokeRemoteScriptOnePassOneFailResponse } + +Assert-Throws { + Copy-FilesParallellyToAzureVMs -targetMachineNames $invokeRemoteScriptParams.targetMachineNames -credential $invokeRemoteScriptParams.credential -protocol $invokeRemoteScriptParams.protocol -sessionName "AFCCopyToVMs" -remoteScriptJobArguments @{} -sessionOption $invokeRemoteScriptParams.sessionOption +} -MessagePattern "AFC_ParallelCopyFailed*" + +# Test 2 "Should not throw if copy passed on both vms" + +Unregister-Mock Invoke-RemoteScript +Register-Mock Invoke-RemoteScript { return $invokeRemoteScriptAllPassedResponse } + +Copy-FilesParallellyToAzureVMs -targetMachineNames $invokeRemoteScriptParams.targetMachineNames -credential $invokeRemoteScriptParams.credential -protocol $invokeRemoteScriptParams.protocol -sessionName "AFCCopyToVMs" -remoteScriptJobArguments @{} -sessionOption $invokeRemoteScriptParams.sessionOption diff --git a/_generated/AzureFileCopyV5/Tests/L0CopyFilesSequentiallyToAzureVMs.ps1 b/_generated/AzureFileCopyV5/Tests/L0CopyFilesSequentiallyToAzureVMs.ps1 new file mode 100644 index 000000000000..5f5cdb928f8f --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0CopyFilesSequentiallyToAzureVMs.ps1 @@ -0,0 +1,30 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vmName = "myVM0" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$vmWinRMHttpsPort = '40003' +$azureVMsProperties = Get-AzureVMResourcesProperties -resourceGroupName $validRG -resourceFilteringMethod 'tags' +$azureVMCredntials = Get-AzureVMsCredentials -vmsAdminUserName $validInputVmsAdminUserName -vmsAdminPassword $validInputVmsAdminPassword + +Register-Mock ConvertTo-SecureString { return $securedMockPassword } +$invokeRemoteScriptParams = Get-InvokeRemoteScriptParameters -azureVMResourcesProperties $azureVMsProperties -networkCredentials $azureVMCredntials + +Register-Mock Invoke-RemoteScript { return $invokeRemoteScriptFailedResponse } + +# Test 1 "Should throw if failed on one vm" +Assert-Throws { + Copy-FilesSequentiallyToAzureVMs -targetMachineNames $invokeRemoteScriptParams.targetMachineNames -credential $invokeRemoteScriptParams.credential -protocol $invokeRemoteScriptParams.protocol -sessionName "AFCCopyToVMs" -remoteScriptJobArguments @{} -sessionOption $invokeRemoteScriptParams.sessionOption +} -MessagePattern "AFC_CopyFailed $vmfqdn`:$vmWinRMHttpsPort AFC_AzureFileCopyMoreHelp*" + +# Test 2 "Should not throw if copy succeded on both vms" +Unregister-Mock Invoke-RemoteScript +Register-Mock Invoke-RemoteScript { return $invokeRemoteScriptPassedResponse } + +Copy-FilesSequentiallyToAzureVMs -targetMachineNames $invokeRemoteScriptParams.targetMachineNames -credential $invokeRemoteScriptParams.credential -protocol $invokeRemoteScriptParams.protocol -sessionName "AFCCopyToVMs" -remoteScriptJobArguments @{} -sessionOption $invokeRemoteScriptParams.sessionOption \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0CopyFilesToAzureVMsFromStorageContainer.ps1 b/_generated/AzureFileCopyV5/Tests/L0CopyFilesToAzureVMsFromStorageContainer.ps1 new file mode 100644 index 000000000000..290e7b4ee467 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0CopyFilesToAzureVMsFromStorageContainer.ps1 @@ -0,0 +1,61 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\..\AzureFileCopyRemoteJob.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$azureVMsProperties = Get-AzureVMResourcesProperties -resourceGroupName $validRG -resourceFilteringMethod 'tags' +$azureVMCredntials = Get-AzureVMsCredentials -vmsAdminUserName $validInputVmsAdminUserName -vmsAdminPassword $validInputVmsAdminPassword + +Register-Mock Get-ChildItem { } + +Register-Mock Copy-FilesParallellyToAzureVMs { } +Register-Mock Copy-FilesSequentiallyToAzureVMs { } + +Register-Mock ConvertTo-SecureString { return $securedMockPassword } +$invokeRemoteScriptParams = Get-InvokeRemoteScriptParameters -azureVMResourcesProperties $azureVMsProperties -networkCredentials $azureVMCredntials + +# Test 1 "Should Call Copy-FilesParallellyToAzureVMs for parallel option" +Copy-FilesToAzureVMsFromStorageContainer -targetMachineNames $invokeRemoteScriptParams.targetMachineNames -credential $invokeRemoteScriptParams.credential ` + -protocol $invokeRemoteScriptParams.protocol ` + -sessionOption $invokeRemoteScriptParams.sessionOption ` + -blobStorageEndpoint $validBlobStorageEndpoint ` + -containerName $validInputContainerName ` + -containerSasToken $validSasToken ` + -targetPath $validInputTargetPath ` + -cleanTargetBeforeCopy $false ` + -copyFilesInParallel $true ` + -additionalArguments "" ` + -azCopyToolLocation "AzCopy" ` + -fileCopyJobScript $AzureFileCopyRemoteJob ` + -enableDetailedLogging $false + + +Assert-WasCalled Copy-FilesParallellyToAzureVMs -Times 1 +Assert-WasCalled Copy-FilesSequentiallyToAzureVMs -Times 0 + + +# Test 2 "should call Copy-FilesSequentiallyToAzureVMs for sequential option" +Copy-FilesToAzureVMsFromStorageContainer -targetMachineNames $invokeRemoteScriptParams.targetMachineNames -credential $invokeRemoteScriptParams.credential ` + -protocol $invokeRemoteScriptParams.protocol ` + -sessionOption $invokeRemoteScriptParams.sessionOption ` + -blobStorageEndpoint $validBlobStorageEndpoint ` + -containerName $validInputContainerName ` + -containerSasToken $validSasToken ` + -targetPath $validInputTargetPath ` + -cleanTargetBeforeCopy $false ` + -copyFilesInParallel $false ` + -additionalArguments "" ` + -azCopyToolLocation "AzCopy" ` + -fileCopyJobScript $AzureFileCopyRemoteJob ` + -enableDetailedLogging $false + + +Unregister-Mock Copy-FilesParallellyToAzureVMs +Register-Mock Copy-FilesParallellyToAzureVMs { } + +Assert-WasCalled Copy-FilesParallellyToAzureVMs -Times 0 +Assert-WasCalled Copy-FilesSequentiallyToAzureVMs -Times 1 \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0DoesAzureVMMatchTagFilter.ps1 b/_generated/AzureFileCopyV5/Tests/L0DoesAzureVMMatchTagFilter.ps1 new file mode 100644 index 000000000000..a9debca28daa --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0DoesAzureVMMatchTagFilter.ps1 @@ -0,0 +1,33 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Write-Telemetry { } +Register-Mock Switch-AzureMode { } + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG +$azureVMResource1 = $azureRMVMResources[0] +$validTagFilterForVMResource1 = "role:test" +$azureVMResource2 = $azureRMVMResources[1] + +# Test 1 "should return true if vm match tag filter criteria with case insensitive check" +$vmMatchFilterCriteria = Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource1 -filter "Role:TEST, Test1" +Assert-AreEqual $true $vmMatchFilterCriteria + +# Test 2 "should return true if vm match tag filter criteria with same tag repeated twice" +$vmMatchFilterCriteria = Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource2 -filter "OS:win8, win9; Role:myTEST, MYTest, Test1" +Assert-AreEqual $true $vmMatchFilterCriteria + +# Test 3 "should return false if vm does not match tag filter criteria" +$vmMatchFilterCriteria = Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource2 -filter "OS:win8, win9; Role:Test5, Test2, Test1" +Assert-AreEqual $false $vmMatchFilterCriteria + +# Test 4 "Should throw if invalid tag filter format" +Assert-Throws { + Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource2 -filter "OS:win8 : win9; Role:myTEST, MYTest, Test1" +} -MessagePattern "AFC_IncorrectTags" \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0GetAzureUtility.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetAzureUtility.ps1 new file mode 100644 index 000000000000..63e805152ca2 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetAzureUtility.ps1 @@ -0,0 +1,26 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +$azModule100 = New-Object -TypeName System.Version -ArgumentList "1.0.0" +$connectedServiceName = "DummyConnectedServiceName" + +Register-Mock Get-TypeOfConnection { return "ServicePrincipal"} + +. $PSScriptRoot\..\Utility.ps1 + +#Test 1 "Should return AzureUtilityAz1.0.ps1 if Az module is installed" +Register-Mock Get-Module { return $azModule100 } +$azureUtilityFile = Get-AzureUtility +Assert-AreEqual $azureUtilityFile "AzureUtilityAz1.0.ps1" + +#Test 2 "Should return AzureUtilityARM.ps1 Az module is not installed" +Unregister-Mock Get-Module +Register-Mock Get-Module { return } +$azureUtilityFile = Get-AzureUtility -connectedServiceName $connectedServiceName +if ($featureFlags.retireAzureRM) { + Assert-AreEqual $azureUtilityFile "AzureUtilityAz1.0.ps1" +} else { + Assert-AreEqual $azureUtilityFile "AzureUtilityARM.ps1" +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0GetAzureVMResourcesProperties.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetAzureVMResourcesProperties.ps1 new file mode 100644 index 000000000000..da1b2c8d3d87 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetAzureVMResourcesProperties.ps1 @@ -0,0 +1,31 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Write-Telemetry { } + +# Test 1 "should throw if no azurevm resources" +Assert-Throws { + Get-AzureVMResourcesProperties -resourceGroupName $rgWithNoVM -resourceFilteringMethod 'tags' +} -MessagePattern "AFC_NoARMVMResources*" + +# Test 2 "should return azureVM resources if valid input given" +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vmName = "myVM0" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$vmWinRMHttpsPort = '40001' + +$response = Get-AzureVMResourcesProperties -resourceGroupName $validRG -resourceFilteringMethod 'tags' + +Assert-IsNotNullOrEmpty $response +Assert-AreEqual 3 $response.Count + +$resource = $response[$vmName] + +Assert-AreEqual $vmName $resource.Name +Assert-AreEqual $vmfqdn $resource.fqdn +Assert-AreEqual $vmWinRMHttpsPort $resource.winRMHttpsPort \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0GetAzureVMsCredentials.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetAzureVMsCredentials.ps1 new file mode 100644 index 000000000000..584df180c0a8 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetAzureVMsCredentials.ps1 @@ -0,0 +1,16 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$userName = "userName" +$password = "password" + +# Test 1 "Should return System.Net.NetworkCredential with valid values" +$result = Get-AzureVMsCredentials -vmsAdminUserName $userName -vmsAdminPassword $password +Assert-AreEqual "System.Net.NetworkCredential" $result.GetType().FullName +Assert-AreEqual $userName $result.userName +Assert-AreEqual $password $result.Password \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0GetFilteredAzureRMVmsInResourceGroup.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetFilteredAzureRMVmsInResourceGroup.ps1 new file mode 100644 index 000000000000..73674a2f40d7 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetFilteredAzureRMVmsInResourceGroup.ps1 @@ -0,0 +1,19 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG + +Register-Mock Get-FilteredAzureVMsInResourceGroup {} + +# Test 1 "should call Get-FilteredAzureVMsInResourceGroup with proper paramters" +Get-FilteredAzureRMVMsInResourceGroup -azureRMVMResources $azureRMVMResources -resourceFilteringMethod "tags" -filter "" +Assert-WasCalled Get-FilteredAzureVMsInResourceGroup -Times 1 -ParametersEvaluator { + $resourceFilteringMethod -eq "tags"-and $filter -eq "" -and $azureVMResources.Count -eq $azureRMVMResources.Count +} diff --git a/_generated/AzureFileCopyV5/Tests/L0GetFilteredAzureVmsInResourceGroup.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetFilteredAzureVmsInResourceGroup.ps1 new file mode 100644 index 000000000000..987c1cbe2fac --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetFilteredAzureVmsInResourceGroup.ps1 @@ -0,0 +1,27 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Write-Telemetry {} + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG + +# Test 1 "should call tag filter if machineNames filter selected and no filter provided" +$filteredAzureVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureRMVMResources -resourceFilteringMethod "machineNames" -filter "" +Assert-AreEqual 3 $filteredAzureVMResources.Count + +# Test 2 "should call tag filter when tags filter selected and non-empty filter provided" +$filteredAzureVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureRMVMResources -resourceFilteringMethod "tags" -filter "role:web" +Assert-AreEqual 0 $filteredAzureVMResources.Count + +Register-Mock Get-MachineBasedFilteredAzureVMs { } + +# Test 3 "should call Get-MachineBasedFilteredAzureVMs for machineNames filter with non-empty filter" +$filteredAzureVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureRMVMResources -resourceFilteringMethod "machineNames" -filter "vm0" +Assert-AreEqual 0 $filteredAzureVMResources.Count diff --git a/_generated/AzureFileCopyV5/Tests/L0GetFrontEndPorts.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetFrontEndPorts.ps1 new file mode 100644 index 000000000000..3a5fd3bcaa77 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetFrontEndPorts.ps1 @@ -0,0 +1,34 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$winrmPort1 = "40001" +$winrmPort2 = "40003" +$winrmPort3 = "40005" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG +$azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetails -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources +$networkInterfaceResources = $azureRGResourcesDetails["networkInterfaceResources"] +$publicIPAddressResources = $azureRGResourcesDetails["publicIPAddressResources"] +$loadBalancerResources = $azureRGResourcesDetails["loadBalancerResources"] + +# Test 1 "It should valid portList if RG deployed successfully" +[hashtable]$winRMHttpsPortMap = @{} +foreach($lbName in $loadBalancerResources.Keys){ + $lbDetails = $loadBalancerResources[$lbName] + $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"] + $inboundRules = $lbDetails["inboundRules"] + $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources -inboundRules $inboundRules + + Assert-AreEqual $true $winRMHttpsPortMap.ContainsKey($azureRMVMResources[0].Id) + Assert-AreEqual $winrmPort1 $winRMHttpsPortMap[$azureRMVMResources[0].Id] + + Assert-AreEqual $true $winRMHttpsPortMap.ContainsKey($azureRMVMResources[1].Id) + Assert-AreEqual $winrmPort2 $winRMHttpsPortMap[$azureRMVMResources[1].Id] +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0GetMachineBasedFilteredAzureVMs.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetMachineBasedFilteredAzureVMs.ps1 new file mode 100644 index 000000000000..694e04918a38 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetMachineBasedFilteredAzureVMs.ps1 @@ -0,0 +1,30 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Write-Telemetry {} + +$rgWithClassicVMs = "taskplatformtesttwovm" +$classicvm0 = "vm0" +$classicvm1 = "VM1" +$azureClassicVMResources = Get-AzureClassicVMsInResourceGroup -resourceGroupName $rgWithClassicVMs + +# Test 1 "should return all vms corresponding to filter with case insensitive check" +$filteredAzureVMResources = Get-MachineBasedFilteredAzureVMs -azureVMResources $azureClassicVMResources -resourceFilteringMethod "machineNames" -filter "vM0, Vm1" +Assert-AreEqual 2 $filteredAzureVMResources.Count + +# Test 2 "should return only one vm corresponding to its filter even if filter is repeated more than once" +$filteredAzureVMResources = Get-MachineBasedFilteredAzureVMs -azureVMResources $azureClassicVMResources -resourceFilteringMethod "machineNames" -filter "vM0, VM0, vm0" +Assert-AreEqual 1 $filteredAzureVMResources.Count + +$nonExistingFilter = "vm2" + +# Test 3 "Should throw if for any filter there is not corresponding vm" +Assert-Throws { + $filteredAzureVMResources = Get-MachineBasedFilteredAzureVMs -azureVMResources $azureClassicVMResources -resourceFilteringMethod "machineNames" -filter "$nonExistingFilter, Vm1" +} -MessagePattern "AFC_MachineDoesNotExist vm2" diff --git a/_generated/AzureFileCopyV5/Tests/L0GetMachineNameFromId.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetMachineNameFromId.ps1 new file mode 100644 index 000000000000..8e47c1e82e23 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetMachineNameFromId.ps1 @@ -0,0 +1,91 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vm0Name = "myVM0" +$vm1Name = "mytestVM0" +$vm2Name = "mytestPTVM0" +$winrmPort1 = "40001" +$winrmPort2 = "40003" +$winrmPort3 = "40005" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG +$azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetails -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources +$networkInterfaceResources = $azureRGResourcesDetails["networkInterfaceResources"] +$publicIPAddressResources = $azureRGResourcesDetails["publicIPAddressResources"] +$loadBalancerResources = $azureRGResourcesDetails["loadBalancerResources"] + +[hashtable]$fqdnMap = @{} +[hashtable]$winRMHttpsPortMap = @{} +foreach($lbName in $loadBalancerResources.Keys) +{ + $lbDetails = $loadBalancerResources[$lbName] + $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"] + $inboundRules = $lbDetails["inboundRules"] + + $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $validRG -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap + $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources -inboundRules $inboundRules +} +# Test 1 "should create valid map for map parameter FQDN" +$fqdnMap = Get-MachineNameFromId -resourceGroupName $validRG -Map $fqdnMap -MapParameter "FQDN" -azureRMVMResources $azureRMVMResources -ThrowOnTotalUnavaialbility $true + +Assert-AreEqual $true $fqdnMap.ContainsKey($vm0Name) +Assert-AreEqual $vmfqdn $fqdnMap[$vm0Name] +Assert-AreEqual $true $fqdnMap.ContainsKey($vm1Name) + +# Test 2 "should create valid map for map parameter Front End port" +$winRMHttpsPortMap = Get-MachineNameFromId -Map $winRMHttpsPortMap -MapParameter "Front End port" -azureRMVMResources $azureRMVMResources -ThrowOnTotalUnavaialbility $false + +Assert-AreEqual $true $winRMHttpsPortMap.ContainsKey($vm0Name) +Assert-AreEqual $winrmPort1 $winRMHttpsPortMap[$vm0Name] +Assert-AreEqual $true $winRMHttpsPortMap.ContainsKey($vm1Name) +Assert-AreEqual $winrmPort2 $winRMHttpsPortMap[$vm1Name] + + +# Test 3 "It should return partial map if for not all resources map is not configured properly" + +[hashtable]$fqdnMap = @{} +[hashtable]$winRMHttpsPortMap = @{} +foreach($lbName in $loadBalancerResources.Keys) +{ + $lbDetails = $loadBalancerResources[$lbName] + $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"] + $inboundRules = $lbDetails["inboundRules"] + + $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $validRG -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap + $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources -inboundRules $inboundRules +} +$fqdnMap.Remove($azureRMVMResources[0].Id) + +$fqdnMap = Get-MachineNameFromId -resourceGroupName $validRG -Map $fqdnMap -MapParameter "FQDN" -azureRMVMResources $azureRMVMResources -ThrowOnTotalUnavaialbility $true + +Assert-AreEqual $false $fqdnMap.ContainsKey($vm0Name) +Assert-AreEqual $true $fqdnMap.ContainsKey($vm1Name) +Assert-AreEqual $vmfqdn $fqdnMap[$vm1Name] + +# Test 4 "throw error if no resource is available and ThrowOnTotalUnavailability is set to true" + +[hashtable]$fqdnMap = @{} +[hashtable]$winRMHttpsPortMap = @{} +foreach($lbName in $loadBalancerResources.Keys) +{ + $lbDetails = $loadBalancerResources[$lbName] + $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"] + $inboundRules = $lbDetails["inboundRules"] + + $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $validRG -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap + $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources -inboundRules $inboundRules +} +$fqdnMap.Remove($azureRMVMResources[0].Id) +$fqdnMap.Remove($azureRMVMResources[1].Id) +$fqdnMap.Remove($azureRMVMResources[2].Id) + +Assert-Throws { + $fqdnMap = Get-MachineNameFromId -resourceGroupName $validRG -Map $fqdnMap -MapParameter "FQDN" -azureRMVMResources $azureRMVMResources -ThrowOnTotalUnavailability $true +} -MessagePattern "AFC_MachineNameFromIdErrorAllResources*" diff --git a/_generated/AzureFileCopyV5/Tests/L0GetMachinesFqdnForLB.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetMachinesFqdnForLB.ps1 new file mode 100644 index 000000000000..df9b520cca4d --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetMachinesFqdnForLB.ps1 @@ -0,0 +1,31 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG +$azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetails -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources +$networkInterfaceResources = $azureRGResourcesDetails["networkInterfaceResources"] +$publicIPAddressResources = $azureRGResourcesDetails["publicIPAddressResources"] +$loadBalancerResources = $azureRGResourcesDetails["loadBalancerResources"] +[hashtable]$fqdnMap = @{} + +# Test 1 "It should valid fqdnMap if RG deployed successfully" +foreach($lbName in $loadBalancerResources.Keys) { + $lbDetails = $loadBalancerResources[$lbName] + $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"] + $inboundRules = $lbDetails["inboundRules"] + $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $validRG -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap + + Assert-AreEqual $true $fqdnMap.ContainsKey($azureRMVMResources[0].Id) + Assert-AreEqual $vmfqdn $fqdnMap[$azureRMVMResources[0].Id] + + Assert-AreEqual $true $fqdnMap.ContainsKey($azureRMVMResources[1].Id) + Assert-AreEqual $vmfqdn $fqdnMap[$azureRMVMResources[1].Id] +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0GetRMVMConnectionDetailsInRG.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetRMVMConnectionDetailsInRG.ps1 new file mode 100644 index 000000000000..a0f6f135b012 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetRMVMConnectionDetailsInRG.ps1 @@ -0,0 +1,36 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vmName = "myVM0" +$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com" +$vmWinRMHttpsPort = '40001' +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG + +# Test 1 "It should return azure vm connection details for valid input" +$response = Get-AzureRMVMsConnectionDetailsInResourceGroup -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources + +Assert-IsNotNullOrEmpty $response +Assert-AreEqual 3 $response.Count + +$resource = $response[$vmName] + +Assert-AreEqual $vmName $resource.Name +Assert-AreEqual $vmfqdn $resource.fqdn +Assert-AreEqual $vmWinRMHttpsPort $resource.winRMHttpsPort + +#Test 2 "It should return null if no azure vms" +$response = Get-AzureRMVMsConnectionDetailsInResourceGroup -resourceGroupName $validRG -azureRMVMResources $null + +Assert-IsNullOrEmpty $response + +$response = Get-AzureRMVMsConnectionDetailsInResourceGroup -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources -connectedServiceName "connectedServiceName" +Assert-IsNotNullOrEmpty $response +Assert-AreEqual 3 $response.Count + diff --git a/_generated/AzureFileCopyV5/Tests/L0GetStorageAccountType.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetStorageAccountType.ps1 new file mode 100644 index 000000000000..8b971336536a --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetStorageAccountType.ps1 @@ -0,0 +1,17 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Validate-AzurePowershellVersion {} +Register-Mock Write-Telemetry { } + +$invalidRGStorage = "invalidRGStorage" + +# Test 1 "Should throw if Blob storage not found" +Assert-Throws { + Get-StorageAccountType -storageAccountName $invalidRGStorage -endpoint @{} +} -MessagePattern "Storage account: $invalidRGStorage not found." diff --git a/_generated/AzureFileCopyV5/Tests/L0GetStorageKey.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetStorageKey.ps1 new file mode 100644 index 000000000000..9f1542d45d45 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetStorageKey.ps1 @@ -0,0 +1,16 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Validate-AzurePowershellVersion {} +Register-Mock Write-Telemetry { } + +# Test 1 "should throw if storage not found" +$invalidRGStorage = "invalidRGStorage" +Assert-Throws { + Get-StorageKey -storageAccountName $invalidRGStorage -endpoint @{} +} -MessagePattern "Storage account: $invalidRGStorage not found. Selected Connection 'ServicePrincipal' supports storage account of Azure Resource Manager type only." diff --git a/_generated/AzureFileCopyV5/Tests/L0GetTagBasedFilteredAzureVMs.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetTagBasedFilteredAzureVMs.ps1 new file mode 100644 index 000000000000..66522f4d90fb --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetTagBasedFilteredAzureVMs.ps1 @@ -0,0 +1,22 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$vm0Name = "myVM0" +$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG + +# Test 1 "Should Call Does-AzureVMMatchTagFilterCriteria for every VM for filter criteria" +$filteredAzureVMResources = Get-TagBasedFilteredAzureVMs -azureVMResources $azureRMVMResources -filter "role:web" + +#Assert-WasCalled Does-AzureVMMatchTagFilterCriteria -Times $azureRMVMResources.Count -ParametersEvaluator {$filter -eq "role:web"} + +# Test 2 "Should return VMs that matches tag filter criteria" +$filteredAzureVMResources = Get-TagBasedFilteredAzureVMs -azureVMResources $azureRMVMResources -filter "role:test" + +Assert-AreEqual $vm0Name $filteredAzureVMResources.Name \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0GetblobStorageEndpoint.ps1 b/_generated/AzureFileCopyV5/Tests/L0GetblobStorageEndpoint.ps1 new file mode 100644 index 000000000000..fa7039d34934 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0GetblobStorageEndpoint.ps1 @@ -0,0 +1,17 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +Register-Mock Validate-AzurePowershellVersion {} +Register-Mock Write-Telemetry { } + +$invalidRGStorage = "invalidRGStorage" + +# Test 1 "Should throw if Blob storage not found" +Assert-Throws { + Get-blobStorageEndpoint -storageAccountName $invalidRGStorage -endpoint @{} +} -MessagePattern "Unable to find storage type $invalidRGStorage with Connection SPN" \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0IsWinRMCustomScriptExtensionExists.ps1 b/_generated/AzureFileCopyV5/Tests/L0IsWinRMCustomScriptExtensionExists.ps1 new file mode 100644 index 000000000000..32e300406ed5 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0IsWinRMCustomScriptExtensionExists.ps1 @@ -0,0 +1,61 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$extensionName="WinRMCustomScriptExtension" + +# Test 1 "Should not throw when Resource group us null" +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $null -vmName $vm0Name -extensionName $extensionName -connectedServiceName $connectedServiceName +Assert-AreEqual $false $isExtensionExists + +# Test 2 "Should not throw when VM name is null" +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $null -extensionName $extensionName -connectedServiceName $connectedServiceName +Assert-AreEqual $false $isExtensionExists + +# Test 3 "Should not throw when VM name is invalid" +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $invalidMachineName -extensionName $extensionName -connectedServiceName $connectedServiceName +Assert-AreEqual $false $isExtensionExists + +# Test 4 "Should not throw Extension name is null" +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $null -connectedServiceName $connectedServiceName +Assert-AreEqual $false $isExtensionExists + +# Test 5 "Should not throw when Extension name is invalid" +$invalidExtensionName="InvalidWinRMCustomScriptExtension" + +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $invalidExtensionName -connectedServiceName $connectedServiceName +Assert-AreEqual $false $isExtensionExists + +# Test 6 "Should return true for valid values, if previous extension deployed successfully" +Register-Mock Get-AzureMachineCustomScriptExtension { return @{"ProvisioningState"="Succeeded"} } +Register-Mock Validate-CustomScriptExecutionStatus { return } +Register-Mock Remove-AzureMachineCustomScriptExtension { return @{}} +Register-Mock Get-Endpoint {} + +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName -connectedServiceName $connectedServiceName +Assert-AreEqual $true $isExtensionExists +Assert-WasCalled Get-AzureMachineCustomScriptExtension -Times 1 +Assert-WasCalled Validate-CustomScriptExecutionStatus -Times 1 +Assert-WasCalled Remove-AzureMachineCustomScriptExtension -Times 0 + +# Test 7 "Should return false For valid values, if previous extension failed to deploy" +Unregister-Mock Validate-CustomScriptExecutionStatus +Register-Mock Validate-CustomScriptExecutionStatus { throw "error" } + +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName -connectedServiceName $connectedServiceName + +Assert-AreEqual $false $isExtensionExists +Assert-WasCalled Validate-CustomScriptExecutionStatus -Times 1 + +# Test 8 "Should return false For valid values, if previous extension failed to provision" +Unregister-Mock Get-AzureMachineCustomScriptExtension +Register-Mock Get-AzureMachineCustomScriptExtension { return @{properties=@{ProvisioningState="Failed"}} } + +$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName -connectedServiceName $connectedServiceName + +Assert-AreEqual $false $isExtensionExists +Assert-WasCalled Get-AzureMachineCustomScriptExtension -Times 2 diff --git a/_generated/AzureFileCopyV5/Tests/L0UploadFilesToAzureContainer.ps1 b/_generated/AzureFileCopyV5/Tests/L0UploadFilesToAzureContainer.ps1 new file mode 100644 index 000000000000..de01045f682b --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0UploadFilesToAzureContainer.ps1 @@ -0,0 +1,38 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 + +$invalidInputStorageAccount = "invalidInputStorageAccount" +$exceptionMessage = "Exception thrown" + +Register-Mock Write-Telemetry { } +Register-Mock Test-Path { return $true } -ParametersEvaluator { $Path -eq "c:\foo\bar" } +Register-Mock Test-Path { return $false } -ParametersEvaluator { $Path -eq $validInputSourcePath } +Register-Mock Get-VstsTaskVariable { return 'c:\foo\bar' } +Register-Mock Protect-ScriptArguments { return @() } + +# Test 1 "Should throw if Invoke-Expression fails" at time of azcopy login +Register-Mock Invoke-Expression { throw $exceptionMessage } + +Assert-Throws { + Upload-FilesToAzureContainer -sourcePath $validInputSourcePath -endPoint $spnEndpoint -storageAccountName $invalidInputStorageAccount -containerName $validInputContainerName ` + -blobPrefix $validInputBlobPrefix -blobStorageEndpoint $validBlobStorageEndpoint -azCopyLocation $validAzCopyLocation -destinationType $validInputAzureBlobDestinationType ` + -containerSasToken $validSasToken +} -MessagePattern "*ServicePrincipalError*" + +Unregister-Mock Invoke-Expression + +# Test 2 "Should throw and delete container if destination azureVM" +Register-Mock Remove-AzureContainer { } +Register-Mock Invoke-Expression { } -ParametersEvaluator {$command -eq "login" } +Register-Mock Invoke-Expression { throw $exceptionMessage } -ParametersEvaluator {$command -eq "copy" } + +Assert-Throws { + Upload-FilesToAzureContainer -sourcePath $validInputSourcePath -endPoint $spnEndpoint -storageAccountName $invalidInputStorageAccount -containerName $validInputContainerName ` + -blobPrefix $validInputBlobPrefix -azCopyLocation $validAzCopyLocation -destinationType $validInputAzureVmsDestinationType -containerSasToken $validSasToken +} -MessagePattern "*AFC_UploadContainerStorageAccount*invalidInputStorageAccount*" + +Assert-WasCalled Remove-AzureContainer -Times 1 \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/L0UtilityThrowError.ps1 b/_generated/AzureFileCopyV5/Tests/L0UtilityThrowError.ps1 new file mode 100644 index 000000000000..0736af738f66 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0UtilityThrowError.ps1 @@ -0,0 +1,12 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 + + $exceptionMessage = "Exception thrown" + +Assert-Throws { + ThrowError -errorMessage $exceptionMessage +} -MessagePattern "$exceptionMessage AFC_AzureFileCopyMoreHelp https://aka.ms/azurefilecopyreadme" diff --git a/_generated/AzureFileCopyV5/Tests/L0ValidateAzurePSVersion.ps1 b/_generated/AzureFileCopyV5/Tests/L0ValidateAzurePSVersion.ps1 new file mode 100644 index 000000000000..399a7e12f364 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0ValidateAzurePSVersion.ps1 @@ -0,0 +1,26 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 + +. $PSScriptRoot\..\Utility.ps1 + +$lowerThanMinimumAzureVersion = New-Object -TypeName System.Version -ArgumentList "0.8.8" +$minimumAzureVersion = New-Object -TypeName System.Version -ArgumentList "1.1.0" +$greaterThanMinimumAzureVersion = New-Object -TypeName System.Version -ArgumentList "2.0.0" + +Register-Mock Get-AzureCmdletsVersion { return $lowerThanMinimumAzureVersion } +Register-Mock Write-Telemetry +Register-Mock Get-Module + +#Test 1 "Should throw if lower azureps version" +Assert-Throws { + Validate-AzurePowershellVersion +} -MessagePattern "*AFC_AzurePSNotInstalled*" + +#Test 2 "Should throw if lower azureps version" +Unregister-Mock Get-AzureCmdletsVersion +Register-Mock Get-AzureCmdletsVersion { return $greaterThanMinimumAzureVersion } + +Validate-AzurePowershellVersion +Assert-WasCalled -Times 1 Get-AzureCmdletsVersion diff --git a/_generated/AzureFileCopyV5/Tests/L0ValidateCustomScriptExecutionStatus.ps1 b/_generated/AzureFileCopyV5/Tests/L0ValidateCustomScriptExecutionStatus.ps1 new file mode 100644 index 000000000000..87807e415b4c --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/L0ValidateCustomScriptExecutionStatus.ps1 @@ -0,0 +1,66 @@ +[CmdletBinding()] +param() + +. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +. $PSScriptRoot\MockVariable.ps1 +. $PSScriptRoot\..\Utility.ps1 +. $PSScriptRoot\MockHelper.ps1 + +$extensionName="WinRMCustomScriptExtension" + +# Test 1 "Should throw Resource group name is null" +Assert-Throws { + $response = Validate-CustomScriptExecutionStatus -resourceGroupName $null -vmName $vm0Name -extensionName $extensionName +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" + +# Test 2 "Should throw when VM name is null" +Assert-Throws { + $response = Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $null -extensionName $extensionName +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" + + +# Test 3 "Should throw when VM name is invalid" +Assert-Throws { + $response = Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $invalidMachineName -extensionName $extensionName +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" + +# Test 4 "Should throw Extension name is null" +Assert-Throws { + $response = Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $null +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" + +# Test 5 "should throw when Extension name is invalid" +$invalidExtensionName="InvalidWinRMCustomScriptExtension" +Assert-Throws { + $response = Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $invalidExtensionName +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" + +# Test 6 "Should not throw" "For valid values, if previous extension deployed successfully" +Register-Mock Remove-AzureMachineCustomScriptExtension { return @{}} +$vmInstanceViews[$vm0Name]["Extensions"]=$extensions + +Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName +Assert-WasCalled Remove-AzureMachineCustomScriptExtension -Times 0 + +# Test 7 "Should throw for valid values, if previous extension failed to deploy" +$extensions[0]["SubStatuses"][1]["Message"]="Extension script execution failed." +$vmInstanceViews[$vm0Name]["Extensions"]=$extensions + +Assert-Throws { + Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" +Assert-WasCalled Remove-AzureMachineCustomScriptExtension -Times 1 + +# Test 8 "For valid values, if previous extension failed to provision" +Unregister-Mock Remove-AzureMachineCustomScriptExtension +Register-Mock Remove-AzureMachineCustomScriptExtension { return @{}} +$extensions[0]["SubStatuses"][1]["Message"]="Failed to apply the extension." +$vmInstanceViews[$vm0Name]["Extensions"]=$extensions + +Assert-Throws { + Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName +} -MessagePattern "AFC_SetCustomScriptExtensionFailed *" +Assert-WasCalled Remove-AzureMachineCustomScriptExtension -Times 1 + +#Clean the extension +$vmInstanceViews[$vm0Name]["Extensions"]=@() diff --git a/_generated/AzureFileCopyV5/Tests/MockHelper.ps1 b/_generated/AzureFileCopyV5/Tests/MockHelper.ps1 new file mode 100644 index 000000000000..0a777d124974 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/MockHelper.ps1 @@ -0,0 +1,653 @@ +############## Constants ########## +$invalidParam = "invalidParam" +$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete" +$rgWithNoVM = "AzureFIleCopyPTRGNoVMDoNotDelete" +$rgNameWithSecurityGroup = "AzureFIleCopyPTRGWithSGDoNotDelete" +$validStorage = "azurefilecopyptsstore" +$validStorageKey = "validStorageKey" +$storageAccounts = @{} +$storageAccounts.Add($validStorage, $validStorageKey) +$validClassicStorage = "ptclassicstoredontdelete" +$validClassicStorageKey = "validClassicStorageKey" +$storageAccounts.Add($validClassicStorage, $validClassicStorageKey) + +$storageAccountsRG = @{} +$storageAccountsRG.Add($validStorage, $validRG) +$storageAccountsRG.Add($validClassicStorage, $validClassicStorageKey) + +$storageAccountsContext = @{} +$storageAccountContext = @{} +$storageAccountContext.StorageAccountName = $validStorage +$storageAccountsContext.Add($validStorage, $storageAccountContext) + +$validSasToken = 'anyValidSaasToken' + +$location = "West US" +$vm0Name = "myVM0" +$vm1Name = "mytestVM0" +$vm2Name = "mytestPTVM1" +$lbName = "myLB" +$classicvmfqdn = "taskplatformtesttwovm.cloudapp.net" +$rgWithNoClassicVms = "taskplatformtestnovm" +$rgWithClassicVMs = "taskplatformtesttwovm" +$classicvm0 = "vm0" +$classicvm1 = "VM1" +$azurevmFqdn = "azurefilecopyplatformtestsdns.westus.cloudapp.azure.com" +$winrmPort1 = "40001" +$winrmPort2 = "40003" +$winrmPort3 = "40005" +$classicWinrmPort1 = "5986" +$classicWinrmPort2 = "57148" +$classicWinrmPort3 = "57149" + +# creating resourcegroups dictionary +$resourceGroups = @{} +$resourceGroup = @{} +$resourceGroup.ResourceGroupName = $validRG +$resourceGroup.Location = $location +$resourceGroups.Add($validRG, $resourceGroup) + +$resourceGroup.ResourceGroupName = $rgWithNoVM +$resourceGroups.Add($rgWithNoVM, $resourceGroup) +$resourceGroup.ResourceGroupName = $rgWithNoClassicVms +$resourceGroups.Add($rgWithNoClassicVms, $resourceGroup) + +$validActionResponse = @{"Status" = "Succeeded"} +$VMsStatus = @{$vm0Name = "Running"; $vm1Name = "Running";$vm2Name = "Running"} + +$resourceGroups[$validRG].VMsDetails = $VMsStatus + +$vmInstanceView = @{"Statuses" = @(@{"DisplayStatus" = "Provisioning succeeded"},@{"DisplayStatus" = "VM running"}); "Extensions" = @(); "VMAgent" = @{"ExtensionHandlers" = @()}} +$vmInstanceViews = @{$vm0Name = $vmInstanceView; $vm1Name = $vmInstanceView ; $vm2Name = $vmInstanceView} +$vmResources = @(@{"Id" = "Microsoft.Compute/virtualMachines/myVM0"; "Name" = $vm0Name; "Location" = $location; "Tags" = @{"role" = "Test"}}, @{"Id" = "Microsoft.Compute/virtualMachines/mytestVM0"; "Name" = $vm1Name; "Location" = $location; "Tags" = @{"role" = "mytest"}} , @{"Id" = "Microsoft.Compute/virtualMachines/mytestPTVM1"; "Name" = $vm2Name; "Location" = $location; "Tags" = @{"role" = "mytestPT"}}) + +$virtualMachine1 = @{"Id" = "Microsoft.Compute/virtualMachines/myVM0"} +$IpConfigurations1 = @(@{"Name" = "ipconfig1"; "Id" = "Microsoft.Network/networkInterfaces/nic0/ipConfigurations/ipconfig1"; "LoadBalancerInboundNatRules" = @(@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/RDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/WINRM-VM0"})}) +$networkInterface1 = @{"Name" = "nic0"; "VirtualMachine" = $virtualMachine1; "IpConfigurations" = $IpConfigurations1} + +$virtualMachine2 = @{"Id" = "Microsoft.Compute/virtualMachines/mytestVM0"} +$IpConfigurations2 = @(@{"Name" = "ipconfig2"; "Id" = "Microsoft.Network/networkInterfaces/nicN0/ipConfigurations/ipconfig2"; "LoadBalancerInboundNatRules" = @(@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NRDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NWINRM-VM0"})}) +$networkInterface2 = @{"Name" = "nicN0"; "Id" = "Microsoft.Network/networkInterfaces/nicN0"; "VirtualMachine" = $virtualMachine2; "IpConfigurations" = $IpConfigurations2} + +$virtualMachine3 = @{"Id" = "Microsoft.Compute/virtualMachines/mytestPTVM1"} +$IpConfigurations3 = @(@{"Name" = "ipconfig3"; "Id" = "Microsoft.Network/networkInterfaces/mytestptvm0456/ipConfigurations/ipconfig3"; "LoadBalancerInboundNatRules" = @(@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MRDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MWINRM-VM0"})}) +$networkInterface3 = @{"Name" = "mytestptvm0456"; "Id" = "Microsoft.Network/networkInterfaces/mytestptvm0456"; "VirtualMachine" = $virtualMachine3; "IpConfigurations" = $IpConfigurations3} + +$networkInterfaceResources = @($networkInterface1, $networkInterface2,$networkInterface3) + +$IpConfiguration3 = @{"Id" = "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontend"} +$publicIPAddressResources = @(@{"Name" = "myPublicIP"; "Id" = "Microsoft.Network/publicIPAddresses/myPublicIP"; "IpConfiguration" = $IpConfiguration3; "IpAddress" = "40.118.129.77"; "DnsSettings" = @{"Fqdn" = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com"}},@{"Name" = "myTestPTVM0"; "Id" = "Microsoft.Network/publicIPAddresses/myTestPTVM0"; "IpConfiguration" = $IpConfiguration3; "IpAddress" = "13.91.111.214"; "DnsSettings" = @{"Fqdn" = "lbipeca3f178ce794301af12.westus.cloudapp.azure.com"}}) + +$inboundNatRules = @(@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/RDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/RDP-VM1"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/WINRM-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/WINRM-VM1"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NRDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NRDP-VM1"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NWINRM-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NWINRM-VM1"},@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MRDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MRDP-VM1"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MWINRM-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MWINRM-VM1"}) +$frontEndIPConfigs = @(@{"Name" = "LoadBalancerFrontend"; "PublicIpAddress" = @{"Id" = "Microsoft.Network/publicIPAddresses/myPublicIP"}; "InboundNatRules" = $inboundNatRules}) + +$inboundRule1 = @{"Name" = "RDP-VM0"; "FrontendPort" = "50001"; "BackendPort" = "3389"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/nic0/ipConfigurations/ipconfig1"}} +$inboundRule2 = @{"Name" = "RDP-VM1"; "FrontendPort" = "50002"; "BackendPort" = "3389"; "BackendIPConfiguration" = $null} +$inboundRule3 = @{"Name" = "WINRM-VM0"; "FrontendPort" = $winrmPort1; "BackendPort" = "5986"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/nic0/ipConfigurations/ipconfig1"}} +$inboundRule4 = @{"Name" = "WINRM-VM1"; "FrontendPort" = "40002"; "BackendPort" = "5986"; "BackendIPConfiguration" = $null} +$inboundRule5 = @{"Name" = "NRDP-VM0"; "FrontendPort" = "50003"; "BackendPort" = "3389"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/nicN0/ipConfigurations/ipconfig2"}} +$inboundRule6 = @{"Name" = "NRDP-VM1"; "FrontendPort" = "50004"; "BackendPort" = "3389"; "BackendIPConfiguration" = $null} +$inboundRule7 = @{"Name" = "NWINRM-VM0"; "FrontendPort" = "$winrmPort2"; "BackendPort" = "5986"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/nicN0/ipConfigurations/ipconfig2"}} +$inboundRule8 = @{"Name" = "NWINRM-VM1"; "FrontendPort" = "40004"; "BackendPort" = "5986"; "BackendIPConfiguration" = $null} +$inboundRule9 = @{"Name" = "MRDP-VM0"; "FrontendPort" = "50005"; "BackendPort" = "3389"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/mytestptvm0456/ipConfigurations/ipconfig3"}} +$inboundRule10 = @{"Name" = "MRDP-VM1"; "FrontendPort" = "50006"; "BackendPort" = "3389"; "BackendIPConfiguration" = $null} +$inboundRule11 = @{"Name" = "MWINRM-VM0"; "FrontendPort" = "$winrmPort3"; "BackendPort" = "5986"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/mytestptvm0456/ipConfigurations/ipconfig3"}} +$inboundRule12 = @{"Name" = "MWINRM-VM1"; "FrontendPort" = "40006"; "BackendPort" = "5986"; "BackendIPConfiguration" = $null} +$inboundRules = @($inboundRule1, $inboundRule2, $inboundRule3, $inboundRule4, $inboundRule5, $inboundRule6, $inboundRule7, $inboundRule8,$inboundRule9,$inboundRule10,$inboundRule11,$inboundRule12) + +$loadBalancerDetails = @{"frontEndIPConfigs" = $frontEndIPConfigs; "inboundRules" = $inboundRules} +$loadBalancerResources = @{$lbName = $loadBalancerDetails} + +$azureResourceGroupDeploymentResponse = @{"networkInterfaceResources" = $networkInterfaceResources; "publicIPAddressResources" = $publicIPAddressResources; "loadBalancerResources" = $loadBalancerResources} + +#creating one RG deployment to be used through out test +$resourceGroupDeployments = @{} +$resourceGroupVMs = @{} +$resourceGroupDeployments.Add($validRG, $azureResourceGroupDeploymentResponse) +$resourceGroupVMs.Add($validRG, $VMsStatus) + +$cloudServices = @{} +$cloudServiceWithNoVM = @{"vms" = $null; "vmConnectionDetails" = $null} +$vmConnectionDetailsWithTwoVms = @{$classicvm0 = @{"Name" = $classicvm0; "fqdn" = $classicvmfqdn; "winRMHttpsPort" = $classicWinrmPort1}; $classicvm1 = @{"Name" = $classicvm1; "fqdn" = $classicvmfqdn; "winRMHttpsPort" = $classicWinrmPort2}} +$cloudServiceWithTwoVM = @{"vms" = @(@{"Name" = $classicvm0}, @{"Name" = $classicvm1}); "vmConnectionDetails" = $vmConnectionDetailsWithTwoVms} + +$cloudServices.Add($rgWithNoClassicVms, $cloudServiceWithNoVM) +$cloudServices.Add($rgWithClassicVMs, $cloudServiceWithTwoVM) + +#Extensions +$winRMcustomScripExtensionObject = @{} +$winRMcustomScripExtensionObject["ExtensionType"]="Microsoft.Compute.CustomScriptExtension" +$winRMcustomScripExtensionObject["Name"]="winrmcustomscriptextension" +$winRMcustomScripExtensionObject["TypeHandlerVersion"]="1.4" + +$subStatus0 = @{} +$subStatus0["Code"]="ComponentStatus/StdOut/succeeded" +$subStatus0["DisplayStatus"]="Provisioning succeeded" +$subStatus0["Level"]="Info" +$subStatus0["Message"]="Succeeded\\n\\nDeleted 1 rule(s).\\nOk.\\n\\nOk.\\n" +$subStatus0["Time"]=$null + + +$subStatus1 = @{} +$subStatus1["Code"]="ComponentStatus/StdErr/succeeded" +$subStatus1["DisplayStatus"]="Provisioning succeeded" +$subStatus1["Level"]="Info" +$subStatus1["Message"]="" +$subStatus1["Time"]=$null + +$substatuses = @() +$substatuses+=$subStatus0 +$substatuses+=$subStatus1 + +$winRMcustomScripExtensionObject["SubStatuses"]=@() +$winRMcustomScripExtensionObject["SubStatuses"]+=$substatuses + + +$status0 = @{} +$status0["Code"]="ProvisioningState/succeeded" +$status0["DisplayStatus"]="Provisioning succeeded" +$status0["Level"]="Info" +$status0["Message"]="Finished executing command" +$status0["Time"]=$null + +$statuses = @() +$statuses += $status0 + +$winRMcustomScripExtensionObject["Statuses"]=@() +$winRMcustomScripExtensionObject["Statuses"]+=$statuses + +$extensions = @() +$extensions += $winRMcustomScripExtensionObject + +$getCustomScriptExtensionResponse = @{"Status"="Succeeded"} +$setCustomScriptExtensionResponse = @{"Status"="Succeeded"} +$rgustomScriptExtensionResponse = @{"Status"="Succeeded"} +$winrmCustomScriptExtension="WinRmCustomScriptExtension" +$invalidCustomScriptName = "InvalidConfigureWinRM.ps1" + +$securityGroups = New-Object System.Collections.Generic.List[System.Object] +$securityRules = New-Object System.Collections.Generic.List[System.Object] + +$validSecurityGroupProps = @{"Name"="VMWithSG";"SecurityRules"=$securityRules} +$validSecurityGroup = New-Object PSObject -Property $validSecurityGroupProps +$securityGroups.Add($validSecurityGroup) + + +$securityGroupsRecommended = New-Object System.Collections.Generic.List[System.Object] +$securityRulesRecommended = New-Object System.Collections.Generic.List[System.Object] + +$validSecurityGroupPropsRecommended = @{"Name"="VMWithSGRecPS";"SecurityRules"=$securityRulesRecommended} +$validSecurityGroupRecommended = New-Object PSObject -Property $validSecurityGroupPropsRecommended +$securityGroupsRecommended.Add($validSecurityGroupRecommended) + +$securityGroupsLatest = New-Object System.Collections.Generic.List[System.Object] +$securityRulesLatest = New-Object System.Collections.Generic.List[System.Object] + +$validSecurityGroupPropsLatest = @{"Name"="VMWithSGHighPS";"SecurityRules"=$securityRulesLatest} +$validSecurityGroupLatest = New-Object PSObject -Property $validSecurityGroupPropsLatest +$securityGroupsLatest.Add($validSecurityGroupLatest) + +$securedMockPassword = New-Object -TypeName System.Security.SecureString + +$vmIdWhichHasSecurityGroupPrevious = "/subscriptions/c94bda7a-0577-4374-9c53-0e46a9fb0f70/resourceGroups/AzureFIleCopyPTRGWithSGDoNotDelete/providers/Microsoft.Compute/virtualMachines/VMWithSG" +$vmIdWhichHasSecurityGroupRecommended = "/subscriptions/c94bda7a-0577-4374-9c53-0e46a9fb0f70/resourceGroups/AzureFIleCopyPTRGWithSGDoNotDelete/providers/Microsoft.Compute/virtualMachines/VMWithSGRecPS" +$vmIdWhichHasSecurityGroupLatest = "/subscriptions/c94bda7a-0577-4374-9c53-0e46a9fb0f70/resourceGroups/AzureFIleCopyPTRGWithSGDoNotDelete/providers/Microsoft.Compute/virtualMachines/VMWithSGHighPS" +$vmIdWhichHasNoSecurityGroup = "/subscriptions/c94bda7a-0577-4374-9c53-0e46a9fb0f70/resourceGroups/AzureFileCopyTaskPlatformTestDoNotDelete/providers/Microsoft.Compute/virtualMachines/mytestVM0" +$duplicateRuleName = "VSO-Custom-WinRM-Https-Port-Deplicate" + +#Create Mock Object type for Hyak.Common.CloudException +$Source = @" + using System; +namespace Hyak.Common { + public class CloudException : Exception { + } +} +"@ +Add-Type -TypeDefinition $Source -Language CSharp + +function Get-AzureBlobStorageEndpointFromARM +{ + param([string]$storageAccountName) + + if(-not [string]::IsNullOrEmpty($storageAccountName)) + { + if(-not $storageAccounts.ContainsKey($storageAccountName)) + { + throw "Unable to find storage type $storageAccountName with Connection SPN" + } + + return $storageAccounts[$storageAccountName] + } +} + +function Get-AzureStorageAccountTypeFromARM +{ + param([string]$storageAccountName, + [object]$endpoint) + + if(-not [string]::IsNullOrEmpty($storageAccountName)) + { + if(-not $storageAccounts.ContainsKey($storageAccountName)) + { + throw "Storage account: $storageAccountName not found." + } + + return $storageAccounts[$storageAccountName] + } +} + +function Get-AzureStorageAccountResourceGroupName +{ + param([string]$storageAccountName) + + if (-not [string]::IsNullOrEmpty($storageAccountName)) + { + if(-not $storageAccountsRG.ContainsKey($storageAccountName)) + { + throw "Storage account: $storageAccountName not found. Selected Connection 'ServicePrincipal' supports storage account of Azure Resource Manager type only." + } + + return $storageAccountsRG[$storageAccountName] + } +} + +function Get-AzureStorageKeyFromARM +{ + param([string]$storageAccountName) + + if(-not [string]::IsNullOrEmpty($storageAccountName)) + { + if(-not $storageAccounts.ContainsKey($storageAccountName)) + { + throw "Storage account: $storageAccountName not found. Selected Connection 'ServicePrincipal' supports storage account of Azure Resource Manager type only." + } + + return $storageAccounts[$storageAccountName] + } +} + +function Create-AzureStorageContext +{ + param([string]$storageAccountName, + [string]$storageAccountKey) + + if(-not [string]::IsNullOrEmpty($storageAccountName) -and -not [string]::IsNullOrEmpty($storageAccountKey)) + { + if(-not $storageAccounts.ContainsKey($storageAccountName)) + { + return + } + + return $storageAccountsContext[$storageAccountName] + } +} + +function Get-AzureClassicVMsInResourceGroup +{ + param([string]$resourceGroupName) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and $cloudServices.ContainsKey($resourceGroupName)) + { + return $($cloudServices[$resourceGroupName])["vms"] + } +} + +function Get-AzureRMVMsInResourceGroup +{ + param([string]$resourceGroupName) + + if(-not [string]::IsNullOrEmpty($resourceGroupName)) + { + if(-not $resourceGroups.ContainsKey($resourceGroupName)) + { + throw "Provided resource group '$resourceGroupName' does not exist." + } + + if($resourceGroupDeployments.ContainsKey($resourceGroupName)) + { + return $vmResources + } + } +} + +function Get-AzureRMResourceGroupResourcesDetails +{ + param([string]$resourceGroupName, + [object]$azureRMVMResources) + + if(-not [string]::IsNullOrEmpty($resourceGroupName)) + { + if(-not $resourceGroups.ContainsKey($resourceGroupName)) + { + throw "Resource group '$resourceGroupName' could not be found." + } + + if($resourceGroupDeployments.ContainsKey($resourceGroupName)) + { + return $resourceGroupDeployments[$resourceGroupName] + } + } + + return @{} +} + +function Get-Endpoint +{ + param([string]$connectedServiceName) + + return @{ + "Data"=@{ + "EnvironmentName"="AzureStack" + } + } +} + +function Get-AzureRMResourceGroupResourcesDetailsForAzureStack +{ + param([string]$resourceGroupName, + [object]$azureRMVMResources, + [string]$connectedServiceName) + + if(-not [string]::IsNullOrEmpty($resourceGroupName)) + { + if(-not $resourceGroups.ContainsKey($resourceGroupName)) + { + throw "Resource group '$resourceGroupName' could not be found." + } + + if($resourceGroupDeployments.ContainsKey($resourceGroupName)) + { + return $resourceGroupDeployments[$resourceGroupName] + } + } + + return @{} +} + +function Generate-AzureStorageContainerSASToken +{ + param([string]$containerName, + [object]$storageContext, + [System.Int32]$tokenTimeOutInMinutes) + + if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext) + { + return $validSasToken + } +} + +function Remove-AzureContainer +{ + +} + +function Get-AzureMachineStatus +{ + param([string]$resourceGroupName, + [string]$name) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($name)) + { + if(-not $resourceGroups.ContainsKey($resourceGroupName)) + { + throw "Resource group '$resourceGroupName' could not be found." + } + + $VMs = $resourceGroups[$resourceGroupName].VMsDetails + if($VMs -and $VMs.ContainsKey($name)) + { + $tempExts = $vmInstanceViews[$name]["Extensions"] + if($tempExts -and $tempExts.Count -ge 1) + { + $status = @{} + $status["Extensions"] = $tempExts + #$customScriptExtension=$tempExts[0] + } + else + { + throw "No extension exists with name '$winrmCustomScriptExtension'" + } + } + else + { + throw "The Resource 'Microsoft.Compute/virtualMachines/$name/extensions/$winrmCustomScriptExtension' under resource group '$resourceGroupName' was not found." + } + } + + return $status +} + +function Get-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name) + + $errMsg="The Resource 'Microsoft.Compute/virtualMachines/$vmName/extensions/$name' under resource group '$resourceGroupName' was not found." + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName)) + { + if(-not $resourceGroups.ContainsKey($resourceGroupName)) + { + throw "Resource group '$resourceGroupName' could not be found." + } + + $VMs = $resourceGroups[$resourceGroupName].VMsDetails + if($VMs -and $VMs.ContainsKey($vmName)) + { + if($name) + { + $tempExts = $vmInstanceViews[$vmName]["Extensions"] + if($tempExts -and $tempExts.Count -ge 1) + { + $response = @{} + if($tempExts[0]["SubStatuses"][1]["Message"] -and $extension[0]["SubStatuses"][1]["Message"] -ne "") + { + $response["ProvisioningState"]="Failed" + } + else + { + $response["ProvisioningState"]="Succeeded" + } + } + else + { + throw $errMsg + } + } + else + { + throw $errMsg + } + } + else + { + throw $errMsg + } + } + + return $response +} + +function Set-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name, + [string[]]$fileUri, + [string]$run, + [string]$argument, + [string]$location) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName) -and -not [string]::IsNullOrEmpty($name)) + { + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName)) + { + if(-not $resourceGroups.ContainsKey($resourceGroupName)) + { + throw "Resource group '$resourceGroupName' could not be found." + } + + $VMs = $resourceGroups[$resourceGroupName].VMsDetails + if($VMs -and $VMs.ContainsKey($vmName)) + { + $response = @{} + + if(-not $fileUri) + { + throw "Cannot validate argument on parameter 'FileUri'. The argument is null or empty." + } + + if(-not $run) + { + throw "Cannot validate argument on parameter 'Run'. The argument is null or empty." + } + + if(-not $argument) + { + throw "Cannot validate argument on parameter 'Argument'. The argument is null or empty." + } + + if(-not $location) + { + throw "Cannot validate argument on parameter 'Location'. The argument is null or empty." + } + + elseif($run -eq $invalidCustomScriptName) + { + $extensions[0]["SubStatuses"][1]["Message"]="The argument '$invalidCustomScriptName' to the -File parameter does not exist. Provide the path to an existing '.ps1' file as an argument to the -File parameter." + $errorDetails = @{"Message" = "VM has reported a failure when processing extension 'WinRMCustomScriptExtension'. Error message: Finished executing command."} + $response["Error"]= $errorDetails + $response["Status"]="Failed" + } + else + { + $extensions[0]["SubStatuses"][1]["Message"]="" + $response["Status"]="Succeeded" + } + + $vmInstanceViews[$vmName]["Extensions"]=$extensions + } + else + { + throw "Can not perform requested operation on nested resource. Parent resource '$vmName' not found." + } + } + } + + return $response +} + +function Remove-AzureMachineCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$name) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName) -and -not [string]::IsNullOrEmpty($name)) + { + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName)) + { + $response = @{} + $VMs = $resourceGroups[$resourceGroupName].VMsDetails + if($VMs -and $VMs.ContainsKey($vmName)) + { + $tempExts = $vmInstanceViews[$vmName]["Extensions"] + if($tempExts -and $tempExts.Count -ge 1) + { + $vmInstanceViews[$vmName]["extensions"]=@() + $response["Status"]="Succeeded" + } + else + { + $response["Status"]="Succeeded" + } + } + else + { + $response["Status"]="Succeeded" + } + } + } + + return $response +} + +function Add-AzureNetworkSecurityRuleConfig +{ +} + +function Add-NetworkSecurityRuleConfig +{ + param([string]$resourceGroupName, + [object]$securityGroups, + [string]$ruleName, + [string]$rulePriotity, + [string]$winrmHttpsPort) + + if(($securityGroups.Count -gt 0) -and (-not $securityGroups[0].SecurityRules -or $ruleName -eq $duplicateRuleName)) + { + Add-AzureNetworkSecurityRuleConfig + + $tempRulePriority = "3986" + if($ruleName -eq $duplicateRuleName) + { + $tempRulePriority = "4036" + } + + $securityRuleProps = @{"Name"=$ruleName;"Priority"=$tempRulePriority} + $securityRule = New-Object PSObject -Property $securityRuleProps + $securityGroups[0].SecurityRules += $securityRule + } + + return $securityGroups +} + +function Set-AzureNetworkSecurityGroup +{ + param([object]$NetworkSecurityGroup) + + if($NetworkSecurityGroup.Name -eq $validSecurityGroup.Name) + { + $validSecurityGroup = $NetworkSecurityGroup + } + + return $validSecurityGroup +} + +function Get-NetworkSecurityGroups +{ + param([string] $resourceGroupName, + [string] $vmId) + + if($vmId -eq $vmIdWhichHasNoSecurityGroup) + { + return @() + } + elseif($vmId -eq $vmIdWhichHasSecurityGroupPrevious) + { + return $securityGroups + } + elseif($vmId -eq $vmIdWhichHasSecurityGroupRecommended) + { + return $securityGroupsRecommended + } + elseif($vmId -eq $vmIdWhichHasSecurityGroupLatest) + { + return $securityGroupsLatest + } + else + { + throw "[Azure Call]No network interface found with virtual machine id $vmId under resource group $rgNameWithSecurityGroup" + } +} + +# Used only in test code +function Remove-NetworkSecurityRuleConfig +{ + param([object] $securityGroups, + [string] $ruleName) + + $validSecurityGroup["SecurityRules"]=@() +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Tests/MockVariable.ps1 b/_generated/AzureFileCopyV5/Tests/MockVariable.ps1 new file mode 100644 index 000000000000..bfb8c213c959 --- /dev/null +++ b/_generated/AzureFileCopyV5/Tests/MockVariable.ps1 @@ -0,0 +1,58 @@ + +$validInputSourcePath = Join-Path $env:windir "Source" +$validInputAzureBlobDestinationType = "AzureBlob" +$validInputAzureVmsDestinationType = "AzureVms" +$validInputStorageAccount = "validInputStorageAccount" +$validInputContainerName = "validContainerName" +$validInputBlobPrefix = "validBlobPrefix" +$validResourceGroupName = "validResourceGroupName" +$validInputVmsAdminUserName = "validInputVmsAdminUserName" +$validInputVmsAdminPassword = "validInputVmsAdminPassword" +$validSasToken = '?sv=2015-02-21&sr=c&sig=Ncs6hCfAhzwwWd19eP7ToJATsS3xS1laFfPmRwO90qY%3D&se=2016-01-04T18%3A13%3A12Z&sp=rwdl' + +$validStorageKey = "validsotrageKey" +$validAzCopyLocation = Join-Path $env:windir "AzCopyLocation" +$validInputTargetPath = Join-Path $env:windir "Target" + +$failedStatus = "Failed" +$failedCopyLog = "Failed Copy Operation" +$failedCopyError = $failedCopyLog +$failedDeploymentResponseForCopy = @{"MachineName" = "vm0"; "Status" = $failedStatus; "DeploymentLog" = $failedCopyLog; "ServiceLog" = $null; "Error" = @{"Message" = $failedCopyError}} + +$passedStatus = "Passed" +$successLog = "Success Logs" +$passedDeploymentResponseForCopy = @{"Status" = $passedStatus; "DeploymentLog" = $successLog; "ServiceLog" = $null; "Error" = $null} +$passedLatestDeploymentResponseForCopy = @{"Status" = $passedStatus; "DeploymentLog" = $successLog; "ServiceLog" = $null; "Error" = $null} + +$guidingMessageForAzureFileCopy = "For more info please refer to https://aka.ms/azurefilecopyreadme" +$winrmHelpMsg = "To fix WinRM connection related issues, select the 'Enable Copy Prerequisites' option in the task. If set already, and the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). Applicable only for ARM VMs." + +$succeededStatus = "Succeeded" +$succeededCopyResponse = @{"Status" = $succeededStatus; "Log" = $null; "Error" = $null} + +$assembly = New-Object System.Collections.Generic.List``1[System.Object] + +$testJobs = New-Object System.Collections.Generic.List``1[System.Object] +$failedJob = @{"Id" = "1"; "Status" = "Completed"} +$passedJob = @{"Id" = "2"; "Status" = "Completed"} +$passedLatestJob = @{"Id" = "3"; "Status" = "Completed"} +$passedJob1 = @{"Id" = "1"; "Status" = "Completed"} + +$jobFailedResponse = @{"Status" = $failedStatus; "DeploymentLog" = $failedCopyLog; "ServiceLog" = $null; "Error" = $null} +$jobPassedResponse = @{"Status" = $passedStatus; "DeploymentLog" = $successLog; "ServiceLog" = $null; "Error" = $null} +$jobPassedLatestResponse = @{"Status" = $passedStatus; "DeploymentLog" = $successLog; "ServiceLog" = $null; "Error" = $null} + +$connectedServiceName = "DummyConnectedServiceName" + +$invokeRemoteScriptFailedResponse = @{ExitCode = 1} +$invokeRemoteScriptPassedResponse = @{ExitCode = 0} +$invokeRemoteScriptOnePassOneFailResponse = @($invokeRemoteScriptFailedResponse, $invokeRemoteScriptPassedResponse) +$invokeRemoteScriptAllPassedResponse = @($invokeRemoteScriptPassedResponse, $invokeRemoteScriptPassedResponse) + +$validBlobStorageEndpoint = "https://validInputStorageAccount.blob.core.windows.net" + +$spnEndpoint=@{} +$spnAuth=@{} + +$spnEndpoint.Scheme='ServicePrincipal' +$spnEndpoint.Auth =$spnEndpoint \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/ThirdPartyNotices.txt b/_generated/AzureFileCopyV5/ThirdPartyNotices.txt new file mode 100644 index 000000000000..ea01c33dc766 --- /dev/null +++ b/_generated/AzureFileCopyV5/ThirdPartyNotices.txt @@ -0,0 +1,1137 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +Azure File Copy incorporates third party material from the projects listed below. The original copyright notice and the license under which Microsoft received such third party material are set forth below. Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise. + +1. balanced-match (https://github.com/juliangruber/balanced-match) +2. brace-expansion (https://github.com/juliangruber/brace-expansion) +3. buffer-equal-constant-time (https://github.com/salesforce/buffer-equal-constant-time) +4. concat-map (https://github.com/substack/node-concat-map) +5. hoek (https://github.com/hapijs/hoek) + Includes:Deep-eql +6. isemail (https://github.com/hapijs/isemail) +7. joi (https://github.com/hapijs/joi) +8. jsonwebtoken (https://github.com/auth0/node-jsonwebtoken) +9. lodash.once (https://github.com/lodash/lodash) +10. minimatch (https://github.com/isaacs/minimatch) +11. Mockery (https://github.com/mfncooper/mockery) +12. Moment (https://github.com/moment/moment) + Includes:Files with code from Closure +13. ms (https://github.com/zeit/ms) +14. Node.js (https://nodejs.org/) +15. node-ecdsa-sig-formatter (https://github.com/Brightspace/node-ecdsa-sig-formatter) +16. node-jwa (https://github.com/brianloveswords/node-jwa) +17. node-jws (https://github.com/brianloveswords/node-jws) +18. node-uuid (https://github.com/broofa/node-uuid/) +19. OpenSSL (http://www.openssl.org) +20. Q (https://github.com/kriskowal/q) +21. safe-buffer (https://github.com/feross/safe-buffer) +22. sax js (https://github.com/isaacs/sax-js) +23. semver (https://github.com/npm/node-semver/) +24. ShellJS (https://github.com/shelljs/shelljs) +25. topo (https://github.com/hapijs/topo) +26. tunnel (https://github.com/koichik/node-tunnel) +27. underscore.js (http://underscorejs.org/; https://github.com/jashkenas/underscore) +28. vso-node-api (https://github.com/Microsoft/vsts-node-api) +29. VSTS-task-lib (https://github.com/Microsoft/vsts-task-lib) +30. Xml2JS (https://github.com/Leonidas-from-XIV/node-xml2js) +31. Xmlbuilder (https://github.com/oozcitak/xmlbuilder-js) +32. xtend (https://github.com/Raynos/xtend) +33. @types/node (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +34. @types/q (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +35. @types/mocha (https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% buffer-equal-constant-time NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013, GoInstant Inc., a salesforce.com company +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of salesforce.com, nor GoInstant, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF buffer-equal-constant-time NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) James Halliday/substack + +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% hoek NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright (c) 2011-2014, Walmart and other contributors. +Copyright (c) 2011, Yahoo Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/hapi/graphs/contributors +Portions of this project were initially based on the Yahoo! Inc. Postmile project, +published at https://github.com/yahoo/postmile. +========================================= +Includes code from Deep-eql + +Copyright (c) 2013 Jake Luer jake@alogicalparadox.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF hoek NOTICES, INFORMATION, AND LICENSE + +%% isemail NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2008-2011, Dominic Sayers +Copyright (c) 2013-2014, GlobeSherpa +Copyright (c) 2014-2015, Eli Skeggs + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +- Neither the name of Dominic Sayers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF isemail NOTICES, INFORMATION, AND LICENSE + +%% joi NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/joi/graphs/contributors +========================================= +END OF joi NOTICES, INFORMATION, AND LICENSE + +%% jsonwebtoken NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2015 Auth0, Inc. (http://auth0.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF jsonwebtoken NOTICES, INFORMATION, AND LICENSE + +%% lodash.once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.once NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% Mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following +terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF Mockery NOTICES, INFORMATION, AND LICENSE + +%% Moment NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +Files with code from Closure + +Copyright (c) 2006 The Closure Library Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +========================================= +END OF Moment NOTICES, INFORMATION, AND LICENSE + +%% ms NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Guillermo Rauch +Copyright (c) 2016 Zeit, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the Software), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF ms NOTICES, INFORMATION, AND LICENSE + +%% Node.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +The Node.js license applies to all parts of Node.js that are not externally +maintained libraries. +========================================= +END OF Node.js NOTICES, INFORMATION, AND LICENSE + +%% node-ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + Copyright 2015 D2L Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +========================================= +END OF node-ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE + +%% node-jwa NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jwa NOTICES, INFORMATION, AND LICENSE + +%% node-jws NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jws NOTICES, INFORMATION, AND LICENSE + +%% node-uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2012 Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-uuid NOTICES, INFORMATION, AND LICENSE + +%% OpenSSL NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/) + * + * 4. The names OpenSSL Toolkit and OpenSSL Project must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called OpenSSL + * nor may OpenSSL appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/) + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com) + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * This product includes software written by Tim Hudson (tjh@cryptsoft.com) + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] +========================================= +END OF OpenSSL NOTICES, INFORMATION, AND LICENSE + +%% Q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009�2014 Kristopher Michael Kowal. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +The file q.js is prefaced by the following additional third-party subcomponent information: + +/*! + * + * Copyright 2009-2012 Kris Kowal under the terms of the MIT + * license found at http://github.com/kriskowal/q/raw/master/LICENSE + * + * With parts by Tyler Close + * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found + * at http://www.opensource.org/licenses/mit-license.html + * Forked at ref_send.js version: 2009-05-11 + * + * With parts by Mark Miller + * Copyright (C) 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +========================================= +END OF Q NOTICES, INFORMATION, AND LICENSE + +%% safe-buffer NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF safe-buffer NOTICES, INFORMATION, AND LICENSE + +%% sax js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +==== + +`String.fromCodePoint` by Mathias Bynens used according to terms of MIT +License, as follows: + + Copyright Mathias Bynens + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF sax js NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% ShellJS NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF ShellJS NOTICES, INFORMATION, AND LICENSE + +%% topo NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/topo/graphs/contributors +========================================= +END OF topo NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% underscore.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2017 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF underscore.js NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% VSTS-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF VSTS-task-lib NOTICES, INFORMATION, AND LICENSE + +%% Xml2JS NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010, 2011, 2012, 2013. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF Xml2JS NOTICES, INFORMATION, AND LICENSE + +%% Xmlbuilder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF Xmlbuilder NOTICES, INFORMATION, AND LICENSE + +%% xtend NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014 Raynos. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF xtend NOTICES, INFORMATION, AND LICENSE + +%% @types/mocha NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/mocha NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/Utility.ps1 b/_generated/AzureFileCopyV5/Utility.ps1 new file mode 100644 index 000000000000..b70488a04191 --- /dev/null +++ b/_generated/AzureFileCopyV5/Utility.ps1 @@ -0,0 +1,1408 @@ +# Utility Functions used by AzureFileCopy.ps1 (other than azure calls) # + +$ErrorActionPreference = 'Stop' +$azureStackEnvironment = "AzureStack" +$jobId = $env:SYSTEM_JOBID; + +$featureFlags = @{ + retireAzureRM = [System.Convert]::ToBoolean($env:RETIRE_AZURERM_POWERSHELL_MODULE) + useOpenssLatestVersion = Get-VstsPipelineFeature -FeatureName 'UseOpensslv3.4.2' +} + +function Get-AzureCmdletsVersion +{ + return (Get-Module AzureRM -ListAvailable).Version +} + +function Get-AzureVersionComparison($azureVersion, $compareVersion) +{ + Write-Verbose "Compare azure versions: $azureVersion, $compareVersion" + return ($azureVersion -and $azureVersion -gt $compareVersion) +} + +function Get-AzureUtility +{ + $azureUtilityARM = "AzureUtilityARM.ps1" + $azUtilityVersion100 = "AzureUtilityAz1.0.ps1" + + if ($featureFlags.retireAzureRM) { + return $azUtilityVersion100 + } + else { + if (Get-Module Az.Accounts -ListAvailable) { + Write-Verbose "Az module is installed in the agent." + return $azUtilityVersion100 + } + Write-Warning "Az module is not installed in the agent." + return $azureUtilityARM + } +} + +function Get-Endpoint +{ + param([String] [Parameter(Mandatory=$true)] $connectedServiceName) + + $serviceEndpoint = Get-VstsEndpoint -Name "$connectedServiceName" + return $serviceEndpoint +} + +function Validate-AzurePowershellVersion +{ + Write-Verbose "Validating installed azure powershell version is greater than or equal to AzureRM 1.1.0" + if (!(Get-Module Az.Accounts -ListAvailable)){ + $currentVersion = Get-AzureCmdletsVersion + Write-Verbose "Installed Azure PowerShell version: $currentVersion" + + $minimumAzureVersion = New-Object System.Version(1, 1, 0) + $versionCompatible = Get-AzureVersionComparison -AzureVersion $currentVersion -CompareVersion $minimumAzureVersion + + if(!$versionCompatible) + { + Write-Telemetry "Task_InternalError" "UnsupportedAzurePSVersion" + Throw (Get-VstsLocString -Key "AFC_AzurePSNotInstalled" -ArgumentList $minimumAzureVersion) + } + + Write-Verbose "Validated the required azure powershell version is greater than or equal to 1.1.0" + } +} + +function Get-StorageKey +{ + param([string][Parameter(Mandatory=$true)]$storageAccountName, + [object][Parameter(Mandatory=$true)]$endpoint, + [string][Parameter(Mandatory=$false)]$connectedServiceNameARM) + + $storageAccountName = $storageAccountName.Trim() + + # checking azure powershell version to make calls to ARM endpoint + Validate-AzurePowershellVersion + + # getting storage account key from ARM endpoint + $storageKey = Get-AzureStorageKeyFromARM -storageAccountName $storageAccountName -serviceEndpoint $endpoint $connectedServiceNameARM + + return $storageKey +} + +function Get-blobStorageEndpoint +{ + param([string][Parameter(Mandatory=$true)]$storageAccountName, + [object][Parameter(Mandatory=$true)]$endpoint, + [string][Parameter(Mandatory=$false)]$connectedServiceNameARM) + + $storageAccountName = $storageAccountName.Trim() + + # getting storage account key from ARM endpoint + $blobStorageEndpoint = Get-AzureBlobStorageEndpointFromARM $storageAccountName $endpoint $connectedServiceNameARM + + return $blobStorageEndpoint +} + +function Get-StorageAccountType +{ + param([string][Parameter(Mandatory=$true)]$storageAccountName, + [object][Parameter(Mandatory=$true)]$endpoint, + [string][Parameter(Mandatory=$false)]$connectedServiceNameARM) + + $storageAccountName = $storageAccountName.Trim() + # getting storage account type from ARM endpoint + $storageAccountType = Get-AzureStorageAccountTypeFromARM $storageAccountName $endpoint $connectedServiceNameARM $vsstsAccessToken + + if($null -ne $storageAccountType) + { + return $storageAccountType.ToString() + } +} + +function ThrowError +{ + param([string]$errorMessage) + + $readmelink = "https://aka.ms/azurefilecopyreadme" + $helpMessage = (Get-VstsLocString -Key "AFC_AzureFileCopyMoreHelp" -ArgumentList $readmelink) + throw "$errorMessage $helpMessage" +} + +function ConvertTo-Pfx { + param( + [String][Parameter(Mandatory = $true)] $pemFileContent + ) + + if ($ENV:Agent_TempDirectory) { + $pemFilePath = "$ENV:Agent_TempDirectory\clientcertificate.pem" + $pfxFilePath = "$ENV:Agent_TempDirectory\clientcertificate.pfx" + $pfxPasswordFilePath = "$ENV:Agent_TempDirectory\clientcertificatepassword.txt" + } + else { + $pemFilePath = "$ENV:System_DefaultWorkingDirectory\clientcertificate.pem" + $pfxFilePath = "$ENV:System_DefaultWorkingDirectory\clientcertificate.pfx" + $pfxPasswordFilePath = "$ENV:System_DefaultWorkingDirectory\clientcertificatepassword.txt" + } + + # save the PEM certificate to a PEM file + Set-Content -Path $pemFilePath -Value $pemFileContent + + # use openssl to convert the PEM file to a PFX file + $pfxFilePassword = [System.Guid]::NewGuid().ToString() + + if (CmdletHasMember -cmdlet Set-Content -memberName NoNewline) { + Set-Content -Path $pfxPasswordFilePath -Value $pfxFilePassword -NoNewline + } + else { + [System.IO.File]::WriteAllText($pfxPasswordFilePath, $pfxFilePassword, [System.Text.Encoding]::ASCII) + } + + if (-not $featureFlags.useOpenssLatestVersion) { + $openSSLExePath = "$PSScriptRoot\ps_modules\VstsAzureHelpers_\opensslv4\openssl.exe" + $env:OPENSSL_CONF = "$PSScriptRoot\ps_modules\VstsAzureHelpers_\opensslv4\openssl.cnf" + } + else { + $openSSLExePath = "$PSScriptRoot\ps_modules\VstsAzureHelpers_\opensslv3.4.2\openssl.exe" + $env:OPENSSL_CONF = "$PSScriptRoot\ps_modules\VstsAzureHelpers_\opensslv3.4.2\openssl.cnf" + } + try { + $versionOutput = & $openSSLExePath version + Write-Verbose "OpenSSL version: $versionOutput" + } catch { + Write-Host "There was an error while getting the OpenSSL version $_" + } + $env:RANDFILE=".rnd" + + $openSSLArgs = "pkcs12 -export -in $pemFilePath -out $pfxFilePath -password file:`"$pfxPasswordFilePath`" -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -macalg sha1" + + Invoke-VstsTool -FileName $openSSLExePath -Arguments $openSSLArgs -RequireExitCodeZero + + return $pfxFilePath, $pfxFilePassword +} + +function Upload-FilesToAzureContainer +{ + param([string][Parameter(Mandatory=$true)]$sourcePath, + [object][Parameter(Mandatory=$true)]$endPoint, + [string][Parameter(Mandatory=$true)]$storageAccountName, + [string][Parameter(Mandatory=$true)]$containerName, + [string]$blobPrefix, + [string]$blobStorageEndpoint, + [string][Parameter(Mandatory=$true)]$azCopyLocation, + [string]$additionalArguments, + [string][Parameter(Mandatory=$true)]$destinationType, + [bool]$useDefaultArguments, + [bool]$cleanTargetBeforeCopy, + [string][Parameter(Mandatory=$false)]$containerSasToken = "", + [bool]$useSanitizerActivate = $false + ) + + try + { + $aadAuthorityUrl = "https://login.microsoftonline.com/" + if ($endpoint.Data.EnvironmentAuthorityUrl -ne $null) { + $aadAuthorityUrl = $endpoint.Data.EnvironmentAuthorityUrl + } + + Write-Verbose "AAD autority URL = $aadAuthorityUrl" + Write-Host " mime: $PSScriptRoot\MimeMapping.json" + $env:AZCOPY_CONTENT_TYPE_MAP ="$PSScriptRoot\MimeMapping.json" + + if ($endPoint.Auth.Scheme -eq 'ServicePrincipal') { + try { + if($endPoint.Auth.Parameters.AuthenticationType -eq 'SPNCertificate') { + $pemFileContent = $endPoint.Auth.Parameters.ServicePrincipalCertificate + $pfxFilePath, $pfxFilePassword = ConvertTo-Pfx -pemFileContent $pemFileContent + + $env:AZCOPY_SPA_CERT_PASSWORD = $pfxFilePassword + Write-Output "##[command] & `"$azCopyExeLocation`" login --service-principal --application-id `"$($endPoint.Auth.Parameters.ServicePrincipalId)`" --certificate-path `"$($pfxFilePath)`" --tenant-id=`"$($endPoint.Auth.Parameters.TenantId)`" --aad-endpoint `"$aadAuthorityUrl`"" + + $command = "& `"$azCopyExeLocation`" login --service-principal --application-id `"$($endPoint.Auth.Parameters.ServicePrincipalId)`" --certificate-path `"$($pfxFilePath)`" --tenant-id=`"$($endPoint.Auth.Parameters.TenantId)`" --aad-endpoint `"$aadAuthorityUrl`"" + Invoke-Expression $command + } + else { + $env:AZCOPY_SPA_CLIENT_SECRET = $endPoint.Auth.Parameters.ServicePrincipalKey + Write-Output "##[command] & `"$azCopyExeLocation`" login --service-principal --application-id `"$($endPoint.Auth.Parameters.ServicePrincipalId)`" --tenant-id=`"$($endPoint.Auth.Parameters.TenantId)`" --aad-endpoint `"$aadAuthorityUrl`"" + + $command = "& `"$azCopyExeLocation`" login --service-principal --application-id `"$($endPoint.Auth.Parameters.ServicePrincipalId)`" --tenant-id=`"$($endPoint.Auth.Parameters.TenantId)`" --aad-endpoint `"$aadAuthorityUrl`"" + Invoke-Expression $command + } + } + catch { + # Provide an additional, custom, credentials-related error message. + $exceptionMessage = $_.Exception.Message.ToString() + Write-Verbose "ExceptionMessage: $exceptionMessage" + throw (New-Object System.Exception((Get-VstsLocString -Key ServicePrincipalError), $_.Exception)) + } + } + elseif ($endPoint.Auth.Scheme -eq 'ManagedServiceIdentity') { + Write-Output "##[command] & `"$azCopyExeLocation`" login --identity --aad-endpoint `"$aadAuthorityUrl`"" + + $command = "& `"$azCopyExeLocation`" login --identity --aad-endpoint `"$aadAuthorityUrl`"" + Invoke-Expression $command + + } + else { + throw (Get-VstsLocString -Key UnsupportedAuthScheme -ArgumentList $endPoint.Auth.Scheme) + } + + Write-Output (Get-VstsLocString -Key "AFC_UploadFilesStorageAccount" -ArgumentList $sourcePath, $storageAccountName, $containerName, $blobPrefix) + + $blobPrefix = $blobPrefix.Trim() + $trailingChars = [regex]::Escape("/") + '+$' + $blobPrefix = $blobPrefix -replace $trailingChars, "/" + $containerURL = [string]::Format("{0}/{1}/{2}", $blobStorageEndpoint.Trim("/"), $containerName, $blobPrefix.TrimStart("/")) + + $containerURL = $containerURL.Replace('$','`$') + $azCopyExeLocation = Join-Path -Path $azCopyLocation -ChildPath "AzCopy.exe" + if($cleanTargetBeforeCopy) + { + + Write-Output "##[command] & `"$azCopyExeLocation`" rm `"$containerURL`" --recursive=true" + + $cleanToBlobCommand = "& `"$azCopyExeLocation`" rm `"$containerURL`" --recursive=true" + + Invoke-Expression $cleanToBlobCommand + + } + + if ($useSanitizerActivate) { + # Splitting arguments on space, but not on space inside quotes + $sanitizedArguments = [regex]::Split($additionalArguments, ' (?=(?:[^"]|"[^"]*")*$)') + Write-Output "##[command] & `"$azCopyExeLocation`" copy `"$sourcePath`" `"$containerURL`" $sanitizedArguments" + $uploadCommand = "& `"$azCopyExeLocation`" copy `"$sourcePath`" `"$containerURL`" $sanitizedArguments" + Invoke-Expression $uploadCommand + } else { + Write-Output "##[command] & `"$azCopyExeLocation`" copy `"$sourcePath`" `"$containerURL`" $additionalArguments" + $uploadToBlobCommand = "& `"$azCopyExeLocation`" copy `"$sourcePath`" `"$containerURL`" $additionalArguments" + Invoke-Expression $uploadToBlobCommand + } + + if($LASTEXITCODE -eq 0) + { + Write-Output (Get-VstsLocString -Key "AFC_UploadFileSuccessful" -ArgumentList $sourcePath, $storageAccountName, $containerName, $blobPrefix) + } + else + { + throw (Get-VstsLocString -Key "AFC_AzCopyBlobUploadNonZeroExitCode") + } + } + catch + { + # deletes container only if we have created temporary container + if ($destinationType -ne "AzureBlob") + { + Remove-AzureContainer -containerName $containerName -storageContext $storageContext + } + + $exceptionMessage = $_.Exception.Message.ToString() + Write-Verbose "ExceptionMessage: $exceptionMessage" + + $errorMessage = (Get-VstsLocString -Key "AFC_UploadContainerStorageAccount" -ArgumentList $containerName, $storageAccountName, $blobPrefix, $exceptionMessage) + Write-Telemetry "Task_InternalError" "BlobUploadFailed" + ThrowError -errorMessage $errorMessage + } + finally + { + #azcopy logout to remove all credentials + Write-Output "##[command] & `"$azCopyExeLocation`" logout" + $command = "& `"$azCopyExeLocation`" logout" + Invoke-Expression $command + } +} + +function Does-AzureVMMatchTagFilterCriteria +{ + param([object]$azureVMResource, + [string]$filter) + + if($azureVMResource) + { + # If no filters are provided, by default operations are performed on all azure resources + if([string]::IsNullOrEmpty($filter)) + { + return $true + } + + $tagsFilterArray = $filter.Split(';').Trim() + foreach($tag in $tagsFilterArray) + { + $tagKeyValue = $tag.Split(':').Trim() + $tagKey = $tagKeyValue[0] + $tagValues = $tagKeyValue[1] + + if($tagKeyValue.Length -ne 2 -or [string]::IsNullOrWhiteSpace($tagKey) -or [string]::IsNullOrWhiteSpace($tagValues)) + { + Write-Telemetry "Input_Validation" "FILTERING_IncorrectFormat" + throw (Get-VstsLocString -Key "AFC_IncorrectTags") + } + + $tagValueArray = $tagValues.Split(',').Trim() + + if($azureVMResource.Tags) + { + foreach($azureVMResourceTag in $azureVMResource.Tags.GetEnumerator()) + { + if($azureVMResourceTag.Key -contains $tagKey) + { + $azureVMTagValueArray = $azureVMResourceTag.Value.Split(",").Trim() + foreach($tagValue in $tagValueArray) + { + if($azureVMTagValueArray -contains $tagValue) + { + return $true + } + } + } + } + } + } + + return $false + } +} + +function Get-TagBasedFilteredAzureVMs +{ + param([object]$azureVMResources, + [string]$filter) + + if($azureVMResources) + { + $filteredAzureVMResources = @() + foreach($azureVMResource in $azureVMResources) + { + if(Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource -filter $filter) + { + Write-Verbose "azureVM with name: $($azureVMResource.Name) matches filter criteria" + $filteredAzureVMResources += $azureVMResource + } + } + + return $filteredAzureVMResources + } +} + +function Get-MachineBasedFilteredAzureVMs +{ + param([object]$azureVMResources, + [string]$filter) + + if($azureVMResources -and -not [string]::IsNullOrEmpty($filter)) + { + $filteredAzureVMResources = @() + + $machineFilterArray = $filter.Split(',').Trim() + $machineFilterArray = $machineFilterArray | % {$_.ToLower()} | Select -Uniq + foreach($machine in $machineFilterArray) + { + $azureVMResource = $azureVMResources | Where-Object {$_.Name -contains $machine} + if($azureVMResource) + { + $filteredAzureVMResources += $azureVMResource + } + else + { + $commaSeparatedMachinesNotPresentInRG += ($(if($commaSeparatedMachinesNotPresentInRG){", "}) + $machine) + } + + if($commaSeparatedMachinesNotPresentInRG -ne $null) + { + Write-Telemetry "Input_Validation" "FILTERING_MachinesNotPresentInRG" + throw (Get-VstsLocString -Key "AFC_MachineDoesNotExist" -ArgumentList $commaSeparatedMachinesNotPresentInRG) + } + } + + return $filteredAzureVMResources + } +} + +function Get-FilteredAzureVMsInResourceGroup +{ + param([object]$azureVMResources, + [string]$resourceFilteringMethod, + [string]$filter) + + if($azureVMResources -and -not [string]::IsNullOrEmpty($resourceFilteringMethod)) + { + if($resourceFilteringMethod -eq "tags" -or [string]::IsNullOrEmpty($filter)) + { + $filteredAzureVMResources = Get-TagBasedFilteredAzureVMs -azureVMResources $azureVMResources -filter $filter + } + else + { + $filteredAzureVMResources = Get-MachineBasedFilteredAzureVMs -azureVMResources $azureVMResources -filter $filter + } + + return $filteredAzureVMResources + } +} + +function Get-FilteredAzureClassicVMsInResourceGroup +{ + param([object]$azureClassicVMResources, + [string]$resourceFilteringMethod, + [string]$filter) + + if($azureClassicVMResources -and -not [string]::IsNullOrEmpty($resourceFilteringMethod)) + { + Write-Verbose "Filtering azureClassicVM resources with filtering option:'$resourceFilteringMethod' and filters:'$filter'" + $filteredAzureClassicVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureClassicVMResources -resourceFilteringMethod $resourceFilteringMethod -filter $filter + + return $filteredAzureClassicVMResources + } +} + +function Get-FilteredAzureRMVMsInResourceGroup +{ + param([object]$azureRMVMResources, + [string]$resourceFilteringMethod, + [string]$filter) + + if($azureRMVMResources -and -not [string]::IsNullOrEmpty($resourceFilteringMethod)) + { + Write-Verbose "Filtering azureRMVM resources with filtering option:$resourceFilteringMethod and filters:$filter" + $filteredAzureRMVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureRMVMResources -resourceFilteringMethod $resourceFilteringMethod -filter $filter + + return $filteredAzureRMVMResources + } +} + +function Get-MachineNameFromId +{ + param([string]$resourceGroupName, + [System.Collections.Hashtable]$map, + [string]$mapParameter, + [Object]$azureRMVMResources, + [boolean]$throwOnTotalUnavailability, + [string]$debugLogsFlag) + + if($map) + { + if($debugLogsFlag -eq "true") + { + Write-Verbose "Map for $mapParameter : " -verbose + Write-Verbose ($map | Format-List | Out-String) -verbose + + Write-Verbose "azureRMVMResources: " -verbose + Write-Verbose ($azureRMVMResources | Format-List | Out-String) -verbose + } + + Write-Verbose "throwOnTotalUnavailability: $throwOnTotalUnavailability" + + $errorCount = 0 + foreach($vm in $azureRMVMResources) + { + $value = $map[$vm.Id.ToLower()] + $resourceName = $vm.Name + if(-not [string]::IsNullOrEmpty($value)) + { + Write-Verbose "$mapParameter value for resource $resourceName is $value" + $map.Remove($vm.Id.ToLower()) + $map[$resourceName] = $value + } + else + { + $errorCount = $errorCount + 1 + Write-Verbose "Unable to find $mapParameter for resource $resourceName" + } + } + + if($throwOnTotalUnavailability -eq $true) + { + if($errorCount -eq $azureRMVMResources.Count -and $azureRMVMResources.Count -ne 0) + { + throw (Get-VstsLocString -Key "AFC_MachineNameFromIdErrorAllResources" -ArgumentList $mapParameter, $resourceGroupName) + } + else + { + if($errorCount -gt 0 -and $errorCount -ne $azureRMVMResources.Count) + { + Write-Warning (Get-VstsLocString -Key "AFC_MachineNameFromIdError" -ArgumentList $mapParameter, $errorCount, $resourceGroupName) + } + } + } + + return $map + } +} + +function Get-MachinesFqdnsForPublicIP +{ + param([string]$resourceGroupName, + [Object]$publicIPAddressResources, + [Object]$networkInterfaceResources, + [Object]$azureRMVMResources, + [System.Collections.Hashtable]$fqdnMap, + [string]$debugLogsFlag) + + if(-not [string]::IsNullOrEmpty($resourceGroupName)-and $publicIPAddressResources -and $networkInterfaceResources) + { + Write-Verbose "Trying to get FQDN for the azureRM VM resources under public IP from resource Group $resourceGroupName" + + #Map the ipc to the fqdn + foreach($publicIp in $publicIPAddressResources) + { + if(-not [string]::IsNullOrEmpty($publicIp.IpConfiguration.Id)) + { + $publicIPKey = $publicIp.IpConfiguration.Id.ToLower() + Write-Verbose "Adding entry to FQDN map with key $publicIPKey" + + if(-not [string]::IsNullOrEmpty($publicIP.DnsSettings.Fqdn)) + { + Write-Verbose "Inserting to FQDN map with value (FQDN) : $publicIPKey" + $fqdnMap[$publicIPKey] = $publicIP.DnsSettings.Fqdn + } + elseif(-not [string]::IsNullOrEmpty($publicIP.IpAddress)) + { + Write-Verbose "Inserting to FQDN map with value (IP Address) : $publicIPKey" + $fqdnMap[$publicIPKey] = $publicIP.IpAddress + } + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "fqdnMap for MachinesFqdnsForPublicIP after mapping ip configuration to fqdn: " -Verbose + Write-Verbose ($fqdnMap | Format-List | Out-String) -Verbose + } + + #Find out the NIC, and thus the VM corresponding to a given ipc + foreach($nic in $networkInterfaceResources) + { + foreach($ipc in $nic.IpConfigurations) + { + $fqdn = $fqdnMap[$ipc.Id.ToLower()] + if(-not [string]::IsNullOrEmpty($fqdn)) + { + $fqdnMap.Remove($ipc.Id.ToLower()) + if($nic.VirtualMachine) + { + $vmId = $nic.VirtualMachine.Id.ToLower() + Write-Verbose "Adding entry to FQDN map with key $vmId" + $fqdnMap[$vmId] = $fqdn + } + } + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "final fqdnMap for MachinesFqdnsForPublicIP after finding vm id corresponding to ip configuration: " -Verbose + Write-Verbose ($fqdnMap | Format-List | Out-String) -Verbose + } + } + + Write-Verbose "Got FQDN for the azureRM VM resources under public IP from resource Group $resourceGroupName" + + return $fqdnMap +} + +function Get-MachinesFqdnsForLB +{ + param([string]$resourceGroupName, + [Object]$publicIPAddressResources, + [Object]$networkInterfaceResources, + [Object]$frontEndIPConfigs, + [System.Collections.Hashtable]$fqdnMap, + [string]$debugLogsFlag) + + if(-not [string]::IsNullOrEmpty($resourceGroupName) -and $publicIPAddressResources -and $networkInterfaceResources -and $frontEndIPConfigs) + { + Write-Verbose "Trying to get FQDN for the RM azureVM resources under load balancer from resource group: $resourceGroupName" + + #Map the public ip id to the fqdn + foreach($publicIp in $publicIPAddressResources) + { + if(-not [string]::IsNullOrEmpty($publicIp.IpConfiguration.Id)) + { + if(-not [string]::IsNullOrEmpty($publicIP.DnsSettings.Fqdn)) + { + $fqdnMap[$publicIp.Id.ToLower()] = $publicIP.DnsSettings.Fqdn + } + elseif(-not [string]::IsNullOrEmpty($publicIP.IpAddress)) + { + $fqdnMap[$publicIp.Id.ToLower()] = $publicIP.IpAddress + } + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "fqdnMap for MachinesFqdnsForLB after mapping ip configuration to fqdn: " -Verbose + Write-Verbose ($fqdnMap | Format-List | Out-String) -Verbose + } + + #Get the NAT rule for a given ip id + foreach($config in $frontEndIPConfigs) + { + if(-not [string]::IsNullOrEmpty($config.PublicIpAddress.Id)) + { + $fqdn = $fqdnMap[$config.PublicIpAddress.Id.ToLower()] + if(-not [string]::IsNullOrEmpty($fqdn)) + { + $fqdnMap.Remove($config.PublicIpAddress.Id.ToLower()) + foreach($rule in $config.InboundNatRules) + { + $fqdnMap[$rule.Id.ToLower()] = $fqdn + } + } + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "fqdnMap for MachinesFqdnsForLB after getting NAT rule for given ip configuration: " -Verbose + Write-Verbose ($fqdnMap | Format-List | Out-String) -Verbose + } + + #Find out the NIC, and thus the corresponding machine to which the NAT rule belongs + foreach($nic in $networkInterfaceResources) + { + foreach($ipc in $nic.IpConfigurations) + { + foreach($rule in $ipc.LoadBalancerInboundNatRules) + { + $fqdn = $fqdnMap[$rule.Id.ToLower()] + if(-not [string]::IsNullOrEmpty($fqdn)) + { + $fqdnMap.Remove($rule.Id.ToLower()) + if($nic.VirtualMachine) + { + $fqdnMap[$nic.VirtualMachine.Id.ToLower()] = $fqdn + } + } + } + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "final fqdnMap for MachinesFqdnsForLB after getting vm id corresponding to NAT rule for given ip configuration: " -Verbose + Write-Verbose ($fqdnMap | Format-List | Out-String) -Verbose + } + } + + Write-Verbose "Got FQDN for the RM azureVM resources under load balancer from resource Group $resourceGroupName" + + return $fqdnMap +} + +function Get-FrontEndPorts +{ + param([string]$backEndPort, + [System.Collections.Hashtable]$portList, + [Object]$networkInterfaceResources, + [Object]$inboundRules, + [string]$debugLogsFlag) + + if(-not [string]::IsNullOrEmpty($backEndPort) -and $networkInterfaceResources -and $inboundRules) + { + Write-Verbose "Trying to get front end ports for $backEndPort" + + $filteredRules = $inboundRules | Where-Object {$_.BackendPort -eq $backEndPort} + + #Map front end port to back end ipc + foreach($rule in $filteredRules) + { + if($rule.BackendIPConfiguration) + { + $portList[$rule.BackendIPConfiguration.Id.ToLower()] = $rule.FrontendPort + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "portList for FrontEndPorts after mapping front end port to backend ip configuration: " -Verbose + Write-Verbose ($portList | Format-List | Out-String) -Verbose + } + + #Get the nic, and the corresponding machine id for a given back end ipc + foreach($nic in $networkInterfaceResources) + { + foreach($ipConfig in $nic.IpConfigurations) + { + $frontEndPort = $portList[$ipConfig.Id.ToLower()] + if(-not [string]::IsNullOrEmpty($frontEndPort)) + { + $portList.Remove($ipConfig.Id.ToLower()) + if($nic.VirtualMachine) + { + $portList[$nic.VirtualMachine.Id.ToLower()] = $frontEndPort + } + } + } + } + + if($debugLogsFlag -eq "true") + { + Write-Verbose "portList for FrontEndPorts after getting vm id corresponding to given backend ip configuration, after finding nic: " -Verbose + Write-Verbose ($portList | Format-List | Out-String) -Verbose + } + } + + Write-Verbose "Got front end ports for $backEndPort" + return $portList +} + +function Get-AzureRMVMsConnectionDetailsInResourceGroup +{ + param([string]$resourceGroupName, + [object]$azureRMVMResources, + [string]$enableCopyPrerequisites, + [string]$connectedServiceName) + + [hashtable]$fqdnMap = @{} + $winRMHttpsPortMap = New-Object 'System.Collections.Generic.Dictionary[string, string]' + [hashtable]$azureRMVMsDetails = @{} + $debugLogsFlag= $env:system_debug + + # Getting endpoint used for the task + if($connectedServiceName) + { + $endpoint = Get-Endpoint -connectedServiceName $connectedServiceName + } + + $isAzureStackEnvironment = $false + if($endpoint -and $endpoint.Data -and $endpoint.Data.Environment) { + $environmentName = $Endpoint.Data.Environment + if($environmentName -eq $azureStackEnvironment) + { + $isAzureStackEnvironment = $true + } + } + + if (-not [string]::IsNullOrEmpty($resourceGroupName) -and $azureRMVMResources) + { + + if($isAzureStackEnvironment) + { + Write-Verbose "Fetching resource group resources details for Azure Stack environment." + $azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetailsForAzureStack -resourceGroupName $resourceGroupName ` + -azureRMVMResources $azureRMVMResources -endpoint $endpoint -connectedServiceNameARM $connectedServiceName + } + else + { + Write-Verbose "Fetching resource group resources details for Azure/National cloud environments." + $azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetails -resourceGroupName $resourceGroupName -azureRMVMResources $azureRMVMResources + } + + $networkInterfaceResources = $azureRGResourcesDetails["networkInterfaceResources"] + $publicIPAddressResources = $azureRGResourcesDetails["publicIPAddressResources"] + $loadBalancerResources = $azureRGResourcesDetails["loadBalancerResources"] + + if($loadBalancerResources) + { + foreach($lbName in $loadBalancerResources.Keys) + { + $lbDetails = $loadBalancerResources[$lbName] + $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"] + $inboundRules = $lbDetails["inboundRules"] + + $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $resourceGroupName -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources ` + -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap -debugLogsFlag $debugLogsFlag + $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources ` + -inboundRules $inboundRules -debugLogsFlag $debugLogsFlag + } + + $winRMHttpsPortMap = Get-MachineNameFromId -Map $winRMHttpsPortMap -MapParameter "Front End port" -azureRMVMResources $azureRMVMResources ` + -throwOnTotalUnavailability $false -debugLogsFlag $debugLogsFlag + } + + $fqdnMap = Get-MachinesFqdnsForPublicIP -resourceGroupName $resourceGroupName -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources ` + -azureRMVMResources $azureRMVMResources -fqdnMap $fqdnMap -debugLogsFlag $debugLogsFlag + $fqdnMap = Get-MachineNameFromId -resourceGroupName $resourceGroupName -Map $fqdnMap -MapParameter "FQDN" -azureRMVMResources $azureRMVMResources ` + -throwOnTotalUnavailability $true -debugLogsFlag $debugLogsFlag + + foreach ($resource in $azureRMVMResources) + { + $resourceName = $resource.Name + $resourceId = $resource.Id + $resourceFQDN = $fqdnMap[$resourceName] + $resourceWinRMHttpsPort = $winRMHttpsPortMap[$resourceName] + if([string]::IsNullOrWhiteSpace($resourceWinRMHttpsPort)) + { + Write-Verbose "Defaulting WinRmHttpsPort of $resourceName to 5986" + $resourceWinRMHttpsPort = "5986" + } + + $resourceProperties = @{} + $resourceProperties.Name = $resourceName + $resourceProperties.fqdn = $resourceFQDN + $resourceProperties.winRMHttpsPort = $resourceWinRMHttpsPort + + $azureRMVMsDetails.Add($resourceName, $resourceProperties) + + if ($enableCopyPrerequisites -eq "true") + { + Write-Verbose "Enabling winrm for virtual machine $resourceName" -Verbose + Add-AzureVMCustomScriptExtension -resourceGroupName $resourceGroupName -vmId $resourceId -vmName $resourceName -dnsName $resourceFQDN ` + -location $resource.Location -connectedServiceName $connectedServiceName + } + } + + return $azureRMVMsDetails + } +} + +function Get-AzureVMResourcesProperties +{ + param([string]$resourceGroupName, + [string]$resourceFilteringMethod, + [string]$machineNames, + [string]$enableCopyPrerequisites, + [string]$connectedServiceName) + + $machineNames = $machineNames.Trim() + if(-not [string]::IsNullOrEmpty($resourceGroupName)) + { + $azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $resourceGroupName + $filteredAzureRMVMResources = Get-FilteredAzureRMVMsInResourceGroup -azureRMVMResources $azureRMVMResources -resourceFilteringMethod $resourceFilteringMethod -filter $machineNames + $azureVMsDetails = Get-AzureRMVMsConnectionDetailsInResourceGroup -resourceGroupName $resourceGroupName -azureRMVMResources $filteredAzureRMVMResources ` + -enableCopyPrerequisites $enableCopyPrerequisites -connectedServiceName $connectedServiceName + + # throw if no azure VMs found in resource group or due to filtering + if($azureVMsDetails.Count -eq 0) + { + if([string]::IsNullOrEmpty($machineNames)) + { + Write-Telemetry "Input_Validation" "PREREQ_NoRMVMResources" + throw (Get-VstsLocString -Key "AFC_NoARMVMResources" -ArgumentList $resourceGroupName, $connectedServiceName) + } + else + { + Write-Telemetry "Input_Validation" "FILTERING_NoVMResources" + throw (Get-VstsLocString -Key "AFC_FilteringNoVMResources" -ArgumentList $resourceGroupName, $resourceFilteringMethod, $machineNames) + } + } + + return $azureVMsDetails + } +} + +function Get-AzureVMsCredentials +{ + param([string][Parameter(Mandatory=$true)]$vmsAdminUserName, + [string][Parameter(Mandatory=$true)]$vmsAdminPassword) + + Write-Verbose "Azure VMs Admin Username: $vmsAdminUserName" + $azureVmsCredentials = New-Object 'System.Net.NetworkCredential' -ArgumentList $vmsAdminUserName, $vmsAdminPassword + + return $azureVmsCredentials +} + +function Copy-FilesParallellyToAzureVMs +{ + param( + [string[]]$targetMachineNames, + [pscredential]$credential, + [string]$protocol, + [object]$remoteScriptJobArguments, + [object]$sessionOption, + [bool]$enableDetailedLogging + ) + + Write-Verbose "Starting parallel file copy" + + try + { + $parallelCopyJobResults = Invoke-RemoteScript -targetMachineNames $targetMachineNames ` + -credential $credential ` + -protocol $protocol ` + -remoteScriptJobArguments $remoteScriptJobArguments ` + -sessionOption $sessionOption ` + -uploadLogFiles:$enableDetailedLogging + + Write-Verbose "Parallel file copy: Invoke-RemoteScript completed" + } + catch + { + Write-Verbose "Parallel file copy: Invoke-RemoteScript threw exception" + throw + } + + # Write job status for every VM + $isFileCopyFailed = $false + $parallelCopyJobResults | ForEach-Object { + if($_.ExitCode -eq 0) + { + Write-Verbose "Copy source files status for $($_.ComputerName): Successful" + } + else + { + $isFileCopyFailed = $true + Write-Verbose "Copy source files status for $($_.ComputerName): Failed" + } + } + + # Throw if any of the remote jobs failed + if($isFileCopyFailed) + { + ThrowError -errorMessage (Get-VstsLocString -Key "AFC_ParallelCopyFailed") + } + + Write-Verbose "Successfully finished parallel file copy" +} + +function Copy-FilesSequentiallyToAzureVMs +{ + param( + [string[]]$targetMachineNames, + [pscredential]$credential, + [string]$protocol, + [object]$remoteScriptJobArguments, + [object]$sessionOption, + [bool]$enableDetailedLogging + ) + + Write-Verbose "Starting sequential file copy" + + $targetMachineNames | ForEach-Object { + Write-Output (Get-VstsLocString -Key "AFC_CopyStarted" -ArgumentList $_) + $targetMachineName = @($_) + + try + { + $copyJobResult = Invoke-RemoteScript -targetMachineNames $targetMachineName ` + -credential $credential ` + -protocol $protocol ` + -remoteScriptJobArguments $remoteScriptJobArguments ` + -sessionOption $sessionOption ` + -uploadLogFiles:$enableDetailedLogging + + Write-Verbose "Sequential file copy: Invoke-RemoteScript completed" + } + catch + { + Write-Verbose "Sequential file copy: Invoke-RemoteScript threw exception" + throw + } + + if($copyJobResult.ExitCode -eq 0) + { + Write-Verbose "Copy source files status for $_ : Successful" + } + else + { + Write-Verbose "Copy source files status for $_ : Failed" + ThrowError -errorMessage (Get-VstsLocString -Key "AFC_CopyFailed" -ArgumentList $_) + } + } + + Write-Verbose "Successfully finished sequential file copy" +} + +function Copy-FilesToAzureVMsFromStorageContainer +{ + param( + [string[]]$targetMachineNames, + [pscredential]$credential, + [string]$protocol, + [object]$sessionOption, + [string]$blobStorageEndpoint, + [string]$containerName, + [string]$containerSasToken, + [string]$targetPath, + [bool]$cleanTargetBeforeCopy, + [bool]$copyFilesInParallel, + [string]$additionalArguments, + [string]$azCopyToolLocation, + [scriptblock]$fileCopyJobScript, + [bool]$enableDetailedLogging, + [bool]$useSanitizerActivate = $false + ) + + # Generate storage container URL + $containerURL = [string]::Format("{0}/{1}", $blobStorageEndpoint.Trim("/"), $containerName) + + $azCopyToolFileNames = Get-ChildItem $azCopyToolLocation | Select-Object -ExpandProperty Name + $azCopyToolFilePaths = Get-ChildItem $azCopyToolLocation | Select-Object -ExpandProperty FullName + + $azCopyToolFileContents = @() + + foreach ($file in $azCopyToolFilePaths) + { + $azCopyToolFileContents += [Convert]::ToBase64String([System.IO.File]::ReadAllBytes($file)) + } + + # script block arguments + $scriptBlockArgs = " -containerURL '$containerURL' -targetPath '$targetPath' -containerSasToken '$containerSasToken' -additionalArguments '$additionalArguments'" + if($cleanTargetBeforeCopy) + { + $scriptBlockArgs += " -CleanTargetBeforeCopy" + } + if($enableDetailedLogging) + { + $scriptBlockArgs += " -EnableDetailedLogging" + } + if($useSanitizerActivate) + { + $scriptBlockArgs += " -useSanitizerActivate" + } + + $remoteScriptJobArguments = @{ + inline = $true; + inlineScript = $fileCopyJobScript.ToString(); + scriptArguments = $scriptBlockArgs; + errorActionPreference = "Stop"; + failOnStdErr = $true; + } + + if($copyFilesInParallel) + { + Copy-FilesParallellyToAzureVMs -targetMachineNames $targetMachineNames ` + -credential $credential ` + -protocol $protocol ` + -remoteScriptJobArguments $remoteScriptJobArguments ` + -sessionOption $sessionOption ` + -enableDetailedLogging $enableDetailedLogging + } + else + { + Copy-FilesSequentiallyToAzureVMs -targetMachineNames $targetMachineNames ` + -credential $credential ` + -protocol $protocol ` + -remoteScriptJobArguments $remoteScriptJobArguments ` + -sessionOption $sessionOption ` + -enableDetailedLogging $enableDetailedLogging + } +} + +function Validate-CustomScriptExecutionStatus +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$extensionName, + [object]$endpoint, + [string]$connectedServiceNameARM) + + Write-Verbose "Validating the winrm configuration custom script extension status" + + $isScriptExecutionPassed = $true + try + { + $status = Get-AzureMachineStatus -resourceGroupName $resourceGroupName -Name $vmName + + # For AzurePS < 1.0.4 $_.ExtensionType is applicable. + $customScriptExtension = $status.Extensions | Where-Object { ($_.ExtensionType -eq "Microsoft.Compute.CustomScriptExtension" -or $_.Type -eq "Microsoft.Compute.CustomScriptExtension") -and $_.Name -eq $extensionName } + + if($customScriptExtension) + { + $subStatuses = $customScriptExtension.SubStatuses + $subStatusesStr = $subStatuses | Out-String + + Write-Verbose "Custom script extension execution statuses: $subStatusesStr" + + if($subStatuses) + { + foreach($subStatus in $subStatuses) + { + if($subStatus.Code.Contains("ComponentStatus/StdErr") -and (-not [string]::IsNullOrEmpty($subStatus.Message))) + { + $isScriptExecutionPassed = $false + $errMessage = $subStatus.Message + break + } + } + } + else + { + $isScriptExecutionPassed = $false + $errMessage = "No execution status exists for the custom script extension '$extensionName'" + } + } + else + { + $isScriptExecutionPassed = $false + $errMessage = "No custom script extension '$extensionName' exists" + } + } + catch + { + $isScriptExecutionPassed = $false + $errMessage = $_.Exception.Message + } + + if(-not $isScriptExecutionPassed) + { + $response = Remove-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName ` + -endpoint $endpoint -connectedServiceNameARM $connectedServiceNameARM + throw (Get-VstsLocString -Key "AFC_SetCustomScriptExtensionFailed" -ArgumentList $extensionName, $vmName, $errMessage) + } + + Write-Verbose "Validated the script execution successfully" +} + +function Is-WinRMCustomScriptExtensionExists +{ + param([string]$resourceGroupName, + [string]$vmName, + [string]$extensionName, + [string]$connectedServiceName) + + $isExtensionExists = $true + $removeExtension = $false + + try + { + $serviceEndpoint = Get-Endpoint $connectedServiceName + $customScriptExtension = Get-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName ` + -endpoint $serviceEndpoint -connectedServiceNameARM $connectedServiceName + + if($customScriptExtension) + { + if($customScriptExtension.ProvisioningState -ne "Succeeded") + { + $removeExtension = $true + } + else + { + try + { + Validate-CustomScriptExecutionStatus -resourceGroupName $resourceGroupName -vmName $vmName -extensionName $extensionName -endpoint $serviceEndpoint + } + catch + { + $isExtensionExists = $false + } + } + } + else + { + $isExtensionExists = $false + } + } + catch + { + $isExtensionExists = $false + } + + if($removeExtension) + { + $response = Remove-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName ` + -endpoint $serviceEndpoint -connectedServiceNameARM $connectedServiceName + + try + { + $index = 1 + $maxCount = 45 # Setting timeout for deleting extension as 15 mins. + + while($index -le $maxCount) { + Write-Verbose "Checking WinRM custom script extension status $index times" + + $customScriptExtension = Get-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName ` + -endpoint $serviceEndpoint -connectedServiceNameARM $connectedServiceName + + if(-not $customScriptExtension -or $customScriptExtension.ProvisioningState -ne "deleting") + { + break + } + + start-sleep -s 20 + $index = $index + 1 + } + } + catch + { + Write-Verbose ("Failed to get extension with error : " + $_.exception.message) + } + + if ($index -gt $maxCount) + { + Write-Warning (Get-VstsLocString -Key AFC_UninstallWinRMCustomScriptExtension) + } + + $isExtensionExists = $false + } + + $isExtensionExists +} + +function Get-TargetUriFromFwdLink { + param( + [string]$fwdLink + ) + Write-Verbose "Trying to get the target uri from the fwdLink: $fwdLink" + $proxy = Get-VstsWebProxy + Add-Type -AssemblyName System.Net.Http + $validHttpRedirectCodes = @( + [System.Net.HttpStatusCode]::Moved, + [System.Net.HttpStatusCode]::MovedPermanently, + [System.Net.HttpStatusCode]::Found, + [System.Net.HttpStatusCode]::Redirect, + [System.Net.HttpStatusCode]::RedirectKeepVerb, + [System.Net.HttpStatusCode]::TemporaryRedirect + ) + $HttpClientHandler = New-Object System.Net.Http.HttpClientHandler + $HttpClientHandler.Proxy = $proxy + $HttpClientHandler.AllowAutoRedirect = $false + $HttpClient = New-Object System.Net.Http.HttpClient -ArgumentList $HttpClientHandler + $response = $HttpClient.GetAsync($fwdLink) + $response.Wait() + if($validHttpRedirectCodes.IndexOf($response.Result.StatusCode) -eq -1) { + Write-Verbose "The http response code: $([int]$response.Result.StatusCode) is not a valid redirect response code." + throw (Get-VstsLocString -Key "AFC_RedirectResponseInvalidStatusCode" -ArgumentList $([int]$response.Result.StatusCode)) + } + $targetUri = $response.Result.Headers.Location.AbsoluteUri + if([string]::IsNullOrEmpty($targetUri)) { + Write-Verbose "The target uri is null" + throw (Get-VstsLocString -Key "AFC_RedirectResponseLocationHeaderIsNull") + } + Write-Verbose "The target uri is: $targetUri" + return $targetUri +} + +function Add-WinRMHttpsNetworkSecurityRuleConfig +{ + param([string]$resourceGroupName, + [string]$vmId, + [string]$ruleName, + [string]$rulePriotity, + [string]$winrmHttpsPort) + + Write-Verbose "Trying to add a network security group rule" + + try + { + $securityGroups = Get-NetworkSecurityGroups -resourceGroupName $resourceGroupName -vmId $vmId + + if($securityGroups.Count -gt 0) + { + Add-NetworkSecurityRuleConfig -resourceGroupName $resourceGroupName -securityGroups $securityGroups -ruleName $ruleName -rulePriotity $rulePriotity -winrmHttpsPort $winrmHttpsPort + } + } + catch + { + Write-Telemetry "Task_InternalError" "NetworkSecurityRuleConfigFailed" + Write-Warning (Get-VstsLocString -Key "AFC_AddNetworkSecurityRuleFailed" -ArgumentList $_.exception.message) + } +} + +function Add-AzureVMCustomScriptExtension +{ + param([string]$resourceGroupName, + [string]$vmId, + [string]$vmName, + [string]$dnsName, + [string]$location, + [string]$connectedServiceName) + + $configWinRMScriptFileFwdLink ="https://aka.ms/vstsconfigurewinrm" + $makeCertFileFwdLink ="https://aka.ms/vstsmakecertexe" + $scriptToRun="ConfigureWinRM.ps1" + $extensionName="WinRMCustomScriptExtension" + $ruleName = "VSO-Custom-WinRM-Https-Port" + $rulePriotity="3986" + $winrmHttpsPort = "5986" + + Write-Verbose "Adding custom script extension '$extensionName' for virtual machine '$vmName'" + Write-Verbose "VM Location : $location" + Write-Verbose "VM DNS : $dnsName" + + try + { + $endpoint = Get-Endpoint $connectedServiceName + $isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $resourceGroupName -vmName $vmName -extensionName $extensionName ` + -connectedServiceName $connectedServiceName + Write-Verbose -Verbose "IsExtensionExists: $isExtensionExists" + + if($isExtensionExists) + { + Add-WinRMHttpsNetworkSecurityRuleConfig -resourceGroupName $resourceGroupName -vmId $vmId -ruleName $ruleName -rulePriotity $rulePriotity -winrmHttpsPort $winrmHttpsPort + + Write-Verbose "Skipping the addition of custom script extension '$extensionName' as it already exists" + return + } + + $configWinRMScriptFile = Get-TargetUriFromFwdLink -fwdLink $configWinRMScriptFileFwdLink + $makeCertFile = Get-TargetUriFromFwdLink -fwdLink $makeCertFileFwdLink + + $result = Set-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName -fileUri $configWinRMScriptFile, $makeCertFile -run $scriptToRun -argument $dnsName -location $location + $resultDetails = $result | ConvertTo-Json + Write-Verbose "Set-AzureMachineCustomScriptExtension completed with response : $resultDetails" + + if($result.Status -ne "Succeeded") + { + Write-Telemetry "Task_InternalError" "ProvisionVmCustomScriptFailed" + + $response = Remove-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName ` + -endpoint $endpoint -connectedServiceNameARM $connectedServiceName + throw (Get-VstsLocString -Key "AFC_UnableToSetCustomScriptExtension" -ArgumentList $extensionName, $vmName, $result.Error.Message) + } + + Validate-CustomScriptExecutionStatus -resourceGroupName $resourceGroupName -vmName $vmName -extensionName $extensionName -endpoint $endpoint + Add-WinRMHttpsNetworkSecurityRuleConfig -resourceGroupName $resourceGroupName -vmId $vmId -ruleName $ruleName -rulePriotity $rulePriotity -winrmHttpsPort $winrmHttpsPort + } + catch + { + Write-Telemetry "Task_InternalError" "ExecutionOfVmCustomScriptFailed:$exceptionType" + throw (Get-VstsLocString -Key "AFC_CopyPrereqsFailed" -ArgumentList $_.exception.message) + } + + Write-Verbose "Successfully added the custom script extension '$extensionName' for virtual machine '$vmName'" +} + +function Check-ContainerNameAndArgs +{ + param([string]$containerName, + [string]$additionalArguments) + + $additionalArguments = ' ' + $additionalArguments + ' ' + if($containerName -eq '$root' -and $additionalArguments -like '* --recursive *') + { + Write-Warning (Get-vstsLocString -Key "AFC_RootContainerAndDirectory") + } +} + +function Get-InvokeRemoteScriptParameters +{ + param([object][Parameter(Mandatory=$true)]$azureVMResourcesProperties, + [object]$networkCredentials, + [bool]$skipCACheck) + + $sessionOption = New-PSSessionOption -SkipCACheck:$skipCACheck + + $psCredentials = New-Object PSCredential($networkCredentials.UserName, (ConvertTo-SecureString $networkCredentials.Password -AsPlainText -Force)) + + $targetMachines = @() + foreach($vm in $azureVMResourcesProperties.Values) + { + $targetMachines += [string]::Format("{0}:{1}", $vm.fqdn, $vm.winRMHttpsPort) + } + + $protocol = 'https' + + return @{ + targetMachineNames = $targetMachines; + credential = $psCredentials; + protocol = $protocol; + sessionOption = $sessionOption + } +} + +function CleanUp-PSModulePathForHostedAgent { + + # Define the module paths to clean up + $modulePaths = @( + "C:\Modules\azurerm_2.1.0", + "C:\\Modules\azurerm_2.1.0", + "C:\Modules\azure_2.1.0", + "C:\\Modules\azure_2.1.0" + ) + + # Clean up PSModulePath for hosted agent + $newEnvPSModulePath = $env:PSModulePath + + foreach ($modulePath in $modulePaths) { + if ($newEnvPSModulePath.split(";") -contains $modulePath) { + $newEnvPSModulePath = (($newEnvPSModulePath).Split(";") | ? { $_ -ne $modulePath }) -join ";" + Write-Verbose "$modulePath removed. Restart the prompt for the changes to take effect." + } + else { + Write-Verbose "$modulePath is not present in $newEnvPSModulePath" + } + } + + if (Test-Path "C:\Modules\az_*") { + $azPSModulePath = (Get-ChildItem "C:\Modules\az_*" -Directory ` + | Sort-Object { [version]$_.Name.Split('_')[-1] } ` + | Select-Object -Last 1).FullName + + Write-Verbose "Found Az module path $azPSModulePath, will be used" + $env:PSModulePath = ($azPSModulePath + ";" + $newEnvPSModulePath).Trim(";") + } +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/icon.png b/_generated/AzureFileCopyV5/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7360d562f9528de743293a050cadba09609f1e77 GIT binary patch literal 517 zcmV+g0{Z=lP)j0{%rBW#} zL?Qq|2%sDWAi?{9h-hD&fjHyh!?`J9mp^$L&bvBK!faY~60bl|TRW^Lao9(f=%Gx5;^%TIRMEzh`dye~S zfW2m$r*8PzyRBtbmpnIJ0MK~pvDa+#(CI~9o^ru+*9A6{1KhWJ@!C*C2A<31263Co z0q#4>&1>)4S_8x8`##2)&;0p|{VpiHdKMds1l<@Tz!SiBZq6E@t1P?Fz#%|=BOM3g z7#DYYRc(ZAcUP_MEoaX=oIU%I?gKyYs;ahz=5Bq(CcgIpP%70(pw28D00000NkvXX Hu0mjf@i*zm literal 0 HcmV?d00001 diff --git a/_generated/AzureFileCopyV5/icon.svg b/_generated/AzureFileCopyV5/icon.svg new file mode 100644 index 000000000000..3debdb04649f --- /dev/null +++ b/_generated/AzureFileCopyV5/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/_generated/AzureFileCopyV5/make.json b/_generated/AzureFileCopyV5/make.json new file mode 100644 index 000000000000..c70f8608f179 --- /dev/null +++ b/_generated/AzureFileCopyV5/make.json @@ -0,0 +1,73 @@ +{ + "rm": [ + { + "items": [ + "node_modules/https-proxy-agent/node_modules/agent-base", + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/agent-base", + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/azure-pipelines-task-lib" + ], + "options": "-Rf" + } + ], + "common": [ + { + "module": "../Common/VstsAzureHelpers_", + "type": "ps" + }, + { + "module": "../Common/VstsAzureRestHelpers_", + "type": "ps" + }, + { + "module": "../Common/Deployment/TelemetryHelper", + "type": "ps" + }, + { + "module": "../Common/TlsHelper_", + "type": "ps" + }, + { + "module": "../Common/RemoteDeployer", + "type": "ps" + }, + { + "module": "../Common/Sanitizer", + "type": "ps" + } + ], + "externals": { + "archivePackages": [ + { + "url": "https://vstsagenttools.blob.core.windows.net/tools/azcopy/10.12/AzCopy.zip", + "dest": "./" + } + ], + "nugetv2": [ + { + "name": "VstsTaskSdk", + "version": "0.21.0", + "repository": "https://www.powershellgallery.com/api/v2/", + "cp": [ + { + "source": [ + "*.dll", + "*.ps1", + "*.psd1", + "*.psm1", + "lib.json", + "Strings" + ], + "dest": "ps_modules/VstsTaskSdk/", + "options": "-R" + } + ] + } + ] + }, + "cp": [ + { + "source": "MimeMapping.json", + "options": "-R" + } + ] +} diff --git a/_generated/AzureFileCopyV5/package-lock.json b/_generated/AzureFileCopyV5/package-lock.json new file mode 100644 index 000000000000..494aedecbac8 --- /dev/null +++ b/_generated/AzureFileCopyV5/package-lock.json @@ -0,0 +1,1793 @@ +{ + "name": "AzureFileCopyV5", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "AzureFileCopyV5", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^24.10.0", + "@types/q": "1.0.7", + "agent-base": "6.0.2", + "azure-pipelines-task-lib": "^5.2.7", + "azure-pipelines-tasks-azure-arm-rest": "^3.274.0", + "moment": "^2.29.4", + "uuid": "^8.3.0" + }, + "devDependencies": { + "typescript": "^5.7.2" + } + }, + "node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha1-Qv4MyrI4QdmQWBLFjxCC0neEVm0=", + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.10.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-auth/-/core-auth-1.10.1.tgz", + "integrity": "sha1-aKF/qGHr0U9v0xQFV5g1Xva+3xs=", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-util": "^1.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.10.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-client/-/core-client-1.10.1.tgz", + "integrity": "sha1-g9ePl9ZHqyLmgRp6aLtCI+eh0Bk=", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.23.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-rest-pipeline/-/core-rest-pipeline-1.23.0.tgz", + "integrity": "sha1-NfFuHBgMqVRcJgrBJLdRvh2pwIw=", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.3.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-tracing/-/core-tracing-1.3.1.tgz", + "integrity": "sha1-6XEEXJAeqcEQYWsOHbJyUHeB1fY=", + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.13.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-util/-/core-util-1.13.1.tgz", + "integrity": "sha1-bf8v9tPJxkMMb007PmXeUx8Quv4=", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/identity": { + "version": "4.13.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/identity/-/identity-4.13.1.tgz", + "integrity": "sha1-vcCRZYuqWaR+6furSHpLsBhym8M=", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.17.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^5.5.0", + "@azure/msal-node": "^5.1.0", + "open": "^10.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/logger/-/logger-1.3.0.tgz", + "integrity": "sha1-VQHPhdT1JjBgKozHXfdlaMlpqCc=", + "license": "MIT", + "dependencies": { + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/msal-browser": { + "version": "5.6.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-browser/-/msal-browser-5.6.3.tgz", + "integrity": "sha1-3JC+l9ChwY28kyDp5n7cMpaXfqk=", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.4.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": { + "version": "16.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-16.4.1.tgz", + "integrity": "sha1-HVDFiCd6yXqCMZEwIyP8YMmoNXQ=", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "14.16.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-14.16.1.tgz", + "integrity": "sha1-0j7M5AgjpNA610Fg3IGdYuDAp4c=", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-5.1.2.tgz", + "integrity": "sha1-FeqtaVmWayqII0+1aJLXuNavnWI=", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.4.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@azure/msal-node/node_modules/@azure/msal-common": { + "version": "16.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-16.4.1.tgz", + "integrity": "sha1-HVDFiCd6yXqCMZEwIyP8YMmoNXQ=", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha1-LAZOywsxKNg30nZKoLEXsP9uRYY=", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mocha": { + "version": "5.2.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha1-MV1XDMtWxTRS/4Y4c432BybVtuo=", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.14", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-24.10.14.tgz", + "integrity": "sha1-N0VQoH4kyeTmBM6t+t3sTdYPqpA=", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/q": { + "version": "1.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/q/-/q-1.0.7.tgz", + "integrity": "sha1-r9TGEPFvY4bTIOBzjsOLp9NDGRc=", + "license": "MIT" + }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.3.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.5.tgz", + "integrity": "sha1-zMmzVGSqjakJgtAFU9SaXFkdlfM=", + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@typespec/ts-http-runtime/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha1-48121MVI7oldPD/Y3B9sW5Ay56g=", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@typespec/ts-http-runtime/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha1-2o3+rH2hMLBcK6S1nJts1mYRprk=", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha1-C15Md58H3t6lgFzcyxFHBx2UqQk=", + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c=", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/async-mutex": { + "version": "0.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/async-mutex/-/async-mutex-0.4.1.tgz", + "integrity": "sha1-vM9VuW8rr435DteYy1VEofbuTCw=", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/azure-devops-node-api": { + "version": "15.1.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-devops-node-api/-/azure-devops-node-api-15.1.3.tgz", + "integrity": "sha1-X6phYKWoJOiNKVj3nCDsPWbH0VM=", + "license": "MIT", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "2.1.0" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/azure-devops-node-api/node_modules/typed-rest-client": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typed-rest-client/-/typed-rest-client-2.1.0.tgz", + "integrity": "sha1-8Exs/KvGASwtA2uAbqrEVWBPFZg=", + "license": "MIT", + "dependencies": { + "des.js": "^1.1.0", + "js-md4": "^0.3.2", + "qs": "^6.10.3", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/azure-pipelines-task-lib": { + "version": "5.2.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.2.7.tgz", + "integrity": "sha1-pY9MlvwgHQQKkQ7iINpX6lthWlg=", + "license": "MIT", + "dependencies": { + "adm-zip": "^0.5.10", + "minimatch": "^3.1.5", + "nodejs-file-downloader": "^4.11.1", + "q": "^1.5.1", + "semver": "^5.7.2", + "shelljs": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "node_modules/azure-pipelines-task-lib/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest": { + "version": "3.274.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tasks-azure-arm-rest/-/azure-pipelines-tasks-azure-arm-rest-3.274.0.tgz", + "integrity": "sha1-b7Zug9HepCuIlzCMhBzboQw+uyI=", + "license": "MIT", + "dependencies": { + "@azure/identity": "^4.13.1", + "@types/jsonwebtoken": "^8.5.8", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "async-mutex": "^0.4.0", + "azure-devops-node-api": "^15.1.3", + "azure-pipelines-task-lib": "^5.2.4", + "https-proxy-agent": "^4.0.0", + "jsonwebtoken": "^9.0.3", + "msalv1": "npm:@azure/msal-node@^1.18.4", + "msalv2": "npm:@azure/msal-node@^2.7.0", + "msalv3": "npm:@azure/msal-node@^3.5.3", + "node-fetch": "^2.6.7", + "q": "1.5.1", + "typed-rest-client": "^2.2.0", + "xml2js": "0.6.2" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-10.17.60.tgz", + "integrity": "sha1-NfPWIT2u2V2n8Pc+dbzGmA6QWXs=", + "license": "MIT" + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/q/-/q-1.5.4.tgz", + "integrity": "sha1-FZJUFOCtLNdlv+9YhC9+JqesyyQ=", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha1-q5tFRGblqMw6GHvqrVgEEqnFuEM=", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/braces/-/braces-3.0.3.tgz", + "integrity": "sha1-SQMy9AkZRSJy1VqEgK3AxEE1h4k=", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", + "license": "BSD-3-Clause" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha1-87lrNBYNZDGhnXaIE1r3z7h5eIk=", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha1-S1QowiK+mF15w9gmV0edvgtZstY=", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha1-I43pNdKippKSjFOMfM+pEGf9Bio=", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha1-ilj+ePANzXDDcEUXWd+/rwPo7p8=", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/debug/-/debug-4.4.3.tgz", + "integrity": "sha1-xq5DLZvZZiWC/OCHCbA4xY6ePWo=", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha1-J5LohvJCKJRUWUfMgOGkRElsWXY=", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha1-96fMuPUQS/jg9xujscz6Xq/bIeg=", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha1-27Ga37dG1/xtc0oGty9KANAhJV8=", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha1-HTf1dm87v/Tuljjocah2jBc7gdo=", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha1-165mfh3INIL4tw/Q9u78UNow9Yo=", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha1-rg8PothQRe8UqBfao86azQSJ5b8=", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha1-mD6y+aZyTpMD9hrd8BHHLgngsPo=", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha1-BfdaJdq5jk+x3NXhRywFRtUFfI8=", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha1-HE8sSDcydZfOadLKGQp/3RcjOME=", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/execa/-/execa-5.1.1.tgz", + "integrity": "sha1-+ArZy/Qpj3vR1MlVXCHpN0HEEd0=", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha1-0G1YXOjbqQoWsFBcVDw8z7OuuBg=", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha1-ynUKENySW8ixiDn9ID4+9LPO1nU=", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha1-RCZdPKwH4+p9wkdRY4BkN1SgUpI=", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha1-d31z1yqS+OxNLkEOtHNSpWuOg0A=", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha1-LALYZNl/PqbIgwxGTL0Rq26rehw=", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE=", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha1-FQs/J0OGnvPoUewMSdFbHRTQDuE=", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha1-omLY7vZ6ztV8KFKtYWdSakPL97c=", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha1-ifVrghe9vIgCvSmd9tfxCB1+UaE=", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha1-/JxqeDoISVHQuXH+EBjegTcHozg=", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha1-AD6vkb563DcuhOxZ3DclLO24AAM=", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha1-mosfJGhmwChQlIZYX2K48sGMJw4=", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha1-48121MVI7oldPD/Y3B9sW5Ay56g=", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha1-cCtx+1UgoTKmbeH2dUHZ5iFU2Cs=", + "license": "MIT", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/https-proxy-agent/node_modules/agent-base": { + "version": "5.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha1-6Ps/JClZ20TWO+Zl23qOc5U3oyw=", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha1-3JH8ukLk0G5Kuu0zs+ejwC9RTqA=", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "license": "ISC" + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha1-kAk6oxBid9inelkQ265xdH4VogA=", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha1-6B+6aZZi6zHb2vJnZqYdSBRxfqQ=", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha1-+sHj1TuXrVqdCunO8jifWBClwHc=", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha1-MniXsmgyo+sRfabCdJLQTKEyWU8=", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "license": "ISC" + }, + "node_modules/js-md4": { + "version": "0.3.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/js-md4/-/js-md4-0.3.2.tgz", + "integrity": "sha1-zTs9wEWwxARVbIHdtXVsI+WdfPU=", + "license": "MIT" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha1-bNV6sB6bCsB8uEfVPTybbuMfeuI=", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/semver/-/semver-7.7.3.tgz", + "integrity": "sha1-S19BQ9AHYzqNxnHNCm75FHuLuUY=", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha1-v4F20a0M1y4PP1gzhZWhPhELyAQ=", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jws/-/jws-4.0.1.tgz", + "integrity": "sha1-B+3Bvo+sIOZ3soPs4mFJi9OPBpA=", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha1-oN10voHiqlwvJ+Zc4oNgXuTit/k=", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha1-1m+hjzpHB2eJMgubGvMr2G2fogI=", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A=", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo=", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha1-WAyI+NVEXyvWqo88re+g3nn71p4=", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/moment/-/moment-2.30.1.tgz", + "integrity": "sha1-+MkcB7enhuMMWZJt9TC06slpdK4=", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ms/-/ms-2.1.3.tgz", + "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=", + "license": "MIT" + }, + "node_modules/msalv1": { + "name": "@azure/msal-node", + "version": "1.18.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-1.18.4.tgz", + "integrity": "sha1-ySGwRHyS+zsMsev1qadvytLsfCE=", + "deprecated": "A newer major version of this library is available. Please upgrade to the latest available version.", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "13.3.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": "10 || 12 || 14 || 16 || 18" + } + }, + "node_modules/msalv1/node_modules/@azure/msal-common": { + "version": "13.3.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-13.3.1.tgz", + "integrity": "sha1-ASRlv5QNEjddxHOHt1TM+da5IYA=", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/msalv2": { + "name": "@azure/msal-node", + "version": "2.16.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-2.16.3.tgz", + "integrity": "sha1-i4BRUq14CwSNbCszsdTibXtGM2g=", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "14.16.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/msalv3": { + "name": "@azure/msal-node", + "version": "3.8.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-3.8.4.tgz", + "integrity": "sha1-98CCsuISIUjMNiT65YPyZDuBeI4=", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "15.13.3", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/msalv3/node_modules/@azure/msal-common": { + "version": "15.13.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-15.13.3.tgz", + "integrity": "sha1-4TKach9HPxylRm/Q1nVuTCrGj1I=", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha1-0PD6bj4twdJ+/NitmdVQvalNGH0=", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodejs-file-downloader": { + "version": "4.13.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/nodejs-file-downloader/-/nodejs-file-downloader-4.13.0.tgz", + "integrity": "sha1-2ofDAIHeX/TouGQGLJjN7APmatA=", + "license": "ISC", + "dependencies": { + "follow-redirects": "^1.15.6", + "https-proxy-agent": "^5.0.0", + "mime-types": "^2.1.27", + "sanitize-filename": "^1.6.3" + } + }, + "node_modules/nodejs-file-downloader/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha1-xZ7yJKBP6LdU89sAY6Jeow0ABdY=", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha1-g3UmXiG8IND6WCwi4bE0hdbgAhM=", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/open/-/open-10.2.0.tgz", + "integrity": "sha1-udhVvgB2IOgLb7BfrJgUH+Yttzw=", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha1-O6ODNzNkbZ0+SZWUbBNlpn+wekI=", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/qs/-/qs-6.15.0.tgz", + "integrity": "sha1-24/V0bHS1rWzOtr4dCmAXxkJ57M=", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha1-D+E7lSLhRz9RtVjueW4I8R+bSJ8=", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha1-Lp5UxGZOwxBsW1Yw4knT1llcSRE=", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha1-dV69dSBFkxl34wsgJdNA18kJA3g=", + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.4.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/sax/-/sax-1.4.3.tgz", + "integrity": "sha1-/OuuO3Vs3IQoMhgF9LcPFuwKtds=", + "license": "BlueOak-1.0.0" + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/semver/-/semver-5.7.2.tgz", + "integrity": "sha1-SNVdtzfDKHzUg14X+hP+rOHEHvg=", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.10.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/shelljs/-/shelljs-0.10.0.tgz", + "integrity": "sha1-47uumbDz8MxdzgW0ajRvriCQ6IM=", + "license": "BSD-3-Clause", + "dependencies": { + "execa": "^5.1.1", + "fast-glob": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha1-w/z/nE2pMnhIczNeyXZfqU/2a8k=", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha1-EMtZhCYxFdO3oOM2WR4pCoMK+K0=", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha1-1rtrN5Asb+9RdOX1M/q0xzKib0I=", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha1-Ed2hnVNo5Azp7CvcH7DsvAeQ7Oo=", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha1-qaF2f4r4QVURTqq9c/mSc8j1mtk=", + "license": "ISC" + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "license": "MIT" + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha1-YS7+TtI11Wfoq6Xypfq3AoCt6D8=", + "license": "0BSD" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha1-cvExSzSlsZLbASMk3yzFh8pH+Sw=", + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/typed-rest-client": { + "version": "2.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typed-rest-client/-/typed-rest-client-2.2.0.tgz", + "integrity": "sha1-2gcn5AiEm9tpgg2G7mZK/KNHd6M=", + "license": "MIT", + "dependencies": { + "des.js": "^1.1.0", + "js-md4": "^0.3.2", + "qs": "^6.14.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha1-W09Z4VMQqxeiFvXWz1PuR27eZw8=", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/underscore": { + "version": "1.13.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha1-qTohGGwEnb8OhHSW26cre9jB6Ss=", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha1-/8zf82rqSITL/OmnUKBYAiT1ikY=", + "license": "MIT" + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha1-+fY5ENFVNu4rLV3UZlOJcV6sXB4=", + "license": "(WTFPL OR MIT)" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/which/-/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha1-h4PU32cdTVA2W+LuTHGRegVXuqs=", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha1-3QtjAIOqCcFh4lpNCQHisqkptJk=", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha1-vpuuHIoEbnazESdyY0fQrXACvrM=", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + } + } +} diff --git a/_generated/AzureFileCopyV5/package.json b/_generated/AzureFileCopyV5/package.json new file mode 100644 index 000000000000..32dc892589a4 --- /dev/null +++ b/_generated/AzureFileCopyV5/package.json @@ -0,0 +1,20 @@ +{ + "name": "AzureFileCopyV5", + "scripts": { + "build": "node ../../make.js build --task AzureFileCopyV5", + "serverBuild": "node ../../make.js serverBuild --task AzureFileCopyV5" + }, + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^24.10.0", + "@types/q": "1.0.7", + "agent-base": "6.0.2", + "azure-pipelines-task-lib": "^5.2.7", + "azure-pipelines-tasks-azure-arm-rest": "^3.274.0", + "moment": "^2.29.4", + "uuid": "^8.3.0" + }, + "devDependencies": { + "typescript": "^5.7.2" + } +} diff --git a/_generated/AzureFileCopyV5/task.json b/_generated/AzureFileCopyV5/task.json new file mode 100644 index 000000000000..9ff927d6af06 --- /dev/null +++ b/_generated/AzureFileCopyV5/task.json @@ -0,0 +1,316 @@ +{ + "id": "EB72CB01-A7E5-427B-A8A1-1B31CCAC8A43", + "name": "AzureFileCopy", + "friendlyName": "Azure file copy", + "description": "Copy files to Azure Blob Storage or virtual machines", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/deploy/azure-file-copy", + "helpMarkDown": "[Learn more about this task](https://aka.ms/azurefilecopyreadme)", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 5, + "Minor": 274, + "Patch": 2 + }, + "demands": [ + "azureps" + ], + "releaseNotes": "What's new in Version 5.0:
   Support AzCopy.exe version 10.12.2", + "minimumAgentVersion": "1.103.0", + "inputs": [ + { + "name": "SourcePath", + "type": "filePath", + "label": "Source", + "defaultValue": "", + "required": true, + "helpMarkDown": "Absolute path of the source folder, or file on the local machine, or a UNC share. Expression should return a single folder or a file. Wild card symbol (*) is supported anywhere in the file path or file name." + }, + { + "name": "ConnectedServiceNameARM", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "Azure Subscription", + "defaultValue": "", + "required": true, + "helpMarkDown": "Azure Resource Manager subscription to target for copying the files." + }, + { + "name": "Destination", + "type": "pickList", + "label": "Destination Type", + "defaultValue": "", + "required": true, + "options": { + "AzureBlob": "Azure Blob", + "AzureVMs": "Azure VMs" + }, + "helpMarkDown": "Select the destination, either Azure Blob or Azure VMs." + }, + { + "name": "StorageAccountRM", + "aliases": [ + "storage" + ], + "type": "pickList", + "label": "RM Storage Account", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify a pre-existing ARM storage account. It is also used as an intermediary for copying files to Azure VMs", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "ContainerName", + "type": "string", + "label": "Container Name", + "defaultValue": "", + "required": true, + "helpMarkDown": "Name of the Container for uploading the files. If a container with the given name does not exist in the specified storage account, it will automatically be created.
If you need to create a virtual directory inside the container, use the blob prefix input below.
Example: If your target location is https://myaccount.blob.core.windows.net/mycontainer/vd1/vd2/, then specify mycontainer as container name and vd1/vd2/ as blob prefix.", + "visibleRule": "Destination = AzureBlob" + }, + { + "name": "BlobPrefix", + "type": "string", + "label": "Blob Prefix", + "defaultValue": "", + "required": false, + "helpMarkDown": "Useful for filtering files, for example, append build number to all the blobs to download files from that build only. Example: If you specify blob prefix as myvd1/, a virtual directory with this name will be created inside the container. Blob prefix with a trailing '/' will be considered a virtual directory. Otherwise, it will be treated as a file, unless the item being copied is itself a folder. The source files will be copied to https://myaccount.blob.core.windows.net/mycontainer/myvd1/.", + "visibleRule": "Destination = AzureBlob" + }, + { + "name": "EnvironmentNameRM", + "aliases": [ + "resourceGroup" + ], + "type": "pickList", + "label": "Resource Group", + "defaultValue": "", + "required": true, + "helpMarkDown": "Name of the target Resource Group for copying files to.", + "properties": { + "EditableOptions": "True" + }, + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "ResourceFilteringMethod", + "type": "radio", + "label": "Select Machines By", + "required": false, + "defaultValue": "machineNames", + "options": { + "machineNames": "Machine Names", + "tags": "Tags" + }, + "helpMarkDown": "Optionally, select a subset of VMs in resource group either by providing VMs host name or tags. [Tags](https://learn.microsoft.com/en-us/azure/virtual-machines/tag-template/) are supported for resources created via the Azure Resource Manager only.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "MachineNames", + "type": "string", + "label": "Filter Criteria", + "defaultValue": "", + "required": false, + "helpMarkDown": "Provide a list of VMs host name like ffweb, ffdb, or tags like Role:DB, Web; OS:Win8.1. Note the delimiters used for tags are ,(comma), :(colon) and ;(semicolon). If multiple tags are provided, then the task will run in all the VMs with the specified tags. The default is to run the task in all the VMs.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "vmsAdminUserName", + "type": "string", + "label": "Admin Login", + "defaultValue": "", + "required": true, + "helpMarkDown": "Administrator Username of the VMs.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "vmsAdminPassword", + "type": "string", + "label": "Password", + "defaultValue": "", + "required": true, + "helpMarkDown": "The administrator password of the VMs.
It can accept variable defined in build or release pipelines as '$(passwordVariable)'.
You may mark variable as 'secret' to secure it.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "TargetPath", + "type": "string", + "label": "Destination Folder", + "defaultValue": "", + "required": true, + "helpMarkDown": "Local path on the target machines for copying the files from the source. Environment variable can be used like $env:windir\\BudgetIT\\Web.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "AdditionalArgumentsForBlobCopy", + "type": "multiLine", + "label": "Optional Arguments (for uploading files to blob)", + "required": false, + "defaultValue": "", + "helpMarkDown": "Optional AzCopy.exe arguments that will be applied when uploading to blob like, --check-length=true. If no optional arguments are specified here, the following optional arguments will be added by default.
--log-level=INFO (if the pipeline is running in debug mode set --log-level=DEBUG),
--recursive (only if container name is not $root),
--blob-type=PageBlob (only if specified storage account is a premium account)." + }, + { + "name": "AdditionalArgumentsForVMCopy", + "type": "multiLine", + "label": "Optional Arguments (for downloading files to VM)", + "required": false, + "defaultValue": "", + "helpMarkDown": "Optional AzCopy.exe arguments that will be applied when downloading to VM like, --check-length=true. If no optional arguments are specified here, the following optional arguments will be added by default.
--log-level=INFO (if the pipeline is running in debug mode set --log-level=DEBUG),
--recursive", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "sasTokenTimeOutInMinutes", + "type": "string", + "label": "SAS Token Expiration Period In Minutes", + "defaultValue": "240", + "required": false, + "helpMarkDown": "Provide the time in minutes after which SAS token for the container will expire. By default, this token expires after 4 hours.", + "visibleRule": "Destination = AzureBlob" + }, + { + "name": "enableCopyPrerequisites", + "type": "boolean", + "label": "Enable Copy Prerequisites", + "defaultValue": "false", + "visibleRule": "Destination = AzureVMs", + "required": false, + "helpMarkDown": "Enabling this option configures Windows Remote Management (WinRM) listener over HTTPS protocol on port 5986, using a self-signed certificate. This configuration is required for performing copy operation on Azure machines. If the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). Applicable only for ARM VMs." + }, + { + "name": "CopyFilesInParallel", + "type": "boolean", + "label": "Copy in Parallel", + "defaultValue": "true", + "required": false, + "helpMarkDown": "Setting it to true will copy files in parallel to the target machines.", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "CleanTargetBeforeCopy", + "type": "boolean", + "label": "Clean Target", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Setting it to true will clean-up the destination folder before copying the files." + }, + { + "name": "skipCACheck", + "type": "boolean", + "label": "Test Certificate", + "defaultValue": "true", + "required": false, + "helpMarkDown": "If this option is selected, client skips the validation that the server certificate is signed by a trusted certificate authority (CA) when connecting over Hypertext Transfer Protocol over Secure Socket Layer (HTTPS).", + "visibleRule": "Destination = AzureVMs" + } + ], + "outputVariables": [ + { + "name": "StorageContainerUri", + "description": "Uri of the container where the files were copied to. Valid only when the selected destination is Azure Blob." + }, + { + "name": "StorageContainerSasToken", + "description": "SasToken for the container where the files were copied to. Valid only when the selected destination is Azure Blob." + } + ], + "dataSourceBindings": [ + { + "target": "StorageAccountRM", + "endpointId": "$(ConnectedServiceNameARM)", + "dataSourceName": "AzureStorageAccountRM" + }, + { + "target": "EnvironmentNameRM", + "endpointId": "$(ConnectedServiceNameARM)", + "dataSourceName": "AzureVirtualMachinesV2Id", + "resultTemplate": "{\"Value\":\"{{{ #extractResource resourceGroups}}}\",\"DisplayValue\":\"{{{ #extractResource resourceGroups}}}\"}" + } + ], + "instanceNameFormat": "$(Destination) File Copy", + "prejobexecution": { + "Node16": { + "target": "PreJobExecutionAzureFileCopy.js", + "argumentFormat": "" + }, + "Node10": { + "target": "PreJobExecutionAzureFileCopy.js" + }, + "Node20_1": { + "target": "PreJobExecutionAzureFileCopy.js", + "argumentFormat": "" + }, + "Node24": { + "target": "PreJobExecutionAzureFileCopy.js", + "argumentFormat": "" + } + }, + "execution": { + "PowerShell3": { + "target": "AzureFileCopy.ps1" + } + }, + "messages": { + "AFC_StorageAccountNotFound": "Storage account: {0} not found. The selected service connection 'Service Principal' supports storage accounts of Azure Resource Manager type only.", + "AFC_ResourceGroupNotFound": "Provided resource group '{0}' does not exist.", + "AFC_GetVMStatus": "[Azure Call]Getting the status for vm '{0}'", + "AFC_GetVMStatusComplete": "[Azure Call]Got the status for vm '{0}'", + "AFC_GetCustomScriptExtension": "[Azure Call]Getting the custom script extension '{0}' for vm '{1}'", + "AFC_GetCustomScriptExtensionComplete": "[Azure Call]Got the custom script extension '{0}' for vm '{1}'", + "AFC_SetCustomScriptExtension": "[Azure Call]Setting the custom script extension '{0}' for vm '{1}'", + "AFC_SetCustomScriptExtensionComplete": "[Azure Call]Set the custom script extension '{0}' for vm '{1}'", + "AFC_RemoveCustomScriptExtension": "[Azure Call]Removing the custom script extension '{0}' for vm '{1}'", + "AFC_RemoveCustomScriptExtensionComplete": "[Azure Call]Removed the custom script extension '{0}' for vm '{1}'", + "AFC_NoNetworkInterface": "[Azure Call]No network interface found with virtual machine ID {0} under resource group {1}", + "AFC_NullOrEmptyResourceGroup": "[Azure Call]Resource group name and virtual machine ID should not be null or empty", + "AFC_AzurePSNotInstalled": "The required minimum version {0} of the Azure Powershell Cmdlets are not installed. You can follow the instructions at https://azure.microsoft.com/en-in/documentation/articles/powershell-install-configure/ to get the latest Azure powershell", + "AFC_ClassicStorageAccountNotFound": "Storage account: {0} not found. The selected service connection 'Certificate' supports storage accounts of Azure Classic type only.", + "AFC_GenericStorageAccountNotFound": "Storage account: {0} not found. Please specify existing storage account", + "AFC_AzureFileCopyMoreHelp": "For more info please refer to {0}", + "AFC_UploadFilesStorageAccount": "Uploading files from source path: '{0}' to storage account: '{1}' in container: '{2}' with blob prefix: '{3}'", + "AFC_UploadContainerStorageAccount": "Upload to container: '{0}' in storage account: '{1}' with blob prefix: '{2}' failed with error: '{3}'", + "AFC_UploadFileSuccessful": "Uploaded files successfully from source path: '{0}' to storage account: '{1}' in container: '{2}' with blob prefix: '{3}'", + "AFC_IncorrectTags": "Tags have been incorrectly specified. They have to be in the format Role:Web,DB;Location:East US;Dept.:Finance,HR", + "AFC_MachineDoesNotExist": "The following machines either do not exist in the resource group or their names have not been specified correctly: {0}. Provide the exact same machine names present in the resource group. Use comma to separate multiple machine names.", + "AFC_MachineNameFromIdErrorAllResources": "Unable to get {0} for all resources in ResourceGroup : '{1}'", + "AFC_MachineNameFromIdError": "Unable to get {0} for '{1}' resources in ResourceGroup : '{2}'", + "AFC_ResourceGroupNotFoundForSelectedConnection": "Unable to find the resource '{1}' using selected service connection '{0}'. Selected service connection '{0}' supports classic resources only (Service Management model).", + "AFC_NoClassicVMResources": "No machine exists under resource group: '{0}' for copy. Selected service connection '{1}' supports Virtual Machines of Azure Classic type only.", + "AFC_NoARMVMResources": "No machine exists under resource group: '{0}' for copy. Selected service connection '{1}' supports Virtual Machines of Azure Resource Manager type only.", + "AFC_NoGenericVMResources": "No machine exists under resource group: '{0}' for copy.", + "AFC_FilteringNoVMResources": "No machine exists under resource group: '{0}' with the following {1} '{2}'.", + "AFC_CopyStarted": "Copy started for machine: '{0}'", + "AFC_CopyCompleted": "Copy status for machine '{0}' : '{1}'", + "AFC_WinRMHelpMessage": "To fix WinRM service connection related issues, select the 'Enable Copy Prerequisites' option in the task. If set already, and the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). Applicable only for ARM VMs.", + "AFC_CopyFailed": "Copy failed on machine '{0}'. Refer logs for more details.", + "AFC_ParallelCopyFailed": "Copy to one or more machines failed. Refer logs for more details.", + "AFC_CopySuccessful": "Copied files from source path: '{0}' to target azure VMs in resource group: '{1}' successfully", + "AFC_SetCustomScriptExtensionFailed": "Setting the custom script extension '{0}' for virtual machine '{1}' failed with error : {2}", + "AFC_AddNetworkSecurityRuleFailed": "Failed to add the network security rule: {0}", + "AFC_UnableToSetCustomScriptExtension": "Unable to set the custom script extension '{0}' for virtual machine '{1}': {2}", + "AFC_CopyPrereqsFailed": "Failed to enable copy prerequisites. {0}", + "AFC_BlobStorageNotFound": "Storage account: {0} not found. Please specify existing storage account", + "AFC_RootContainerAndDirectory": "'/S' option is not valid for $root containers.", + "AFC_RedirectResponseInvalidStatusCode": "The HTTP response code: '{0}' is not a valid redirect status code", + "AFC_RedirectResponseLocationHeaderIsNull": "Redirect response location header is null.", + "AFC_AzCopyBlobUploadNonZeroExitCode": "AzCopy.exe exited with non-zero exit code while uploading files to blob storage.", + "AFC_PreexecutionJob_UnableToGetStorageKey": "Unable to fetch storage account key. Error: '{0}'", + "AFC_UninstallWinRMCustomScriptExtension": "Uninstall WinRM custom script manually and retry deployment.", + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "UnsupportedAuthScheme": "Unsupported authentication scheme '{0}' for endpoint.", + "ServicePrincipalError": "There was an error with the service principal used for the deployment.", + "AzModuleNotFound": "Could not find the modules: 'Az.Accounts'. If the module was recently installed, retry after restarting the Azure Pipelines task agent." + }, + "_buildConfigMapping": { + "Default": "5.274.2", + "LocalPackages": "5.249.4", + "Node24_1": "5.274.3" + } +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/task.loc.json b/_generated/AzureFileCopyV5/task.loc.json new file mode 100644 index 000000000000..c8e7889a8ab4 --- /dev/null +++ b/_generated/AzureFileCopyV5/task.loc.json @@ -0,0 +1,316 @@ +{ + "id": "EB72CB01-A7E5-427B-A8A1-1B31CCAC8A43", + "name": "AzureFileCopy", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/deploy/azure-file-copy", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 5, + "Minor": 274, + "Patch": 2 + }, + "demands": [ + "azureps" + ], + "releaseNotes": "ms-resource:loc.releaseNotes", + "minimumAgentVersion": "1.103.0", + "inputs": [ + { + "name": "SourcePath", + "type": "filePath", + "label": "ms-resource:loc.input.label.SourcePath", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.SourcePath" + }, + { + "name": "ConnectedServiceNameARM", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.ConnectedServiceNameARM", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ConnectedServiceNameARM" + }, + { + "name": "Destination", + "type": "pickList", + "label": "ms-resource:loc.input.label.Destination", + "defaultValue": "", + "required": true, + "options": { + "AzureBlob": "Azure Blob", + "AzureVMs": "Azure VMs" + }, + "helpMarkDown": "ms-resource:loc.input.help.Destination" + }, + { + "name": "StorageAccountRM", + "aliases": [ + "storage" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.StorageAccountRM", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.StorageAccountRM", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "ContainerName", + "type": "string", + "label": "ms-resource:loc.input.label.ContainerName", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ContainerName", + "visibleRule": "Destination = AzureBlob" + }, + { + "name": "BlobPrefix", + "type": "string", + "label": "ms-resource:loc.input.label.BlobPrefix", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.BlobPrefix", + "visibleRule": "Destination = AzureBlob" + }, + { + "name": "EnvironmentNameRM", + "aliases": [ + "resourceGroup" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.EnvironmentNameRM", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.EnvironmentNameRM", + "properties": { + "EditableOptions": "True" + }, + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "ResourceFilteringMethod", + "type": "radio", + "label": "ms-resource:loc.input.label.ResourceFilteringMethod", + "required": false, + "defaultValue": "machineNames", + "options": { + "machineNames": "Machine Names", + "tags": "Tags" + }, + "helpMarkDown": "ms-resource:loc.input.help.ResourceFilteringMethod", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "MachineNames", + "type": "string", + "label": "ms-resource:loc.input.label.MachineNames", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.MachineNames", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "vmsAdminUserName", + "type": "string", + "label": "ms-resource:loc.input.label.vmsAdminUserName", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.vmsAdminUserName", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "vmsAdminPassword", + "type": "string", + "label": "ms-resource:loc.input.label.vmsAdminPassword", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.vmsAdminPassword", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "TargetPath", + "type": "string", + "label": "ms-resource:loc.input.label.TargetPath", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.TargetPath", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "AdditionalArgumentsForBlobCopy", + "type": "multiLine", + "label": "ms-resource:loc.input.label.AdditionalArgumentsForBlobCopy", + "required": false, + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.AdditionalArgumentsForBlobCopy" + }, + { + "name": "AdditionalArgumentsForVMCopy", + "type": "multiLine", + "label": "ms-resource:loc.input.label.AdditionalArgumentsForVMCopy", + "required": false, + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.AdditionalArgumentsForVMCopy", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "sasTokenTimeOutInMinutes", + "type": "string", + "label": "ms-resource:loc.input.label.sasTokenTimeOutInMinutes", + "defaultValue": "240", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.sasTokenTimeOutInMinutes", + "visibleRule": "Destination = AzureBlob" + }, + { + "name": "enableCopyPrerequisites", + "type": "boolean", + "label": "ms-resource:loc.input.label.enableCopyPrerequisites", + "defaultValue": "false", + "visibleRule": "Destination = AzureVMs", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.enableCopyPrerequisites" + }, + { + "name": "CopyFilesInParallel", + "type": "boolean", + "label": "ms-resource:loc.input.label.CopyFilesInParallel", + "defaultValue": "true", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.CopyFilesInParallel", + "visibleRule": "Destination = AzureVMs" + }, + { + "name": "CleanTargetBeforeCopy", + "type": "boolean", + "label": "ms-resource:loc.input.label.CleanTargetBeforeCopy", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.CleanTargetBeforeCopy" + }, + { + "name": "skipCACheck", + "type": "boolean", + "label": "ms-resource:loc.input.label.skipCACheck", + "defaultValue": "true", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.skipCACheck", + "visibleRule": "Destination = AzureVMs" + } + ], + "outputVariables": [ + { + "name": "StorageContainerUri", + "description": "Uri of the container where the files were copied to. Valid only when the selected destination is Azure Blob." + }, + { + "name": "StorageContainerSasToken", + "description": "SasToken for the container where the files were copied to. Valid only when the selected destination is Azure Blob." + } + ], + "dataSourceBindings": [ + { + "target": "StorageAccountRM", + "endpointId": "$(ConnectedServiceNameARM)", + "dataSourceName": "AzureStorageAccountRM" + }, + { + "target": "EnvironmentNameRM", + "endpointId": "$(ConnectedServiceNameARM)", + "dataSourceName": "AzureVirtualMachinesV2Id", + "resultTemplate": "{\"Value\":\"{{{ #extractResource resourceGroups}}}\",\"DisplayValue\":\"{{{ #extractResource resourceGroups}}}\"}" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "prejobexecution": { + "Node16": { + "target": "PreJobExecutionAzureFileCopy.js", + "argumentFormat": "" + }, + "Node10": { + "target": "PreJobExecutionAzureFileCopy.js" + }, + "Node20_1": { + "target": "PreJobExecutionAzureFileCopy.js", + "argumentFormat": "" + }, + "Node24": { + "target": "PreJobExecutionAzureFileCopy.js", + "argumentFormat": "" + } + }, + "execution": { + "PowerShell3": { + "target": "AzureFileCopy.ps1" + } + }, + "messages": { + "AFC_StorageAccountNotFound": "ms-resource:loc.messages.AFC_StorageAccountNotFound", + "AFC_ResourceGroupNotFound": "ms-resource:loc.messages.AFC_ResourceGroupNotFound", + "AFC_GetVMStatus": "ms-resource:loc.messages.AFC_GetVMStatus", + "AFC_GetVMStatusComplete": "ms-resource:loc.messages.AFC_GetVMStatusComplete", + "AFC_GetCustomScriptExtension": "ms-resource:loc.messages.AFC_GetCustomScriptExtension", + "AFC_GetCustomScriptExtensionComplete": "ms-resource:loc.messages.AFC_GetCustomScriptExtensionComplete", + "AFC_SetCustomScriptExtension": "ms-resource:loc.messages.AFC_SetCustomScriptExtension", + "AFC_SetCustomScriptExtensionComplete": "ms-resource:loc.messages.AFC_SetCustomScriptExtensionComplete", + "AFC_RemoveCustomScriptExtension": "ms-resource:loc.messages.AFC_RemoveCustomScriptExtension", + "AFC_RemoveCustomScriptExtensionComplete": "ms-resource:loc.messages.AFC_RemoveCustomScriptExtensionComplete", + "AFC_NoNetworkInterface": "ms-resource:loc.messages.AFC_NoNetworkInterface", + "AFC_NullOrEmptyResourceGroup": "ms-resource:loc.messages.AFC_NullOrEmptyResourceGroup", + "AFC_AzurePSNotInstalled": "ms-resource:loc.messages.AFC_AzurePSNotInstalled", + "AFC_ClassicStorageAccountNotFound": "ms-resource:loc.messages.AFC_ClassicStorageAccountNotFound", + "AFC_GenericStorageAccountNotFound": "ms-resource:loc.messages.AFC_GenericStorageAccountNotFound", + "AFC_AzureFileCopyMoreHelp": "ms-resource:loc.messages.AFC_AzureFileCopyMoreHelp", + "AFC_UploadFilesStorageAccount": "ms-resource:loc.messages.AFC_UploadFilesStorageAccount", + "AFC_UploadContainerStorageAccount": "ms-resource:loc.messages.AFC_UploadContainerStorageAccount", + "AFC_UploadFileSuccessful": "ms-resource:loc.messages.AFC_UploadFileSuccessful", + "AFC_IncorrectTags": "ms-resource:loc.messages.AFC_IncorrectTags", + "AFC_MachineDoesNotExist": "ms-resource:loc.messages.AFC_MachineDoesNotExist", + "AFC_MachineNameFromIdErrorAllResources": "ms-resource:loc.messages.AFC_MachineNameFromIdErrorAllResources", + "AFC_MachineNameFromIdError": "ms-resource:loc.messages.AFC_MachineNameFromIdError", + "AFC_ResourceGroupNotFoundForSelectedConnection": "ms-resource:loc.messages.AFC_ResourceGroupNotFoundForSelectedConnection", + "AFC_NoClassicVMResources": "ms-resource:loc.messages.AFC_NoClassicVMResources", + "AFC_NoARMVMResources": "ms-resource:loc.messages.AFC_NoARMVMResources", + "AFC_NoGenericVMResources": "ms-resource:loc.messages.AFC_NoGenericVMResources", + "AFC_FilteringNoVMResources": "ms-resource:loc.messages.AFC_FilteringNoVMResources", + "AFC_CopyStarted": "ms-resource:loc.messages.AFC_CopyStarted", + "AFC_CopyCompleted": "ms-resource:loc.messages.AFC_CopyCompleted", + "AFC_WinRMHelpMessage": "ms-resource:loc.messages.AFC_WinRMHelpMessage", + "AFC_CopyFailed": "ms-resource:loc.messages.AFC_CopyFailed", + "AFC_ParallelCopyFailed": "ms-resource:loc.messages.AFC_ParallelCopyFailed", + "AFC_CopySuccessful": "ms-resource:loc.messages.AFC_CopySuccessful", + "AFC_SetCustomScriptExtensionFailed": "ms-resource:loc.messages.AFC_SetCustomScriptExtensionFailed", + "AFC_AddNetworkSecurityRuleFailed": "ms-resource:loc.messages.AFC_AddNetworkSecurityRuleFailed", + "AFC_UnableToSetCustomScriptExtension": "ms-resource:loc.messages.AFC_UnableToSetCustomScriptExtension", + "AFC_CopyPrereqsFailed": "ms-resource:loc.messages.AFC_CopyPrereqsFailed", + "AFC_BlobStorageNotFound": "ms-resource:loc.messages.AFC_BlobStorageNotFound", + "AFC_RootContainerAndDirectory": "ms-resource:loc.messages.AFC_RootContainerAndDirectory", + "AFC_RedirectResponseInvalidStatusCode": "ms-resource:loc.messages.AFC_RedirectResponseInvalidStatusCode", + "AFC_RedirectResponseLocationHeaderIsNull": "ms-resource:loc.messages.AFC_RedirectResponseLocationHeaderIsNull", + "AFC_AzCopyBlobUploadNonZeroExitCode": "ms-resource:loc.messages.AFC_AzCopyBlobUploadNonZeroExitCode", + "AFC_PreexecutionJob_UnableToGetStorageKey": "ms-resource:loc.messages.AFC_PreexecutionJob_UnableToGetStorageKey", + "AFC_UninstallWinRMCustomScriptExtension": "ms-resource:loc.messages.AFC_UninstallWinRMCustomScriptExtension", + "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", + "UnsupportedAuthScheme": "ms-resource:loc.messages.UnsupportedAuthScheme", + "ServicePrincipalError": "ms-resource:loc.messages.ServicePrincipalError", + "AzModuleNotFound": "ms-resource:loc.messages.AzModuleNotFound" + }, + "_buildConfigMapping": { + "Default": "5.274.2", + "LocalPackages": "5.249.4", + "Node24_1": "5.274.3" + } +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/tsconfig.json b/_generated/AzureFileCopyV5/tsconfig.json new file mode 100644 index 000000000000..0cd3f3f78ed5 --- /dev/null +++ b/_generated/AzureFileCopyV5/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs", + "skipLibCheck": true + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/_generated/AzureFileCopyV5_Node24/task.json b/_generated/AzureFileCopyV5_Node24/task.json index cc9a020d7abb..b92b6b38cd1a 100644 --- a/_generated/AzureFileCopyV5_Node24/task.json +++ b/_generated/AzureFileCopyV5_Node24/task.json @@ -14,7 +14,7 @@ "version": { "Major": 5, "Minor": 274, - "Patch": 1 + "Patch": 3 }, "demands": [ "azureps" @@ -309,8 +309,8 @@ "AzModuleNotFound": "Could not find the modules: 'Az.Accounts'. If the module was recently installed, retry after restarting the Azure Pipelines task agent." }, "_buildConfigMapping": { - "Default": "5.274.0", + "Default": "5.274.2", "LocalPackages": "5.249.4", - "Node24_1": "5.274.1" + "Node24_1": "5.274.3" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV5_Node24/task.loc.json b/_generated/AzureFileCopyV5_Node24/task.loc.json index a9292708bb4e..d1b842f11c5a 100644 --- a/_generated/AzureFileCopyV5_Node24/task.loc.json +++ b/_generated/AzureFileCopyV5_Node24/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 5, "Minor": 274, - "Patch": 1 + "Patch": 3 }, "demands": [ "azureps" @@ -309,8 +309,8 @@ "AzModuleNotFound": "ms-resource:loc.messages.AzModuleNotFound" }, "_buildConfigMapping": { - "Default": "5.274.0", + "Default": "5.274.2", "LocalPackages": "5.249.4", - "Node24_1": "5.274.1" + "Node24_1": "5.274.3" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV6.versionmap.txt b/_generated/AzureFileCopyV6.versionmap.txt index a3a199407032..24b739e923b6 100644 --- a/_generated/AzureFileCopyV6.versionmap.txt +++ b/_generated/AzureFileCopyV6.versionmap.txt @@ -1,2 +1,2 @@ -Default|6.274.2 -Node24_1|6.274.3 +Default|6.274.4 +Node24_1|6.274.5 diff --git a/_generated/AzureFileCopyV6/task.json b/_generated/AzureFileCopyV6/task.json index 2c7429f183aa..f1dd6d08cfb7 100644 --- a/_generated/AzureFileCopyV6/task.json +++ b/_generated/AzureFileCopyV6/task.json @@ -14,7 +14,7 @@ "version": { "Major": 6, "Minor": 274, - "Patch": 2 + "Patch": 4 }, "demands": [ "azureps" @@ -296,8 +296,8 @@ "AzModuleNotFound": "Could not find the modules: 'Az.Accounts'. If the module was recently installed, retry after restarting the Azure Pipelines task agent." }, "_buildConfigMapping": { - "Default": "6.274.2", + "Default": "6.274.4", "LocalPackages": "6.249.4", - "Node24_1": "6.274.3" + "Node24_1": "6.274.5" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV6/task.loc.json b/_generated/AzureFileCopyV6/task.loc.json index b74f780344a5..7565f0031ee4 100644 --- a/_generated/AzureFileCopyV6/task.loc.json +++ b/_generated/AzureFileCopyV6/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 6, "Minor": 274, - "Patch": 2 + "Patch": 4 }, "demands": [ "azureps" @@ -296,8 +296,8 @@ "AzModuleNotFound": "ms-resource:loc.messages.AzModuleNotFound" }, "_buildConfigMapping": { - "Default": "6.274.2", + "Default": "6.274.4", "LocalPackages": "6.249.4", - "Node24_1": "6.274.3" + "Node24_1": "6.274.5" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV6_Node24/task.json b/_generated/AzureFileCopyV6_Node24/task.json index 0f2a357974a5..d63bcb85e9e5 100644 --- a/_generated/AzureFileCopyV6_Node24/task.json +++ b/_generated/AzureFileCopyV6_Node24/task.json @@ -14,7 +14,7 @@ "version": { "Major": 6, "Minor": 274, - "Patch": 3 + "Patch": 5 }, "demands": [ "azureps" @@ -296,8 +296,8 @@ "AzModuleNotFound": "Could not find the modules: 'Az.Accounts'. If the module was recently installed, retry after restarting the Azure Pipelines task agent." }, "_buildConfigMapping": { - "Default": "6.274.2", + "Default": "6.274.4", "LocalPackages": "6.249.4", - "Node24_1": "6.274.3" + "Node24_1": "6.274.5" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV6_Node24/task.loc.json b/_generated/AzureFileCopyV6_Node24/task.loc.json index 0915c3360875..06a8dd2d0141 100644 --- a/_generated/AzureFileCopyV6_Node24/task.loc.json +++ b/_generated/AzureFileCopyV6_Node24/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 6, "Minor": 274, - "Patch": 3 + "Patch": 5 }, "demands": [ "azureps" @@ -296,8 +296,8 @@ "AzModuleNotFound": "ms-resource:loc.messages.AzModuleNotFound" }, "_buildConfigMapping": { - "Default": "6.274.2", + "Default": "6.274.4", "LocalPackages": "6.249.4", - "Node24_1": "6.274.3" + "Node24_1": "6.274.5" } } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4.versionmap.txt b/_generated/AzurePowerShellV4.versionmap.txt index bd14f4389f43..6bcf51ec9c6b 100644 --- a/_generated/AzurePowerShellV4.versionmap.txt +++ b/_generated/AzurePowerShellV4.versionmap.txt @@ -1,2 +1,2 @@ Default|4.274.6 -Node24_1|4.274.7 \ No newline at end of file +Node24_1|4.274.7 diff --git a/_generated/AzurePowerShellV4/task.json b/_generated/AzurePowerShellV4/task.json index f06544366155..6a765438c079 100644 --- a/_generated/AzurePowerShellV4/task.json +++ b/_generated/AzurePowerShellV4/task.json @@ -212,12 +212,11 @@ "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "JS_ExitCode": "PowerShell exited with code '%s'.", "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." }, "_buildConfigMapping": { "Default": "4.274.6", "LocalPackages": "4.249.4", "Node24_1": "4.274.7" } -} +} \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/task.loc.json b/_generated/AzurePowerShellV4/task.loc.json index a878cd474ef6..4becd99ed930 100644 --- a/_generated/AzurePowerShellV4/task.loc.json +++ b/_generated/AzurePowerShellV4/task.loc.json @@ -220,4 +220,4 @@ "LocalPackages": "4.249.4", "Node24_1": "4.274.7" } -} +} \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/task.json b/_generated/AzurePowerShellV4_Node24/task.json index 8342c56d12f2..a61af1136704 100644 --- a/_generated/AzurePowerShellV4_Node24/task.json +++ b/_generated/AzurePowerShellV4_Node24/task.json @@ -216,12 +216,11 @@ "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "JS_ExitCode": "PowerShell exited with code '%s'.", "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." }, "_buildConfigMapping": { "Default": "4.274.6", "LocalPackages": "4.249.4", "Node24_1": "4.274.7" } -} +} \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/task.loc.json b/_generated/AzurePowerShellV4_Node24/task.loc.json index 94f49b10491a..3e74ea009e8b 100644 --- a/_generated/AzurePowerShellV4_Node24/task.loc.json +++ b/_generated/AzurePowerShellV4_Node24/task.loc.json @@ -224,4 +224,4 @@ "LocalPackages": "4.249.4", "Node24_1": "4.274.7" } -} +} \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/task.json b/_generated/AzurePowerShellV5/task.json index 9d5c10bdd193..248aba250e9a 100644 --- a/_generated/AzurePowerShellV5/task.json +++ b/_generated/AzurePowerShellV5/task.json @@ -206,12 +206,11 @@ "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "PS_ExitCode": "PowerShell exited with code '{0}'.", - "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" }, "_buildConfigMapping": { "Default": "5.274.6", "LocalPackages": "5.249.4", "Node24_1": "5.274.7" } -} +} \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/task.loc.json b/_generated/AzurePowerShellV5/task.loc.json index 926485920442..3b4748a87c42 100644 --- a/_generated/AzurePowerShellV5/task.loc.json +++ b/_generated/AzurePowerShellV5/task.loc.json @@ -214,4 +214,4 @@ "LocalPackages": "5.249.4", "Node24_1": "5.274.7" } -} +} \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/task.json b/_generated/AzurePowerShellV5_Node24/task.json index 40b2b3fcf9db..205461122adf 100644 --- a/_generated/AzurePowerShellV5_Node24/task.json +++ b/_generated/AzurePowerShellV5_Node24/task.json @@ -210,12 +210,11 @@ "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "PS_ExitCode": "PowerShell exited with code '{0}'.", - "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" }, "_buildConfigMapping": { "Default": "5.274.6", "LocalPackages": "5.249.4", "Node24_1": "5.274.7" } -} +} \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/task.loc.json b/_generated/AzurePowerShellV5_Node24/task.loc.json index 995507ba87f8..108d4d4006e6 100644 --- a/_generated/AzurePowerShellV5_Node24/task.loc.json +++ b/_generated/AzurePowerShellV5_Node24/task.loc.json @@ -218,4 +218,4 @@ "LocalPackages": "5.249.4", "Node24_1": "5.274.7" } -} +} \ No newline at end of file From 9af9b96e8d3faf331702c650ba58679a43579487 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Wed, 13 May 2026 13:47:36 +0200 Subject: [PATCH 16/25] Roll forward minor to sprint 274 for 4 stale-minor tasks (CI downgrade check) ci/check-downgrading.js failed on the previous push because four tasks had Minor versions older than the current sprint (274). The check enforces minor >= currentSprintVersion. Patch-only bumps were not enough. ServiceFabricPowerShellV1 1.228.2 -> 1.274.0 PowerShellOnTargetMachinesV3 3.273.1 -> 3.274.0 WindowsMachineFileCopyV1 1.243.1 -> 1.274.0 WindowsMachineFileCopyV2 2.251.1 -> 2.274.0 None of these have Node24 generated mirrors so no _generated/ updates are needed (BuildConfigGen verified clean for all four). ServiceFabricPowerShellV1 is one of the 5 sanitizer-adopting tasks, so the Risk Assessment / version table in the PR description has been updated to match. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/PowerShellOnTargetMachinesV3/task.json | 4 ++-- Tasks/PowerShellOnTargetMachinesV3/task.loc.json | 4 ++-- Tasks/ServiceFabricPowerShellV1/task.json | 4 ++-- Tasks/ServiceFabricPowerShellV1/task.loc.json | 4 ++-- Tasks/WindowsMachineFileCopyV1/task.json | 4 ++-- Tasks/WindowsMachineFileCopyV1/task.loc.json | 4 ++-- Tasks/WindowsMachineFileCopyV2/task.json | 4 ++-- Tasks/WindowsMachineFileCopyV2/task.loc.json | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Tasks/PowerShellOnTargetMachinesV3/task.json b/Tasks/PowerShellOnTargetMachinesV3/task.json index 2413c9a3ad92..def59686fb60 100644 --- a/Tasks/PowerShellOnTargetMachinesV3/task.json +++ b/Tasks/PowerShellOnTargetMachinesV3/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 3, - "Minor": 273, - "Patch": 1 + "Minor": 274, + "Patch": 0 }, "groups": [ { diff --git a/Tasks/PowerShellOnTargetMachinesV3/task.loc.json b/Tasks/PowerShellOnTargetMachinesV3/task.loc.json index 42b27192f2db..59b519edcffa 100644 --- a/Tasks/PowerShellOnTargetMachinesV3/task.loc.json +++ b/Tasks/PowerShellOnTargetMachinesV3/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 3, - "Minor": 273, - "Patch": 1 + "Minor": 274, + "Patch": 0 }, "groups": [ { diff --git a/Tasks/ServiceFabricPowerShellV1/task.json b/Tasks/ServiceFabricPowerShellV1/task.json index d767af894991..4674c5a693e3 100644 --- a/Tasks/ServiceFabricPowerShellV1/task.json +++ b/Tasks/ServiceFabricPowerShellV1/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 228, - "Patch": 2 + "Minor": 274, + "Patch": 0 }, "demands": [ "Cmd" diff --git a/Tasks/ServiceFabricPowerShellV1/task.loc.json b/Tasks/ServiceFabricPowerShellV1/task.loc.json index ddc714346f61..9079c46a6e61 100644 --- a/Tasks/ServiceFabricPowerShellV1/task.loc.json +++ b/Tasks/ServiceFabricPowerShellV1/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 228, - "Patch": 2 + "Minor": 274, + "Patch": 0 }, "demands": [ "Cmd" diff --git a/Tasks/WindowsMachineFileCopyV1/task.json b/Tasks/WindowsMachineFileCopyV1/task.json index 05647acbb191..0632024234fc 100644 --- a/Tasks/WindowsMachineFileCopyV1/task.json +++ b/Tasks/WindowsMachineFileCopyV1/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 243, - "Patch": 1 + "Minor": 274, + "Patch": 0 }, "minimumAgentVersion": "1.104.0", "groups": [ diff --git a/Tasks/WindowsMachineFileCopyV1/task.loc.json b/Tasks/WindowsMachineFileCopyV1/task.loc.json index b013c717fed2..c5915f58c32f 100644 --- a/Tasks/WindowsMachineFileCopyV1/task.loc.json +++ b/Tasks/WindowsMachineFileCopyV1/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 243, - "Patch": 1 + "Minor": 274, + "Patch": 0 }, "minimumAgentVersion": "1.104.0", "groups": [ diff --git a/Tasks/WindowsMachineFileCopyV2/task.json b/Tasks/WindowsMachineFileCopyV2/task.json index 24c0351004c6..db23c08b8f23 100644 --- a/Tasks/WindowsMachineFileCopyV2/task.json +++ b/Tasks/WindowsMachineFileCopyV2/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 251, - "Patch": 1 + "Minor": 274, + "Patch": 0 }, "releaseNotes": "What's new in Version 2.0:
  Proxy support is being added.
   Removed support of legacy DTL machines.", "minimumAgentVersion": "1.104.0", diff --git a/Tasks/WindowsMachineFileCopyV2/task.loc.json b/Tasks/WindowsMachineFileCopyV2/task.loc.json index 86cb87ac2a81..11db8d730cc6 100644 --- a/Tasks/WindowsMachineFileCopyV2/task.loc.json +++ b/Tasks/WindowsMachineFileCopyV2/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 251, - "Patch": 1 + "Minor": 274, + "Patch": 0 }, "releaseNotes": "ms-resource:loc.releaseNotes", "minimumAgentVersion": "1.104.0", From 3559d85d298140d9f3744614b133d2d0aaf97312 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Wed, 13 May 2026 14:04:00 +0200 Subject: [PATCH 17/25] Add ScriptArgsSanitized to task.json messages for all 5 sanitizer tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The original retrofit added the localized 'ScriptArgsSanitized' message to task.loc.json and Strings/resources.resjson//resources.resjson, but forgot to add the canonical source-of-truth entry to task.json's 'messages' block for AzurePowerShellV2-V5 and ServiceFabricPowerShellV1. The CI 'Verify task source changes' step runs 'node make.js build', which regenerates task.loc.json and en-US/resources.resjson from task.json.messages. Without the source entry, that step stripped the ScriptArgsSanitized line on every rebuild — leaving the dispatcher's localized throw with no message to resolve at runtime in en-US. Fix: add the message string to task.json's messages block for each of the 5 tasks. Then runs 'node make.js build' against each so task.loc.json and en-US resources.resjson are emitted by the canonical build path; BCG re-syncs the V4/V5 generated mirrors. No functional change to non-en-US localizations — they continue to use the existing translations from the original retrofit. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/AzurePowerShellV2/task.json | 3 ++- Tasks/AzurePowerShellV2/task.loc.json | 2 +- Tasks/AzurePowerShellV3/task.json | 3 ++- Tasks/AzurePowerShellV3/task.loc.json | 2 +- Tasks/AzurePowerShellV4/task.json | 3 ++- Tasks/AzurePowerShellV5/task.json | 3 ++- Tasks/ServiceFabricPowerShellV1/task.json | 3 ++- Tasks/ServiceFabricPowerShellV1/task.loc.json | 2 +- _generated/AzurePowerShellV4/task.json | 3 ++- _generated/AzurePowerShellV4_Node24/task.json | 3 ++- _generated/AzurePowerShellV5/task.json | 3 ++- _generated/AzurePowerShellV5_Node24/task.json | 3 ++- 12 files changed, 21 insertions(+), 12 deletions(-) diff --git a/Tasks/AzurePowerShellV2/task.json b/Tasks/AzurePowerShellV2/task.json index 4070663eba93..55929e83fc36 100644 --- a/Tasks/AzurePowerShellV2/task.json +++ b/Tasks/AzurePowerShellV2/task.json @@ -150,6 +150,7 @@ "InvalidScriptArguments0": "Invalid script arguments '{0}'. Line breaks are not allowed.", "InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified.", "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", - "OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected." + "OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected.", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/task.loc.json b/Tasks/AzurePowerShellV2/task.loc.json index 13d9e93ce7e3..c5af204721db 100644 --- a/Tasks/AzurePowerShellV2/task.loc.json +++ b/Tasks/AzurePowerShellV2/task.loc.json @@ -153,4 +153,4 @@ "OverrideAzurePowerShellVersion": "ms-resource:loc.messages.OverrideAzurePowerShellVersion", "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" } -} +} \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/task.json b/Tasks/AzurePowerShellV3/task.json index 62ba216d2d44..de3a614887e3 100644 --- a/Tasks/AzurePowerShellV3/task.json +++ b/Tasks/AzurePowerShellV3/task.json @@ -200,6 +200,7 @@ "InvalidScriptArguments0": "Invalid script arguments '{0}'. Line breaks are not allowed.", "InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified.", "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", - "OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected." + "OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected.", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/task.loc.json b/Tasks/AzurePowerShellV3/task.loc.json index 841344c09f2f..d45cbdefde98 100644 --- a/Tasks/AzurePowerShellV3/task.loc.json +++ b/Tasks/AzurePowerShellV3/task.loc.json @@ -203,4 +203,4 @@ "OverrideAzurePowerShellVersion": "ms-resource:loc.messages.OverrideAzurePowerShellVersion", "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" } -} +} \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/task.json b/Tasks/AzurePowerShellV4/task.json index cb94d1581b87..57cd7d3196e7 100644 --- a/Tasks/AzurePowerShellV4/task.json +++ b/Tasks/AzurePowerShellV4/task.json @@ -212,6 +212,7 @@ "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "JS_ExitCode": "PowerShell exited with code '%s'.", "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/task.json b/Tasks/AzurePowerShellV5/task.json index c2b88fecc4e5..781aeeb209e3 100644 --- a/Tasks/AzurePowerShellV5/task.json +++ b/Tasks/AzurePowerShellV5/task.json @@ -206,6 +206,7 @@ "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "PS_ExitCode": "PowerShell exited with code '{0}'.", - "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" + "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/task.json b/Tasks/ServiceFabricPowerShellV1/task.json index 4674c5a693e3..7030002c7cf3 100644 --- a/Tasks/ServiceFabricPowerShellV1/task.json +++ b/Tasks/ServiceFabricPowerShellV1/task.json @@ -92,6 +92,7 @@ "messages": { "CertNotPresentInLocalStoreWarningMsg": "The certificate with thumbprint {0} is not present in the local certificate store. This can potentially cause errors. If the release/build fails, please re-try it or ensure that multiple agents are not running builds/releases using the same service endpoint simultaneously on the same machine.", "InvalidScriptArguments0": "Invalid script arguments '{0}'. Line breaks are not allowed.", - "InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified." + "InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified.", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" } } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/task.loc.json b/Tasks/ServiceFabricPowerShellV1/task.loc.json index 9079c46a6e61..7a94fc050b93 100644 --- a/Tasks/ServiceFabricPowerShellV1/task.loc.json +++ b/Tasks/ServiceFabricPowerShellV1/task.loc.json @@ -95,4 +95,4 @@ "InvalidScriptPath0": "ms-resource:loc.messages.InvalidScriptPath0", "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" } -} +} \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/task.json b/_generated/AzurePowerShellV4/task.json index 6a765438c079..92bb734b58c1 100644 --- a/_generated/AzurePowerShellV4/task.json +++ b/_generated/AzurePowerShellV4/task.json @@ -212,7 +212,8 @@ "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "JS_ExitCode": "PowerShell exited with code '%s'.", "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" }, "_buildConfigMapping": { "Default": "4.274.6", diff --git a/_generated/AzurePowerShellV4_Node24/task.json b/_generated/AzurePowerShellV4_Node24/task.json index a61af1136704..be9007402c24 100644 --- a/_generated/AzurePowerShellV4_Node24/task.json +++ b/_generated/AzurePowerShellV4_Node24/task.json @@ -216,7 +216,8 @@ "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "JS_ExitCode": "PowerShell exited with code '%s'.", "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" }, "_buildConfigMapping": { "Default": "4.274.6", diff --git a/_generated/AzurePowerShellV5/task.json b/_generated/AzurePowerShellV5/task.json index 248aba250e9a..de1c7ff4543b 100644 --- a/_generated/AzurePowerShellV5/task.json +++ b/_generated/AzurePowerShellV5/task.json @@ -206,7 +206,8 @@ "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "PS_ExitCode": "PowerShell exited with code '{0}'.", - "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" + "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" }, "_buildConfigMapping": { "Default": "5.274.6", diff --git a/_generated/AzurePowerShellV5_Node24/task.json b/_generated/AzurePowerShellV5_Node24/task.json index 205461122adf..f81f39cb062f 100644 --- a/_generated/AzurePowerShellV5_Node24/task.json +++ b/_generated/AzurePowerShellV5_Node24/task.json @@ -210,7 +210,8 @@ "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "PS_ExitCode": "PowerShell exited with code '{0}'.", - "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" + "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" }, "_buildConfigMapping": { "Default": "5.274.6", From 475156d4329121c4ff05dd3f19f3d74eb17dab13 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Wed, 13 May 2026 14:16:43 +0200 Subject: [PATCH 18/25] Sanitizer dispatcher: throw module's own PS_ScriptArgsSanitized key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The CI's static loc-resource check ('Find missing string in .ps1/.psm1') scans each PS file under Tasks/Common// and requires every Get-VstsLocString -Key 'X' call to have 'X' declared in that module's module.json. My dispatcher lives in Tasks/Common/Sanitizer/ and threw with the task-level key 'ScriptArgsSanitized', which is declared in each task's task.json but NOT in the Sanitizer module.json — so the test failed. Fix: switch the throw to the module's own 'PS_ScriptArgsSanitized' key, which is already declared in Tasks/Common/Sanitizer/module.json and its 10 locale resjson files. This makes the dispatcher self-contained at the module level (the principle the static check enforces). Behavior is unchanged: the en-US text of 'PS_ScriptArgsSanitized' (module) and 'ScriptArgsSanitized' (task) are byte-identical, and the fail-closed logic is preserved. Non-en-US locales will see the module's translation instead of the task's; this is actually a small improvement because the dispatcher and the underlying Protect-ScriptArguments now speak the same key — no locale-drift surface remains at all. Updates the dispatcher's L0 tests to assert on 'PS_ScriptArgsSanitized' accordingly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Invoke-ScriptArgumentSanitization.ps1 | 22 +++++++++++-------- .../L0Invoke-ScriptArgumentSanitization.ps1 | 14 ++++++------ 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 b/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 index e2e6f72fd854..2caee9817729 100644 --- a/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 +++ b/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 @@ -112,17 +112,21 @@ function Invoke-ScriptArgumentSanitization { # sanitization gate did not pass cleanly, so abort the task. # # We deliberately do NOT compare $_.Exception.Message to a localized - # 'ScriptArgsSanitized' value to distinguish "rejection" from - # "unexpected crash": - # * The Sanitizer module throws Get-VstsLocString -Key 'PS_ScriptArgsSanitized' - # while the task resjson uses key 'ScriptArgsSanitized'. Translators - # localized the two strings independently (e.g. fr-FR uses "coche" in - # one and "backtick" in the other), so -eq is unreliable in any locale - # where the strings diverge, which would let a sanitizer rejection - # slip into a "swallow into telemetry" branch and bypass the gate. + # value to distinguish "rejection" from "unexpected crash": + # * Translators localize 'PS_ScriptArgsSanitized' (this module) and + # 'ScriptArgsSanitized' (task task.json) independently. fr-FR already + # diverges today ("coche" vs "backtick"). A -eq comparison on any + # locale where strings drift would let a sanitizer rejection slip + # into a "swallow into telemetry" branch and bypass the gate. # * Even if the sanitizer crashed with an unrelated error, executing # the un-vetted arguments is exactly the vulnerability we are guarding # against. Failing closed is the safer default. + # + # The throw uses this module's own 'PS_ScriptArgsSanitized' key so all + # Get-VstsLocString references in this file resolve from the module's + # module.json (enforced by Tests/L0/loc-resource-keys). The customer- + # facing en-US text is identical to the task-level 'ScriptArgsSanitized' + # string, so behavior is unchanged. $sanitizerThrew = $false $caughtMessage = $null $caughtStack = $null @@ -141,6 +145,6 @@ function Invoke-ScriptArgumentSanitization { errorMessage = $caughtMessage errorStackTrace = $caughtStack } - throw (Get-VstsLocString -Key 'ScriptArgsSanitized') + throw (Get-VstsLocString -Key 'PS_ScriptArgsSanitized') } } diff --git a/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 b/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 index 5eb32d872887..0c41bb3fc4c5 100644 --- a/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 +++ b/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 @@ -100,10 +100,10 @@ Invoke-ScriptArgumentSanitization -InputArgs $cleanArgs -TaskName $taskName -Pip Assert-WasCalled Protect-ScriptArguments -Times 1 # --- Gates on + dirty args => Protect-ScriptArguments throws => dispatcher fails closed -# with the task-localized 'ScriptArgsSanitized' message regardless of the +# with the module-localized 'PS_ScriptArgsSanitized' message regardless of the # message the underlying sanitizer produced. --- # Initialize-Test.ps1 mocks Get-VstsLocString to return the key, so the localized -# message is 'ScriptArgsSanitized'. +# message is 'PS_ScriptArgsSanitized'. Reset-AllMocks Register-Mock Get-SanitizerCallStatus { return $true } Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } @@ -112,10 +112,10 @@ Register-Mock Protect-ScriptArguments { throw 'PS_ScriptArgsSanitized' } # wha Assert-Throws { Invoke-ScriptArgumentSanitization -InputArgs $dirtyArgs -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag -} -MessagePattern 'ScriptArgsSanitized' +} -MessagePattern 'PS_ScriptArgsSanitized' # --- Locale-drift hardening: even if the underlying sanitizer throws a -# localized message that does NOT match the task's 'ScriptArgsSanitized' +# localized message that does NOT match the module's 'PS_ScriptArgsSanitized' # value (e.g. fr-FR "coche" vs "backtick" wording), the dispatcher must # still fail closed. This guards against the original bug where -eq # against Get-VstsLocString silently let injection through in non-en @@ -128,10 +128,10 @@ Register-Mock Protect-ScriptArguments { throw "Caracteres detectes dans les argu Assert-Throws { Invoke-ScriptArgumentSanitization -InputArgs $dirtyArgs -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag -} -MessagePattern 'ScriptArgsSanitized' +} -MessagePattern 'PS_ScriptArgsSanitized' # --- Fail-closed semantics: an unexpected sanitizer crash must NOT silently -# let the task continue with un-vetted args. Re-thrown as ScriptArgsSanitized. --- +# let the task continue with un-vetted args. Re-thrown as PS_ScriptArgsSanitized. --- Reset-AllMocks Register-Mock Get-SanitizerCallStatus { return $true } Register-Mock Get-Command { return $true } -ParametersEvaluator { $Name -eq 'Get-VstsPipelineFeature' } @@ -140,7 +140,7 @@ Register-Mock Protect-ScriptArguments { throw 'Unexpected internal error' } Assert-Throws { Invoke-ScriptArgumentSanitization -InputArgs $dirtyArgs -TaskName $taskName -PipelineFeatureFlagName $pipelineFlag -} -MessagePattern 'ScriptArgsSanitized' +} -MessagePattern 'PS_ScriptArgsSanitized' # --- Empty input is allowed (parameter has [AllowEmptyString()]) --- Reset-AllMocks From 4e43912179e06cff0b867257c9f2b81f83ca9a44 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Wed, 13 May 2026 14:29:29 +0200 Subject: [PATCH 19/25] Remove dead ScriptArgsSanitized loc entries from the 5 sanitizer-adopter tasks Earlier commits in this PR added 'ScriptArgsSanitized' to task.json / task.loc.json / 10 locale resjsons for AzurePowerShellV2-V5 and ServiceFabricPowerShellV1, mirroring the convention used by PowerShellV2 and the other inline-sanitizer tasks. After consolidating the dispatch logic into Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 and switching its throw to the module's own 'PS_ScriptArgsSanitized' key, those task-level entries became unreachable - no .ps1 in these 5 tasks calls Get-VstsLocString -Key 'ScriptArgsSanitized' anymore (verified by grep). This commit removes the dead entries from each of the 5 tasks: - task.json messages -> rebuild via 'node make.js build --task X' to regenerate task.loc.json and en-US/resources.resjson canonically. - 9 non-en-US locale resjsons -> manually stripped. BuildConfigGen re-syncs the AzurePowerShellV4/V5 generated mirrors. Net effect: only the live 'PS_ScriptArgsSanitized' key (declared in Tasks/Common/Sanitizer/module.json + its 10 locales) is referenced at runtime by any code path in this PR. The diff vs master shrinks because we're undoing additions made earlier in the same PR. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Strings/resources.resjson/de-DE/resources.resjson | 3 +-- .../Strings/resources.resjson/en-US/resources.resjson | 3 +-- .../Strings/resources.resjson/es-ES/resources.resjson | 3 +-- .../Strings/resources.resjson/fr-FR/resources.resjson | 3 +-- .../Strings/resources.resjson/it-IT/resources.resjson | 3 +-- .../Strings/resources.resjson/ja-JP/resources.resjson | 3 +-- .../Strings/resources.resjson/ko-KR/resources.resjson | 3 +-- .../Strings/resources.resjson/ru-RU/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-CN/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-TW/resources.resjson | 3 +-- Tasks/AzurePowerShellV2/task.json | 3 +-- Tasks/AzurePowerShellV2/task.loc.json | 3 +-- .../Strings/resources.resjson/de-DE/resources.resjson | 3 +-- .../Strings/resources.resjson/en-US/resources.resjson | 3 +-- .../Strings/resources.resjson/es-ES/resources.resjson | 3 +-- .../Strings/resources.resjson/fr-FR/resources.resjson | 3 +-- .../Strings/resources.resjson/it-IT/resources.resjson | 3 +-- .../Strings/resources.resjson/ja-JP/resources.resjson | 3 +-- .../Strings/resources.resjson/ko-KR/resources.resjson | 3 +-- .../Strings/resources.resjson/ru-RU/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-CN/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-TW/resources.resjson | 3 +-- Tasks/AzurePowerShellV3/task.json | 3 +-- Tasks/AzurePowerShellV3/task.loc.json | 3 +-- .../Strings/resources.resjson/de-DE/resources.resjson | 3 +-- .../Strings/resources.resjson/es-ES/resources.resjson | 3 +-- .../Strings/resources.resjson/fr-FR/resources.resjson | 3 +-- .../Strings/resources.resjson/it-IT/resources.resjson | 3 +-- .../Strings/resources.resjson/ja-JP/resources.resjson | 3 +-- .../Strings/resources.resjson/ko-KR/resources.resjson | 3 +-- .../Strings/resources.resjson/ru-RU/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-CN/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-TW/resources.resjson | 3 +-- Tasks/AzurePowerShellV4/task.json | 3 +-- .../Strings/resources.resjson/de-DE/resources.resjson | 3 +-- .../Strings/resources.resjson/es-ES/resources.resjson | 3 +-- .../Strings/resources.resjson/fr-FR/resources.resjson | 3 +-- .../Strings/resources.resjson/it-IT/resources.resjson | 3 +-- .../Strings/resources.resjson/ja-JP/resources.resjson | 3 +-- .../Strings/resources.resjson/ko-KR/resources.resjson | 3 +-- .../Strings/resources.resjson/ru-RU/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-CN/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-TW/resources.resjson | 3 +-- Tasks/AzurePowerShellV5/task.json | 3 +-- .../Strings/resources.resjson/de-DE/resources.resjson | 3 +-- .../Strings/resources.resjson/en-US/resources.resjson | 3 +-- .../Strings/resources.resjson/es-ES/resources.resjson | 3 +-- .../Strings/resources.resjson/fr-FR/resources.resjson | 3 +-- .../Strings/resources.resjson/it-IT/resources.resjson | 3 +-- .../Strings/resources.resjson/ja-JP/resources.resjson | 3 +-- .../Strings/resources.resjson/ko-KR/resources.resjson | 3 +-- .../Strings/resources.resjson/ru-RU/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-CN/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-TW/resources.resjson | 3 +-- Tasks/ServiceFabricPowerShellV1/task.json | 3 +-- Tasks/ServiceFabricPowerShellV1/task.loc.json | 3 +-- .../Strings/resources.resjson/de-DE/resources.resjson | 3 +-- .../Strings/resources.resjson/es-ES/resources.resjson | 3 +-- .../Strings/resources.resjson/fr-FR/resources.resjson | 3 +-- .../Strings/resources.resjson/it-IT/resources.resjson | 3 +-- .../Strings/resources.resjson/ja-JP/resources.resjson | 3 +-- .../Strings/resources.resjson/ko-KR/resources.resjson | 3 +-- .../Strings/resources.resjson/ru-RU/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-CN/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-TW/resources.resjson | 3 +-- _generated/AzurePowerShellV4/task.json | 3 +-- .../Strings/resources.resjson/de-DE/resources.resjson | 3 +-- .../Strings/resources.resjson/es-ES/resources.resjson | 3 +-- .../Strings/resources.resjson/fr-FR/resources.resjson | 3 +-- .../Strings/resources.resjson/it-IT/resources.resjson | 3 +-- .../Strings/resources.resjson/ja-JP/resources.resjson | 3 +-- .../Strings/resources.resjson/ko-KR/resources.resjson | 3 +-- .../Strings/resources.resjson/ru-RU/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-CN/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-TW/resources.resjson | 3 +-- _generated/AzurePowerShellV4_Node24/task.json | 3 +-- .../Strings/resources.resjson/de-DE/resources.resjson | 3 +-- .../Strings/resources.resjson/es-ES/resources.resjson | 3 +-- .../Strings/resources.resjson/fr-FR/resources.resjson | 3 +-- .../Strings/resources.resjson/it-IT/resources.resjson | 3 +-- .../Strings/resources.resjson/ja-JP/resources.resjson | 3 +-- .../Strings/resources.resjson/ko-KR/resources.resjson | 3 +-- .../Strings/resources.resjson/ru-RU/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-CN/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-TW/resources.resjson | 3 +-- _generated/AzurePowerShellV5/task.json | 3 +-- .../Strings/resources.resjson/de-DE/resources.resjson | 3 +-- .../Strings/resources.resjson/es-ES/resources.resjson | 3 +-- .../Strings/resources.resjson/fr-FR/resources.resjson | 3 +-- .../Strings/resources.resjson/it-IT/resources.resjson | 3 +-- .../Strings/resources.resjson/ja-JP/resources.resjson | 3 +-- .../Strings/resources.resjson/ko-KR/resources.resjson | 3 +-- .../Strings/resources.resjson/ru-RU/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-CN/resources.resjson | 3 +-- .../Strings/resources.resjson/zh-TW/resources.resjson | 3 +-- _generated/AzurePowerShellV5_Node24/task.json | 3 +-- 96 files changed, 96 insertions(+), 192 deletions(-) diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/de-DE/resources.resjson index 83f6bb8fd895..a29bb239b45e 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/de-DE/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/de-DE/resources.resjson @@ -23,6 +23,5 @@ "loc.messages.InvalidScriptArguments0": "Ungültige Skriptargumente \"{0}\". Zeilenumbrüche sind unzulässig.", "loc.messages.InvalidScriptPath0": "Ungültiger Skriptpfad \"{0}\". Es wurden ungültige Pfadzeichen angegeben.", "loc.messages.InvalidAzurePsVersion": "Die angegebene Azure PowerShell-Version \"{0}\" weist nicht das richtige Format auf. Überprüfen Sie das Format. Ein Beispiel für das richtige Format ist etwa 1.0.1.", - "loc.messages.OverrideAzurePowerShellVersion": "Die Azure PowerShell-Version {0} wird für den gehosteten Agent nicht unterstützt. Überschreiben Sie die Version mit Version {1}. Erwägen Sie eine Änderung der ausgewählten Version.", - "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "Die Azure PowerShell-Version {0} wird für den gehosteten Agent nicht unterstützt. Überschreiben Sie die Version mit Version {1}. Erwägen Sie eine Änderung der ausgewählten Version." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/en-US/resources.resjson index 65522609e5a1..3b35b215561a 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/en-US/resources.resjson @@ -23,6 +23,5 @@ "loc.messages.InvalidScriptArguments0": "Invalid script arguments '{0}'. Line breaks are not allowed.", "loc.messages.InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified.", "loc.messages.InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected.", - "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/es-ES/resources.resjson index 335870d8753f..e1f00725aa04 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/es-ES/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/es-ES/resources.resjson @@ -23,6 +23,5 @@ "loc.messages.InvalidScriptArguments0": "Argumentos de script '{0}' no válidos. No se permiten los saltos de línea.", "loc.messages.InvalidScriptPath0": "Ruta del script '{0}' no válida. Los caracteres de ruta de acceso especificados no son válidos.", "loc.messages.InvalidAzurePsVersion": "La versión de Azure PowerShell \"{0}\" especificada no tiene el formato correcto. Compruebe el formato. Ejemplo de formato correcto: 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "La versión \"{0}\" de Azure PowerShell no se admite para el agente hospedado. Reemplácela por la versión \"{1}\". Considere la posibilidad de cambiar la versión seleccionada.", - "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "La versión \"{0}\" de Azure PowerShell no se admite para el agente hospedado. Reemplácela por la versión \"{1}\". Considere la posibilidad de cambiar la versión seleccionada." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/fr-FR/resources.resjson index 6df1cb0502bf..84c994440a71 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/fr-FR/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/fr-FR/resources.resjson @@ -23,6 +23,5 @@ "loc.messages.InvalidScriptArguments0": "Arguments de script '{0}' non valides. Les sauts de ligne ne sont pas autorisés.", "loc.messages.InvalidScriptPath0": "Chemin de script '{0}' non valide. Caractères non valides spécifiés dans le chemin.", "loc.messages.InvalidAzurePsVersion": "La version '{0}' spécifiée pour Azure PowerShell n'est pas au format approprié. Vérifiez le format. Exemple de format correct : 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell '{0}' n'est pas une version prise en charge pour l'agent hébergé. Remplacement par la version '{1}'. Changez la version sélectionnée.", - "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell '{0}' n'est pas une version prise en charge pour l'agent hébergé. Remplacement par la version '{1}'. Changez la version sélectionnée." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/it-IT/resources.resjson index 4a620097983a..b161f3acc527 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/it-IT/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/it-IT/resources.resjson @@ -23,6 +23,5 @@ "loc.messages.InvalidScriptArguments0": "Gli argomenti '{0}' dello script non sono validi. Le interruzioni di riga non sono consentite.", "loc.messages.InvalidScriptPath0": "Il percorso '{0}' dello script non è valido. Sono stati specificati caratteri non validi.", "loc.messages.InvalidAzurePsVersion": "Il formato della versione di Azure PowerShell '{0}' specificata non è corretto. Controllare il formato. Un esempio di formato corretto è 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "La versione '{0}' di Azure PowerShell non è supportata per l'agente ospitato e verrà sostituita con la versione '{1}'. Provare a cambiare la versione selezionata.", - "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "La versione '{0}' di Azure PowerShell non è supportata per l'agente ospitato e verrà sostituita con la versione '{1}'. Provare a cambiare la versione selezionata." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/ja-JP/resources.resjson index 600e531a6e1a..f10cda098934 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/ja-JP/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/ja-JP/resources.resjson @@ -23,6 +23,5 @@ "loc.messages.InvalidScriptArguments0": "スクリプトの引数 '{0}' が無効です。改行は使用できません。", "loc.messages.InvalidScriptPath0": "スクリプト パス '{0}' が無効です。無効なパス文字が指定されました。", "loc.messages.InvalidAzurePsVersion": "指定した Azure PowerShell バージョン '{0}' は、形式が正しくありません。形式をご確認ください。正しい形式の例は、1.0.1 です", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell バージョン '{0}' はホストされたエージェントではサポートされていません。バージョン '{1}' でオーバーライドされます。選択したバージョンを変更することをご検討ください。", - "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell バージョン '{0}' はホストされたエージェントではサポートされていません。バージョン '{1}' でオーバーライドされます。選択したバージョンを変更することをご検討ください。" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/ko-KR/resources.resjson index 5f1400e1978f..01d53629918f 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/ko-KR/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/ko-KR/resources.resjson @@ -23,6 +23,5 @@ "loc.messages.InvalidScriptArguments0": "스크립트 인수 '{0}'이(가) 잘못되었습니다. 줄 바꿈은 허용되지 않습니다.", "loc.messages.InvalidScriptPath0": "스크립트 경로 '{0}'이(가) 잘못되었습니다. 잘못된 경로 문자를 지정했습니다.", "loc.messages.InvalidAzurePsVersion": "지정한 Azure PowerShell 버전 '{0}'의 형식이 잘못되었습니다. 형식을 확인하세요. 올바른 형식의 예는 1.0.1입니다.", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 버전 '{0}'은(는) 호스트된 에이전트에 사용할 수 없습니다. '{1}' 버전으로 재정의하세요. 선택한 버전을 변경하는 것이 좋습니다.", - "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 버전 '{0}'은(는) 호스트된 에이전트에 사용할 수 없습니다. '{1}' 버전으로 재정의하세요. 선택한 버전을 변경하는 것이 좋습니다." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/ru-RU/resources.resjson index c34e07e63400..281a68db04ea 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/ru-RU/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/ru-RU/resources.resjson @@ -23,6 +23,5 @@ "loc.messages.InvalidScriptArguments0": "Недопустимые аргументы скрипта \"{0}\". Разрывы строк запрещены.", "loc.messages.InvalidScriptPath0": "Недопустимый путь к скрипту \"{0}\". Указаны символы, недопустимые в пути.", "loc.messages.InvalidAzurePsVersion": "Указанная версия Azure PowerShell \"{0}\" имеет неправильный формат. Проверьте формат. Пример правильного формата: 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "Версия Azure PowerShell \"{0}\" не поддерживается для размещенного агента. Она будет заменена на версию \"{1}\". Попробуйте изменить выбранную версию.", - "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "Версия Azure PowerShell \"{0}\" не поддерживается для размещенного агента. Она будет заменена на версию \"{1}\". Попробуйте изменить выбранную версию." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-CN/resources.resjson index fbf99d055880..9e6012aca2e8 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-CN/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-CN/resources.resjson @@ -23,6 +23,5 @@ "loc.messages.InvalidScriptArguments0": "脚本参数“{0}”无效。不允许换行。", "loc.messages.InvalidScriptPath0": "脚本路径“{0}”无效。指定的路径字符无效。", "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本“{0}”格式不正确。请检查格式。正确格式的示例为 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 版本“{0}”不受托管代理支持。将其替代为版本“{1}”。请考虑更改选定的版本。", - "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 版本“{0}”不受托管代理支持。将其替代为版本“{1}”。请考虑更改选定的版本。" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-TW/resources.resjson index 28b329ed5240..a99b0642e6b9 100644 --- a/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-TW/resources.resjson +++ b/Tasks/AzurePowerShellV2/Strings/resources.resjson/zh-TW/resources.resjson @@ -23,6 +23,5 @@ "loc.messages.InvalidScriptArguments0": "指令碼引數 '{0}' 無效。不允許分行符號。", "loc.messages.InvalidScriptPath0": "指令碼路徑 '{0}' 無效。指定的路徑字元無效。", "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本 '{0}' 格式不正確。請檢查格式。正確格式的範例為 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "裝載的代理程式不支援 Azure PowerShell '{0}' 版。正在以 '{1}' 版予以覆寫。請考慮變更選取的版本。", - "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "裝載的代理程式不支援 Azure PowerShell '{0}' 版。正在以 '{1}' 版予以覆寫。請考慮變更選取的版本。" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/task.json b/Tasks/AzurePowerShellV2/task.json index 55929e83fc36..4070663eba93 100644 --- a/Tasks/AzurePowerShellV2/task.json +++ b/Tasks/AzurePowerShellV2/task.json @@ -150,7 +150,6 @@ "InvalidScriptArguments0": "Invalid script arguments '{0}'. Line breaks are not allowed.", "InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified.", "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", - "OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected.", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected." } } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV2/task.loc.json b/Tasks/AzurePowerShellV2/task.loc.json index c5af204721db..5a46c106a30b 100644 --- a/Tasks/AzurePowerShellV2/task.loc.json +++ b/Tasks/AzurePowerShellV2/task.loc.json @@ -150,7 +150,6 @@ "InvalidScriptArguments0": "ms-resource:loc.messages.InvalidScriptArguments0", "InvalidScriptPath0": "ms-resource:loc.messages.InvalidScriptPath0", "InvalidAzurePsVersion": "ms-resource:loc.messages.InvalidAzurePsVersion", - "OverrideAzurePowerShellVersion": "ms-resource:loc.messages.OverrideAzurePowerShellVersion", - "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" + "OverrideAzurePowerShellVersion": "ms-resource:loc.messages.OverrideAzurePowerShellVersion" } } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/de-DE/resources.resjson index 7fb732466642..a6ae7e3f5d6f 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/de-DE/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/de-DE/resources.resjson @@ -32,6 +32,5 @@ "loc.messages.InvalidScriptArguments0": "Ungültige Skriptargumente \"{0}\". Zeilenumbrüche sind unzulässig.", "loc.messages.InvalidScriptPath0": "Ungültiger Skriptpfad \"{0}\". Es wurden ungültige Pfadzeichen angegeben.", "loc.messages.InvalidAzurePsVersion": "Die angegebene Azure PowerShell-Version \"{0}\" weist nicht das richtige Format auf. Überprüfen Sie das Format. Ein Beispiel für das richtige Format ist etwa 1.0.1.", - "loc.messages.OverrideAzurePowerShellVersion": "Die Azure PowerShell-Version {0} wird für den gehosteten Agent nicht unterstützt. Überschreiben Sie die Version mit Version {1}. Erwägen Sie eine Änderung der ausgewählten Version.", - "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "Die Azure PowerShell-Version {0} wird für den gehosteten Agent nicht unterstützt. Überschreiben Sie die Version mit Version {1}. Erwägen Sie eine Änderung der ausgewählten Version." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/en-US/resources.resjson index 39997dbe971e..882f573851e3 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/en-US/resources.resjson @@ -32,6 +32,5 @@ "loc.messages.InvalidScriptArguments0": "Invalid script arguments '{0}'. Line breaks are not allowed.", "loc.messages.InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified.", "loc.messages.InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected.", - "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/es-ES/resources.resjson index 93e056ef9ce7..b650a45b02ae 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/es-ES/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/es-ES/resources.resjson @@ -32,6 +32,5 @@ "loc.messages.InvalidScriptArguments0": "Argumentos de script '{0}' no válidos. No se permiten los saltos de línea.", "loc.messages.InvalidScriptPath0": "Ruta del script '{0}' no válida. Los caracteres de ruta de acceso especificados no son válidos.", "loc.messages.InvalidAzurePsVersion": "La versión de Azure PowerShell \"{0}\" especificada no tiene el formato correcto. Compruebe el formato. Ejemplo de formato correcto: 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "La versión \"{0}\" de Azure PowerShell no se admite para el agente hospedado. Reemplácela por la versión \"{1}\". Considere la posibilidad de cambiar la versión seleccionada.", - "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "La versión \"{0}\" de Azure PowerShell no se admite para el agente hospedado. Reemplácela por la versión \"{1}\". Considere la posibilidad de cambiar la versión seleccionada." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/fr-FR/resources.resjson index 6fb17b5d88c4..caa770170c8b 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/fr-FR/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/fr-FR/resources.resjson @@ -32,6 +32,5 @@ "loc.messages.InvalidScriptArguments0": "Arguments de script '{0}' non valides. Les sauts de ligne ne sont pas autorisés.", "loc.messages.InvalidScriptPath0": "Chemin de script '{0}' non valide. Caractères non valides spécifiés dans le chemin.", "loc.messages.InvalidAzurePsVersion": "La version '{0}' spécifiée pour Azure PowerShell n'est pas au format approprié. Vérifiez le format. Exemple de format correct : 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell '{0}' n'est pas une version prise en charge pour l'agent hébergé. Remplacement par la version '{1}'. Changez la version sélectionnée.", - "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell '{0}' n'est pas une version prise en charge pour l'agent hébergé. Remplacement par la version '{1}'. Changez la version sélectionnée." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/it-IT/resources.resjson index 44cd7e9be06f..9cdf8d5daecc 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/it-IT/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/it-IT/resources.resjson @@ -32,6 +32,5 @@ "loc.messages.InvalidScriptArguments0": "Gli argomenti '{0}' dello script non sono validi. Le interruzioni di riga non sono consentite.", "loc.messages.InvalidScriptPath0": "Il percorso '{0}' dello script non è valido. Sono stati specificati caratteri non validi.", "loc.messages.InvalidAzurePsVersion": "Il formato della versione di Azure PowerShell '{0}' specificata non è corretto. Controllare il formato. Un esempio di formato corretto è 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "La versione '{0}' di Azure PowerShell non è supportata per l'agente ospitato e verrà sostituita con la versione '{1}'. Provare a cambiare la versione selezionata.", - "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "La versione '{0}' di Azure PowerShell non è supportata per l'agente ospitato e verrà sostituita con la versione '{1}'. Provare a cambiare la versione selezionata." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/ja-JP/resources.resjson index ce811de15f69..734ec125b739 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/ja-JP/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/ja-JP/resources.resjson @@ -32,6 +32,5 @@ "loc.messages.InvalidScriptArguments0": "スクリプトの引数 '{0}' が無効です。改行は使用できません。", "loc.messages.InvalidScriptPath0": "スクリプト パス '{0}' が無効です。無効なパス文字が指定されました。", "loc.messages.InvalidAzurePsVersion": "指定した Azure PowerShell バージョン '{0}' は、形式が正しくありません。形式をご確認ください。正しい形式の例は、1.0.1 です", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell バージョン '{0}' はホストされたエージェントではサポートされていません。バージョン '{1}' でオーバーライドされます。選択したバージョンを変更することをご検討ください。", - "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell バージョン '{0}' はホストされたエージェントではサポートされていません。バージョン '{1}' でオーバーライドされます。選択したバージョンを変更することをご検討ください。" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/ko-KR/resources.resjson index 9a945c9e8147..85352bb58972 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/ko-KR/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/ko-KR/resources.resjson @@ -32,6 +32,5 @@ "loc.messages.InvalidScriptArguments0": "스크립트 인수 '{0}'이(가) 잘못되었습니다. 줄 바꿈은 허용되지 않습니다.", "loc.messages.InvalidScriptPath0": "스크립트 경로 '{0}'이(가) 잘못되었습니다. 잘못된 경로 문자를 지정했습니다.", "loc.messages.InvalidAzurePsVersion": "지정한 Azure PowerShell 버전 '{0}'의 형식이 잘못되었습니다. 형식을 확인하세요. 올바른 형식의 예는 1.0.1입니다.", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 버전 '{0}'은(는) 호스트된 에이전트에 사용할 수 없습니다. '{1}' 버전으로 재정의하세요. 선택한 버전을 변경하는 것이 좋습니다.", - "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 버전 '{0}'은(는) 호스트된 에이전트에 사용할 수 없습니다. '{1}' 버전으로 재정의하세요. 선택한 버전을 변경하는 것이 좋습니다." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/ru-RU/resources.resjson index 35970ecea2c4..2d440b3058fd 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/ru-RU/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/ru-RU/resources.resjson @@ -32,6 +32,5 @@ "loc.messages.InvalidScriptArguments0": "Недопустимые аргументы скрипта \"{0}\". Разрывы строк запрещены.", "loc.messages.InvalidScriptPath0": "Недопустимый путь к скрипту \"{0}\". Указаны символы, недопустимые в пути.", "loc.messages.InvalidAzurePsVersion": "Указанная версия Azure PowerShell \"{0}\" имеет неправильный формат. Проверьте формат. Пример правильного формата: 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "Версия Azure PowerShell \"{0}\" не поддерживается для размещенного агента. Она будет заменена на версию \"{1}\". Попробуйте изменить выбранную версию.", - "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "Версия Azure PowerShell \"{0}\" не поддерживается для размещенного агента. Она будет заменена на версию \"{1}\". Попробуйте изменить выбранную версию." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-CN/resources.resjson index 63f12a4270e2..89766a0a4118 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-CN/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-CN/resources.resjson @@ -32,6 +32,5 @@ "loc.messages.InvalidScriptArguments0": "脚本参数“{0}”无效。不允许换行。", "loc.messages.InvalidScriptPath0": "脚本路径“{0}”无效。指定的路径字符无效。", "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本“{0}”格式不正确。请检查格式。正确格式的示例为 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 版本“{0}”不受托管代理支持。将其替代为版本“{1}”。请考虑更改选定的版本。", - "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "Azure PowerShell 版本“{0}”不受托管代理支持。将其替代为版本“{1}”。请考虑更改选定的版本。" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-TW/resources.resjson index ef5a2b1cce8e..fd1f026f6997 100644 --- a/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-TW/resources.resjson +++ b/Tasks/AzurePowerShellV3/Strings/resources.resjson/zh-TW/resources.resjson @@ -32,6 +32,5 @@ "loc.messages.InvalidScriptArguments0": "指令碼引數 '{0}' 無效。不允許分行符號。", "loc.messages.InvalidScriptPath0": "指令碼路徑 '{0}' 無效。指定的路徑字元無效。", "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本 '{0}' 格式不正確。請檢查格式。正確格式的範例為 1.0.1", - "loc.messages.OverrideAzurePowerShellVersion": "裝載的代理程式不支援 Azure PowerShell '{0}' 版。正在以 '{1}' 版予以覆寫。請考慮變更選取的版本。", - "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" + "loc.messages.OverrideAzurePowerShellVersion": "裝載的代理程式不支援 Azure PowerShell '{0}' 版。正在以 '{1}' 版予以覆寫。請考慮變更選取的版本。" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/task.json b/Tasks/AzurePowerShellV3/task.json index de3a614887e3..62ba216d2d44 100644 --- a/Tasks/AzurePowerShellV3/task.json +++ b/Tasks/AzurePowerShellV3/task.json @@ -200,7 +200,6 @@ "InvalidScriptArguments0": "Invalid script arguments '{0}'. Line breaks are not allowed.", "InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified.", "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", - "OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected.", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "OverrideAzurePowerShellVersion": "The Azure PowerShell version '{0}' is not supported for Hosted Agent. Overriding it with version '{1}'. Consider changing the version selected." } } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV3/task.loc.json b/Tasks/AzurePowerShellV3/task.loc.json index d45cbdefde98..c4dfeff5de53 100644 --- a/Tasks/AzurePowerShellV3/task.loc.json +++ b/Tasks/AzurePowerShellV3/task.loc.json @@ -200,7 +200,6 @@ "InvalidScriptArguments0": "ms-resource:loc.messages.InvalidScriptArguments0", "InvalidScriptPath0": "ms-resource:loc.messages.InvalidScriptPath0", "InvalidAzurePsVersion": "ms-resource:loc.messages.InvalidAzurePsVersion", - "OverrideAzurePowerShellVersion": "ms-resource:loc.messages.OverrideAzurePowerShellVersion", - "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" + "OverrideAzurePowerShellVersion": "ms-resource:loc.messages.OverrideAzurePowerShellVersion" } } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson index 259af9c5a85d..44d372e42cb4 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "Die angegebene Azure PowerShell-Version \"{0}\" weist nicht das richtige Format auf. Überprüfen Sie das Format. Ein Beispiel für das richtige Format ist etwa 1.0.1.", "loc.messages.JS_ExitCode": "PowerShell wurde beendet mit dem Code \"%s\".", "loc.messages.JS_Stderr": "PowerShell hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", - "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", - "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson index 4598cf9b0f58..9f596d3fdf27 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "La versión de Azure PowerShell \"{0}\" especificada no tiene el formato correcto. Compruebe el formato. Ejemplo de formato correcto: 1.0.1", "loc.messages.JS_ExitCode": "PowerShell se cerró con el código \"%s\".", "loc.messages.JS_Stderr": "PowerShell escribió una o varias líneas en la secuencia de error estándar.", - "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", - "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson index 67ebbc0a8c81..85ffdca03de8 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "La version '{0}' spécifiée pour Azure PowerShell n'est pas au format approprié. Vérifiez le format. Exemple de format correct : 1.0.1", "loc.messages.JS_ExitCode": "Arrêt de PowerShell. Code de sortie : '%s'.", "loc.messages.JS_Stderr": "PowerShell a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", - "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", - "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson index 08667373fad7..de03075839b5 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "Il formato della versione di Azure PowerShell '{0}' specificata non è corretto. Controllare il formato. Un esempio di formato corretto è 1.0.1", "loc.messages.JS_ExitCode": "PowerShell terminato con codice '%s'.", "loc.messages.JS_Stderr": "PowerShell ha scritto una o più righe nel flusso di errore standard.", - "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", - "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson index 85e75c29d6d6..5f60ce4b7a81 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "指定した Azure PowerShell バージョン '{0}' は、形式が正しくありません。形式をご確認ください。正しい形式の例は、1.0.1 です", "loc.messages.JS_ExitCode": "PowerShell がコード '%s' で終了しました。", "loc.messages.JS_Stderr": "PowerShell が標準エラー ストリームに 1 行以上を書き込みました。", - "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", - "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson index 03505c625ad8..b00a1a1619c4 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "지정한 Azure PowerShell 버전 '{0}'의 형식이 잘못되었습니다. 형식을 확인하세요. 올바른 형식의 예는 1.0.1입니다.", "loc.messages.JS_ExitCode": "PowerShell이 코드 '%s'(으)로 종료되었습니다.", "loc.messages.JS_Stderr": "PowerShell이 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", - "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", - "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." + "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson index cd64f05a2457..c20a9b0fce5f 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "Указанная версия Azure PowerShell \"{0}\" имеет неправильный формат. Проверьте формат. Пример правильного формата: 1.0.1", "loc.messages.JS_ExitCode": "Завершение работы PowerShell с кодом \"%s\".", "loc.messages.JS_Stderr": "Оболочка PowerShell записала одну или несколько строк в стандартный поток ошибок.", - "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", - "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson index 136fb8907b47..fe4a5eb3b960 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本“{0}”格式不正确。请检查格式。正确格式的示例为 1.0.1", "loc.messages.JS_ExitCode": "PowerShell 已退出,代码为“%s”。", "loc.messages.JS_Stderr": "PowerShell 向标准错误流写入一个或多个行。", - "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", - "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson index 06c8ca132cca..5b87db2dbbac 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本 '{0}' 格式不正確。請檢查格式。正確格式的範例為 1.0.1", "loc.messages.JS_ExitCode": "PowerShell 已結束,代碼為 '%s'。", "loc.messages.JS_Stderr": "PowerShell 已將一或多行寫入標準錯誤資料流。", - "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", - "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/task.json b/Tasks/AzurePowerShellV4/task.json index 57cd7d3196e7..cb94d1581b87 100644 --- a/Tasks/AzurePowerShellV4/task.json +++ b/Tasks/AzurePowerShellV4/task.json @@ -212,7 +212,6 @@ "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "JS_ExitCode": "PowerShell exited with code '%s'.", "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." } } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson index 7a9e97cb6756..01cef9e088bc 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", "loc.messages.PS_ExitCode": "PowerShell wurde beendet mit dem Code \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}", - "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson index b6a1fc1d44c3..a272cd593e8b 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell escribió una o varias líneas en la secuencia de error estándar.", "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", "loc.messages.PS_ExitCode": "PowerShell se cerró con el código \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}", - "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson index 2f5f02c388f9..15ee7854ad82 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", "loc.messages.PS_ExitCode": "Arrêt de PowerShell. Code de sortie : '{0}'.", - "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}", - "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson index 57f487484097..ba4a514ec06b 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell ha scritto una o più righe nel flusso di errore standard.", "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", "loc.messages.PS_ExitCode": "PowerShell terminato con codice '{0}'.", - "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}", - "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson index 8b83a0d4a3c9..e54d0a199131 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell が標準エラー ストリームに 1 行以上を書き込みました。", "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", "loc.messages.PS_ExitCode": "PowerShell がコード '{0}' で終了しました。", - "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です", - "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson index a548a581e5f1..a25c8316e474 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell이 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", "loc.messages.PS_ExitCode": "PowerShell이 코드 '{0}'(으)로 종료되었습니다.", - "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다.", - "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." + "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson index e05c6308f03b..d65e2b9d2b6b 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "Оболочка PowerShell записала одну или несколько строк в стандартный поток ошибок.", "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", "loc.messages.PS_ExitCode": "Завершение работы PowerShell с кодом \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}", - "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson index 6b713587eb06..5fca75a131f5 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell 向标准错误流写入一个或多个行。", "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", "loc.messages.PS_ExitCode": "PowerShell 已退出,代码为“{0}”。", - "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}", - "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson index 7cd24fddf52c..91a14581861f 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell 已將一或多行寫入標準錯誤資料流。", "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", "loc.messages.PS_ExitCode": "PowerShell 已結束,代碼為 '{0}'。", - "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}", - "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/task.json b/Tasks/AzurePowerShellV5/task.json index 781aeeb209e3..c2b88fecc4e5 100644 --- a/Tasks/AzurePowerShellV5/task.json +++ b/Tasks/AzurePowerShellV5/task.json @@ -206,7 +206,6 @@ "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "PS_ExitCode": "PowerShell exited with code '{0}'.", - "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" } } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/de-DE/resources.resjson index d7cffbe350fd..7804cd486c63 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/de-DE/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/de-DE/resources.resjson @@ -15,6 +15,5 @@ "loc.input.help.ScriptArguments": "Zusätzliche Argumente, die an PowerShell übergeben werden sollen. Entweder Ordnungszahl- oder benannte Parameter.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "Das Zertifikat mit dem Fingerabdruck \"{0}\" ist nicht im lokalen Zertifikatspeicher vorhanden. Dies kann möglicherweise zu Fehlern führen. Wenn Release-/Buildfehler auftreten, versuchen Sie es noch mal, oder stellen Sie sicher, dass nicht mehrere Agents Builds/Releases unter Verwendung desselben Dienstendpunkts parallel auf demselben Computer ausführen.", "loc.messages.InvalidScriptArguments0": "Ungültige Skriptargumente \"{0}\". Zeilenumbrüche sind unzulässig.", - "loc.messages.InvalidScriptPath0": "Ungültiger Skriptpfad \"{0}\". Es wurden ungültige Pfadzeichen angegeben.", - "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" + "loc.messages.InvalidScriptPath0": "Ungültiger Skriptpfad \"{0}\". Es wurden ungültige Pfadzeichen angegeben." } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/en-US/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/en-US/resources.resjson index 7593fc2d351e..a600d37bf3ba 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/en-US/resources.resjson @@ -15,6 +15,5 @@ "loc.input.help.ScriptArguments": "Additional parameters to pass to PowerShell. Can be either ordinal or named parameters.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "The certificate with thumbprint {0} is not present in the local certificate store. This can potentially cause errors. If the release/build fails, please re-try it or ensure that multiple agents are not running builds/releases using the same service endpoint simultaneously on the same machine.", "loc.messages.InvalidScriptArguments0": "Invalid script arguments '{0}'. Line breaks are not allowed.", - "loc.messages.InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified.", - "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "loc.messages.InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified." } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/es-ES/resources.resjson index 1359d058a4b8..7f5b9d7c6a64 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/es-ES/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/es-ES/resources.resjson @@ -15,6 +15,5 @@ "loc.input.help.ScriptArguments": "Parámetros adicionales que pasar a PowerShell. Pueden ser parámetros ordinales o con nombre.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "El certificado con la huella digital {0} no está presente en el almacén de certificados local, lo cual puede causar errores. Si se produce un error de versión o compilación, vuelva a intentarlo o asegúrese de que no haya varios agentes que ejecuten compilaciones o versiones que usan el mismo punto de conexión de servicio simultáneamente en la misma máquina.", "loc.messages.InvalidScriptArguments0": "Argumentos de script '{0}' no válidos. No se permiten los saltos de línea.", - "loc.messages.InvalidScriptPath0": "Ruta del script '{0}' no válida. Los caracteres de ruta de acceso especificados no son válidos.", - "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" + "loc.messages.InvalidScriptPath0": "Ruta del script '{0}' no válida. Los caracteres de ruta de acceso especificados no son válidos." } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/fr-FR/resources.resjson index b86626bdd4e1..8c05752b605e 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/fr-FR/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -15,6 +15,5 @@ "loc.input.help.ScriptArguments": "Paramètres supplémentaires à passer à PowerShell. Peuvent être des paramètres ordinaux ou nommés.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "Le certificat avec l'empreinte numérique {0} n'est pas présent dans le magasin de certificats local. Cela peut entraîner des erreurs. En cas d'échec de la mise en production/build, réessayez l'opération, ou vérifiez que plusieurs agents n'exécutent pas de builds/mises en production simultanément à l'aide du même point de terminaison de service sur la même machine.", "loc.messages.InvalidScriptArguments0": "Arguments de script '{0}' non valides. Les sauts de ligne ne sont pas autorisés.", - "loc.messages.InvalidScriptPath0": "Chemin de script '{0}' non valide. Caractères non valides spécifiés dans le chemin.", - "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" + "loc.messages.InvalidScriptPath0": "Chemin de script '{0}' non valide. Caractères non valides spécifiés dans le chemin." } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/it-IT/resources.resjson index 7dfab59ec367..2f78864f1554 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/it-IT/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/it-IT/resources.resjson @@ -15,6 +15,5 @@ "loc.input.help.ScriptArguments": "Parametri aggiuntivi da passare a PowerShell. Possono essere ordinali o denominati.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "Il certificato con identificazione personale {0} non è presente nell'archivio certificati locale. Questa condizione potrebbe causare errori. Se la versione/compilazione non riesce, riprovare oppure verificare che più agenti non eseguano compilazioni/versioni usando contemporaneamente lo stesso endpoint servizio nello stesso computer.", "loc.messages.InvalidScriptArguments0": "Gli argomenti '{0}' dello script non sono validi. Le interruzioni di riga non sono consentite.", - "loc.messages.InvalidScriptPath0": "Il percorso '{0}' dello script non è valido. Sono stati specificati caratteri non validi.", - "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" + "loc.messages.InvalidScriptPath0": "Il percorso '{0}' dello script non è valido. Sono stati specificati caratteri non validi." } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ja-JP/resources.resjson index 366971dd9059..a09e7f457f58 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ja-JP/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -15,6 +15,5 @@ "loc.input.help.ScriptArguments": "PowerShell に渡す追加のパラメーター。順序によるパラメーターまたは名前指定されたパラメーターのいずれかです。", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "サムプリント {0} を持つ証明書がローカル証明書ストアに存在しません。これによりエラーが発生する可能性があります。リリースまたはビルドが失敗する場合、再試行するか、同じマシンで同じサービス エンドポイントを同時に使用して複数のエージェントによってビルドやリリースが実行されていないことをご確認ください。", "loc.messages.InvalidScriptArguments0": "スクリプトの引数 '{0}' が無効です。改行は使用できません。", - "loc.messages.InvalidScriptPath0": "スクリプト パス '{0}' が無効です。無効なパス文字が指定されました。", - "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" + "loc.messages.InvalidScriptPath0": "スクリプト パス '{0}' が無効です。無効なパス文字が指定されました。" } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ko-KR/resources.resjson index 528109fa20cd..8e796c7783e3 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ko-KR/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -15,6 +15,5 @@ "loc.input.help.ScriptArguments": "PowerShell에 전달할 추가 인수입니다. 서수 매개 변수나 명명된 매개 변수 중 하나일 수 있습니다.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "지문이 {0}인 인증서가 로컬 인증서 저장소에 없습니다. 이로 인해 오류가 발생할 수 있습니다. 릴리스/빌드에 실패하는 경우 다시 시도하거나, 동일한 머신에서 여러 에이전트가 동일한 서비스 엔드포인트를 사용하여 빌드/릴리스를 동시에 실행하고 있지 않은지 확인하세요.", "loc.messages.InvalidScriptArguments0": "스크립트 인수 '{0}'이(가) 잘못되었습니다. 줄 바꿈은 허용되지 않습니다.", - "loc.messages.InvalidScriptPath0": "스크립트 경로 '{0}'이(가) 잘못되었습니다. 잘못된 경로 문자를 지정했습니다.", - "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." + "loc.messages.InvalidScriptPath0": "스크립트 경로 '{0}'이(가) 잘못되었습니다. 잘못된 경로 문자를 지정했습니다." } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ru-RU/resources.resjson index 2eeeeb80be32..d03ac0e098e1 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ru-RU/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -15,6 +15,5 @@ "loc.input.help.ScriptArguments": "Дополнительные параметры для передачи в PowerShell. Могут быть как порядковыми, так и именованными.", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "Сертификат с отпечатком {0} отсутствует в локальном хранилище сертификатов. Это может вызвать ошибки. В случае сбоя выпуска или сборки повторите попытку или убедитесь, что на одном и том же компьютере не выполняется несколько агентов, одновременно запускающих сборки/выпуски с использованием одной конечной точки службы.", "loc.messages.InvalidScriptArguments0": "Недопустимые аргументы скрипта \"{0}\". Разрывы строк запрещены.", - "loc.messages.InvalidScriptPath0": "Недопустимый путь к скрипту \"{0}\". Указаны символы, недопустимые в пути.", - "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" + "loc.messages.InvalidScriptPath0": "Недопустимый путь к скрипту \"{0}\". Указаны символы, недопустимые в пути." } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-CN/resources.resjson index 170ebd91c44b..ec957178c7e7 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-CN/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -15,6 +15,5 @@ "loc.input.help.ScriptArguments": "要传递给 PowerShell 的其他参数。可以是序号或命名参数。", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "具有指纹 {0} 的证书在本地证书存储中不存在。这可能会导致错误。如果发布/生成失败,请重试此操作,或确保多个代理未在同一计算机上同时使用同一服务终结点运行生成/发布。", "loc.messages.InvalidScriptArguments0": "脚本参数“{0}”无效。不允许换行。", - "loc.messages.InvalidScriptPath0": "脚本路径“{0}”无效。指定的路径字符无效。", - "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" + "loc.messages.InvalidScriptPath0": "脚本路径“{0}”无效。指定的路径字符无效。" } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-TW/resources.resjson index b9741f11df7d..3145f7fc7190 100644 --- a/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-TW/resources.resjson +++ b/Tasks/ServiceFabricPowerShellV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -15,6 +15,5 @@ "loc.input.help.ScriptArguments": "傳遞至 PowerShell 的額外引數。可以是序數或具名參數。", "loc.messages.CertNotPresentInLocalStoreWarningMsg": "指紋為 {0} 的憑證不在本機憑證存放區中。這可能會造成錯誤。如果發行/建置失敗,請予以重試,或確保多個代理程式不會在相同的電腦上,同時使用相同的服務端點執行發行/建置。", "loc.messages.InvalidScriptArguments0": "指令碼引數 '{0}' 無效。不允許分行符號。", - "loc.messages.InvalidScriptPath0": "指令碼路徑 '{0}' 無效。指定的路徑字元無效。", - "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" + "loc.messages.InvalidScriptPath0": "指令碼路徑 '{0}' 無效。指定的路徑字元無效。" } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/task.json b/Tasks/ServiceFabricPowerShellV1/task.json index 7030002c7cf3..4674c5a693e3 100644 --- a/Tasks/ServiceFabricPowerShellV1/task.json +++ b/Tasks/ServiceFabricPowerShellV1/task.json @@ -92,7 +92,6 @@ "messages": { "CertNotPresentInLocalStoreWarningMsg": "The certificate with thumbprint {0} is not present in the local certificate store. This can potentially cause errors. If the release/build fails, please re-try it or ensure that multiple agents are not running builds/releases using the same service endpoint simultaneously on the same machine.", "InvalidScriptArguments0": "Invalid script arguments '{0}'. Line breaks are not allowed.", - "InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified.", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "InvalidScriptPath0": "Invalid script path '{0}'. Invalid path characters specified." } } \ No newline at end of file diff --git a/Tasks/ServiceFabricPowerShellV1/task.loc.json b/Tasks/ServiceFabricPowerShellV1/task.loc.json index 7a94fc050b93..211ae2c19492 100644 --- a/Tasks/ServiceFabricPowerShellV1/task.loc.json +++ b/Tasks/ServiceFabricPowerShellV1/task.loc.json @@ -92,7 +92,6 @@ "messages": { "CertNotPresentInLocalStoreWarningMsg": "ms-resource:loc.messages.CertNotPresentInLocalStoreWarningMsg", "InvalidScriptArguments0": "ms-resource:loc.messages.InvalidScriptArguments0", - "InvalidScriptPath0": "ms-resource:loc.messages.InvalidScriptPath0", - "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" + "InvalidScriptPath0": "ms-resource:loc.messages.InvalidScriptPath0" } } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson index 259af9c5a85d..44d372e42cb4 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/de-DE/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "Die angegebene Azure PowerShell-Version \"{0}\" weist nicht das richtige Format auf. Überprüfen Sie das Format. Ein Beispiel für das richtige Format ist etwa 1.0.1.", "loc.messages.JS_ExitCode": "PowerShell wurde beendet mit dem Code \"%s\".", "loc.messages.JS_Stderr": "PowerShell hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", - "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", - "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson index 4598cf9b0f58..9f596d3fdf27 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/es-ES/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "La versión de Azure PowerShell \"{0}\" especificada no tiene el formato correcto. Compruebe el formato. Ejemplo de formato correcto: 1.0.1", "loc.messages.JS_ExitCode": "PowerShell se cerró con el código \"%s\".", "loc.messages.JS_Stderr": "PowerShell escribió una o varias líneas en la secuencia de error estándar.", - "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", - "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson index 67ebbc0a8c81..85ffdca03de8 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/fr-FR/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "La version '{0}' spécifiée pour Azure PowerShell n'est pas au format approprié. Vérifiez le format. Exemple de format correct : 1.0.1", "loc.messages.JS_ExitCode": "Arrêt de PowerShell. Code de sortie : '%s'.", "loc.messages.JS_Stderr": "PowerShell a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", - "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", - "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson index 08667373fad7..de03075839b5 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/it-IT/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "Il formato della versione di Azure PowerShell '{0}' specificata non è corretto. Controllare il formato. Un esempio di formato corretto è 1.0.1", "loc.messages.JS_ExitCode": "PowerShell terminato con codice '%s'.", "loc.messages.JS_Stderr": "PowerShell ha scritto una o più righe nel flusso di errore standard.", - "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", - "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson index 85e75c29d6d6..5f60ce4b7a81 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/ja-JP/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "指定した Azure PowerShell バージョン '{0}' は、形式が正しくありません。形式をご確認ください。正しい形式の例は、1.0.1 です", "loc.messages.JS_ExitCode": "PowerShell がコード '%s' で終了しました。", "loc.messages.JS_Stderr": "PowerShell が標準エラー ストリームに 1 行以上を書き込みました。", - "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", - "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson index 03505c625ad8..b00a1a1619c4 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/ko-KR/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "지정한 Azure PowerShell 버전 '{0}'의 형식이 잘못되었습니다. 형식을 확인하세요. 올바른 형식의 예는 1.0.1입니다.", "loc.messages.JS_ExitCode": "PowerShell이 코드 '%s'(으)로 종료되었습니다.", "loc.messages.JS_Stderr": "PowerShell이 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", - "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", - "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." + "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson index cd64f05a2457..c20a9b0fce5f 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/ru-RU/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "Указанная версия Azure PowerShell \"{0}\" имеет неправильный формат. Проверьте формат. Пример правильного формата: 1.0.1", "loc.messages.JS_ExitCode": "Завершение работы PowerShell с кодом \"%s\".", "loc.messages.JS_Stderr": "Оболочка PowerShell записала одну или несколько строк в стандартный поток ошибок.", - "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", - "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson index 136fb8907b47..fe4a5eb3b960 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-CN/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本“{0}”格式不正确。请检查格式。正确格式的示例为 1.0.1", "loc.messages.JS_ExitCode": "PowerShell 已退出,代码为“%s”。", "loc.messages.JS_Stderr": "PowerShell 向标准错误流写入一个或多个行。", - "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", - "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson index 06c8ca132cca..5b87db2dbbac 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/zh-TW/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本 '{0}' 格式不正確。請檢查格式。正確格式的範例為 1.0.1", "loc.messages.JS_ExitCode": "PowerShell 已結束,代碼為 '%s'。", "loc.messages.JS_Stderr": "PowerShell 已將一或多行寫入標準錯誤資料流。", - "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", - "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/task.json b/_generated/AzurePowerShellV4/task.json index 92bb734b58c1..6a765438c079 100644 --- a/_generated/AzurePowerShellV4/task.json +++ b/_generated/AzurePowerShellV4/task.json @@ -212,8 +212,7 @@ "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "JS_ExitCode": "PowerShell exited with code '%s'.", "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." }, "_buildConfigMapping": { "Default": "4.274.6", diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/de-DE/resources.resjson index 259af9c5a85d..44d372e42cb4 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/de-DE/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/de-DE/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "Die angegebene Azure PowerShell-Version \"{0}\" weist nicht das richtige Format auf. Überprüfen Sie das Format. Ein Beispiel für das richtige Format ist etwa 1.0.1.", "loc.messages.JS_ExitCode": "PowerShell wurde beendet mit dem Code \"%s\".", "loc.messages.JS_Stderr": "PowerShell hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", - "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", - "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/es-ES/resources.resjson index 4598cf9b0f58..9f596d3fdf27 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/es-ES/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/es-ES/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "La versión de Azure PowerShell \"{0}\" especificada no tiene el formato correcto. Compruebe el formato. Ejemplo de formato correcto: 1.0.1", "loc.messages.JS_ExitCode": "PowerShell se cerró con el código \"%s\".", "loc.messages.JS_Stderr": "PowerShell escribió una o varias líneas en la secuencia de error estándar.", - "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", - "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/fr-FR/resources.resjson index 67ebbc0a8c81..85ffdca03de8 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/fr-FR/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/fr-FR/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "La version '{0}' spécifiée pour Azure PowerShell n'est pas au format approprié. Vérifiez le format. Exemple de format correct : 1.0.1", "loc.messages.JS_ExitCode": "Arrêt de PowerShell. Code de sortie : '%s'.", "loc.messages.JS_Stderr": "PowerShell a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", - "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", - "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/it-IT/resources.resjson index 08667373fad7..de03075839b5 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/it-IT/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/it-IT/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "Il formato della versione di Azure PowerShell '{0}' specificata non è corretto. Controllare il formato. Un esempio di formato corretto è 1.0.1", "loc.messages.JS_ExitCode": "PowerShell terminato con codice '%s'.", "loc.messages.JS_Stderr": "PowerShell ha scritto una o più righe nel flusso di errore standard.", - "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", - "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ja-JP/resources.resjson index 85e75c29d6d6..5f60ce4b7a81 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ja-JP/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ja-JP/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "指定した Azure PowerShell バージョン '{0}' は、形式が正しくありません。形式をご確認ください。正しい形式の例は、1.0.1 です", "loc.messages.JS_ExitCode": "PowerShell がコード '%s' で終了しました。", "loc.messages.JS_Stderr": "PowerShell が標準エラー ストリームに 1 行以上を書き込みました。", - "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", - "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ko-KR/resources.resjson index 03505c625ad8..b00a1a1619c4 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ko-KR/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ko-KR/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "지정한 Azure PowerShell 버전 '{0}'의 형식이 잘못되었습니다. 형식을 확인하세요. 올바른 형식의 예는 1.0.1입니다.", "loc.messages.JS_ExitCode": "PowerShell이 코드 '%s'(으)로 종료되었습니다.", "loc.messages.JS_Stderr": "PowerShell이 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", - "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", - "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." + "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ru-RU/resources.resjson index cd64f05a2457..c20a9b0fce5f 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ru-RU/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/ru-RU/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "Указанная версия Azure PowerShell \"{0}\" имеет неправильный формат. Проверьте формат. Пример правильного формата: 1.0.1", "loc.messages.JS_ExitCode": "Завершение работы PowerShell с кодом \"%s\".", "loc.messages.JS_Stderr": "Оболочка PowerShell записала одну или несколько строк в стандартный поток ошибок.", - "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", - "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-CN/resources.resjson index 136fb8907b47..fe4a5eb3b960 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-CN/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-CN/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本“{0}”格式不正确。请检查格式。正确格式的示例为 1.0.1", "loc.messages.JS_ExitCode": "PowerShell 已退出,代码为“%s”。", "loc.messages.JS_Stderr": "PowerShell 向标准错误流写入一个或多个行。", - "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", - "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-TW/resources.resjson index 06c8ca132cca..5b87db2dbbac 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-TW/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/zh-TW/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "指定的 Azure PowerShell 版本 '{0}' 格式不正確。請檢查格式。正確格式的範例為 1.0.1", "loc.messages.JS_ExitCode": "PowerShell 已結束,代碼為 '%s'。", "loc.messages.JS_Stderr": "PowerShell 已將一或多行寫入標準錯誤資料流。", - "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", - "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/task.json b/_generated/AzurePowerShellV4_Node24/task.json index be9007402c24..a61af1136704 100644 --- a/_generated/AzurePowerShellV4_Node24/task.json +++ b/_generated/AzurePowerShellV4_Node24/task.json @@ -216,8 +216,7 @@ "InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "JS_ExitCode": "PowerShell exited with code '%s'.", "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." }, "_buildConfigMapping": { "Default": "4.274.6", diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson index 7a9e97cb6756..01cef9e088bc 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/de-DE/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", "loc.messages.PS_ExitCode": "PowerShell wurde beendet mit dem Code \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}", - "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson index b6a1fc1d44c3..a272cd593e8b 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/es-ES/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell escribió una o varias líneas en la secuencia de error estándar.", "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", "loc.messages.PS_ExitCode": "PowerShell se cerró con el código \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}", - "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson index 2f5f02c388f9..15ee7854ad82 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/fr-FR/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", "loc.messages.PS_ExitCode": "Arrêt de PowerShell. Code de sortie : '{0}'.", - "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}", - "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson index 57f487484097..ba4a514ec06b 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/it-IT/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell ha scritto una o più righe nel flusso di errore standard.", "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", "loc.messages.PS_ExitCode": "PowerShell terminato con codice '{0}'.", - "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}", - "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson index 8b83a0d4a3c9..e54d0a199131 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/ja-JP/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell が標準エラー ストリームに 1 行以上を書き込みました。", "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", "loc.messages.PS_ExitCode": "PowerShell がコード '{0}' で終了しました。", - "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です", - "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson index a548a581e5f1..a25c8316e474 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/ko-KR/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell이 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", "loc.messages.PS_ExitCode": "PowerShell이 코드 '{0}'(으)로 종료되었습니다.", - "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다.", - "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." + "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson index e05c6308f03b..d65e2b9d2b6b 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/ru-RU/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "Оболочка PowerShell записала одну или несколько строк в стандартный поток ошибок.", "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", "loc.messages.PS_ExitCode": "Завершение работы PowerShell с кодом \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}", - "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson index 6b713587eb06..5fca75a131f5 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-CN/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell 向标准错误流写入一个或多个行。", "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", "loc.messages.PS_ExitCode": "PowerShell 已退出,代码为“{0}”。", - "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}", - "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson index 7cd24fddf52c..91a14581861f 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/zh-TW/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell 已將一或多行寫入標準錯誤資料流。", "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", "loc.messages.PS_ExitCode": "PowerShell 已結束,代碼為 '{0}'。", - "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}", - "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/task.json b/_generated/AzurePowerShellV5/task.json index de1c7ff4543b..248aba250e9a 100644 --- a/_generated/AzurePowerShellV5/task.json +++ b/_generated/AzurePowerShellV5/task.json @@ -206,8 +206,7 @@ "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "PS_ExitCode": "PowerShell exited with code '{0}'.", - "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" }, "_buildConfigMapping": { "Default": "5.274.6", diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/de-DE/resources.resjson index 7a9e97cb6756..01cef9e088bc 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/de-DE/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/de-DE/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", "loc.messages.PS_ExitCode": "PowerShell wurde beendet mit dem Code \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}", - "loc.messages.ScriptArgsSanitized": "Erkannte Zeichen in Argumenten, die von der Shell möglicherweise nicht ordnungsgemäß ausgeführt werden. Verwenden Sie einen Backtick (`), um Sonderzeichen mit Escapezeichen zu versehen. Weitere Informationen finden Sie hier: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "Die angegebene {0} Version {1} ist veraltet, die neueste Version ist {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/es-ES/resources.resjson index b6a1fc1d44c3..a272cd593e8b 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/es-ES/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/es-ES/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell escribió una o varias líneas en la secuencia de error estándar.", "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", "loc.messages.PS_ExitCode": "PowerShell se cerró con el código \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}", - "loc.messages.ScriptArgsSanitized": "Se detectaron caracteres en argumentos que el shell no puede ejecutar correctamente. Escape de los caracteres especiales mediante el acento grave ('). Puede encontrar más información aquí: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "La versión {0} especificada {1} está desactualizada, la versión más reciente es {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/fr-FR/resources.resjson index 2f5f02c388f9..15ee7854ad82 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/fr-FR/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/fr-FR/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", "loc.messages.PS_ExitCode": "Arrêt de PowerShell. Code de sortie : '{0}'.", - "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}", - "loc.messages.ScriptArgsSanitized": "Caractères détectés dans les arguments qui peuvent ne pas être exécutés correctement par le shell. Veuillez échapper les caractères spéciaux en utilisant le backtick (`). Plus d'informations sont disponibles ici: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "La version {0} spécifiée {1} est obsolète, la dernière version est {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/it-IT/resources.resjson index 57f487484097..ba4a514ec06b 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/it-IT/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/it-IT/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell ha scritto una o più righe nel flusso di errore standard.", "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", "loc.messages.PS_ExitCode": "PowerShell terminato con codice '{0}'.", - "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}", - "loc.messages.ScriptArgsSanitized": "Sono stati rilevati caratteri negli argomenti che potrebbero non essere eseguiti correttamente dalla shell. Eseguire l'escape dei caratteri speciali usando l’apice inverso (`). Ulteriori informazioni sono disponibili qui: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "La versione {0} di {1} specificata è obsoleta, la versione più recente è {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ja-JP/resources.resjson index 8b83a0d4a3c9..e54d0a199131 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ja-JP/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ja-JP/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell が標準エラー ストリームに 1 行以上を書き込みました。", "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", "loc.messages.PS_ExitCode": "PowerShell がコード '{0}' で終了しました。", - "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です", - "loc.messages.ScriptArgsSanitized": "シェルによって正しく実行されない可能性のある引数の文字が検出されました。バックティック (`) を使用して特殊文字をエスケープしてください。詳細についてはこちら: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "指定された {0} バージョン {1} は古くなっています。最新のバージョンは {2}です" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ko-KR/resources.resjson index a548a581e5f1..a25c8316e474 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ko-KR/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ko-KR/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell이 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", "loc.messages.PS_ExitCode": "PowerShell이 코드 '{0}'(으)로 종료되었습니다.", - "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다.", - "loc.messages.ScriptArgsSanitized": "셸에서 올바르게 실행되지 않을 수 있는 인수에서 검색된 문자입니다. 백틱(`)을 사용하여 이스케이프 특수 문자를 만드세요. 자세한 내용은 https://aka.ms/ado/75787을 참조하세요." + "loc.messages.Az_LowerVersionWarning": "지정한 {0} 버전 {1}이(가) 만료되었습니다. 최신 버전은 {2}입니다." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ru-RU/resources.resjson index e05c6308f03b..d65e2b9d2b6b 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ru-RU/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/ru-RU/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "Оболочка PowerShell записала одну или несколько строк в стандартный поток ошибок.", "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", "loc.messages.PS_ExitCode": "Завершение работы PowerShell с кодом \"{0}\".", - "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}", - "loc.messages.ScriptArgsSanitized": "Обнаружены символы в аргументах, которые могут быть неправильно интерпретированы оболочкой. Экранируйте специальные символы с помощью обратного апострофа (`). Дополнительные сведения см. на следующей странице: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "Указанная версия {0} {1} устарела, последняя версия: {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-CN/resources.resjson index 6b713587eb06..5fca75a131f5 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-CN/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-CN/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell 向标准错误流写入一个或多个行。", "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", "loc.messages.PS_ExitCode": "PowerShell 已退出,代码为“{0}”。", - "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}", - "loc.messages.ScriptArgsSanitized": "在参数中检测到可能无法由 shell 正确执行的字符。请使用反引号斜杠 (`) 转义特殊字符。有关详细信息,请访问此处: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已过时,最新版本为 {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-TW/resources.resjson index 7cd24fddf52c..91a14581861f 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-TW/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/zh-TW/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell 已將一或多行寫入標準錯誤資料流。", "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", "loc.messages.PS_ExitCode": "PowerShell 已結束,代碼為 '{0}'。", - "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}", - "loc.messages.ScriptArgsSanitized": "偵測到引數中可能無法由殼層正確執行的字元。請使用反單引號 (') 逸出特殊字元。如需詳細資訊,請參閱: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "指定的 {0} 版本 {1} 已過時,最新版本為 {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/task.json b/_generated/AzurePowerShellV5_Node24/task.json index f81f39cb062f..205461122adf 100644 --- a/_generated/AzurePowerShellV5_Node24/task.json +++ b/_generated/AzurePowerShellV5_Node24/task.json @@ -210,8 +210,7 @@ "JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "PS_ExitCode": "PowerShell exited with code '{0}'.", - "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", - "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" }, "_buildConfigMapping": { "Default": "5.274.6", From d4ae2292eebd913fe7470fa61e8318ec0da41712 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Wed, 13 May 2026 14:33:31 +0200 Subject: [PATCH 20/25] Sanitizer dispatcher: don't say 'Get-VstsLocString' in a comment (L0 lint) The Tests/L0 'Find missing string in .ps1/.psm1' test does a case-insensitive substring search for 'Get-VstsLocString' on every line in every .ps1/.psm1 under Tasks/ (excluding Tests/). When it finds the substring, it tries to parse the line as a 'Get-VstsLocString -Key ...' call. If the parse fails, it asserts 'Bad format string'. The test doesn't distinguish code from comments. My explanatory comment mentioned the cmdlet name verbatim, so the test flagged it. Reworded the comment to describe the behavior ('loc resource references') without using the literal cmdlet name. No code change. Also adds C:/ado/temp/check-loc-strings.js (local equivalent of the CI step) so future iterations of this PR can be validated before pushing. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Invoke-ScriptArgumentSanitization.ps1 | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 b/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 index 2caee9817729..0ce65db13c95 100644 --- a/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 +++ b/Tasks/Common/Sanitizer/Invoke-ScriptArgumentSanitization.ps1 @@ -111,22 +111,20 @@ function Invoke-ScriptArgumentSanitization { # Fail closed: ANY exception from Protect-ScriptArguments means the # sanitization gate did not pass cleanly, so abort the task. # - # We deliberately do NOT compare $_.Exception.Message to a localized + # We deliberately do NOT compare the exception message to a localized # value to distinguish "rejection" from "unexpected crash": - # * Translators localize 'PS_ScriptArgsSanitized' (this module) and - # 'ScriptArgsSanitized' (task task.json) independently. fr-FR already - # diverges today ("coche" vs "backtick"). A -eq comparison on any - # locale where strings drift would let a sanitizer rejection slip - # into a "swallow into telemetry" branch and bypass the gate. + # * Translators localize the module-level key (PS_ prefix) and the + # task-level key independently. fr-FR already diverges today + # ("coche" vs "backtick"). A string equality check on any locale + # where strings drift would let a sanitizer rejection slip into a + # "swallow into telemetry" branch and bypass the gate. # * Even if the sanitizer crashed with an unrelated error, executing # the un-vetted arguments is exactly the vulnerability we are guarding # against. Failing closed is the safer default. # - # The throw uses this module's own 'PS_ScriptArgsSanitized' key so all - # Get-VstsLocString references in this file resolve from the module's - # module.json (enforced by Tests/L0/loc-resource-keys). The customer- - # facing en-US text is identical to the task-level 'ScriptArgsSanitized' - # string, so behavior is unchanged. + # The throw uses this module's own PS_ScriptArgsSanitized key so all + # loc resource references in this file resolve from the module's + # module.json (enforced by Tests/L0 General Suite). $sanitizerThrew = $false $caughtMessage = $null $caughtStack = $null From ace8751e87d9a7e0d79449d8a700ffed0bc83433 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Wed, 13 May 2026 14:47:45 +0200 Subject: [PATCH 21/25] Regenerate _generated/AzurePowerShellV{4,5}{,_Node24} loc files after cleanup After the previous commit removed the dead ScriptArgsSanitized entries from the source task.json files, _generated/AzurePowerShellV4_Node24/task.json and V5_Node24/task.json were updated by BuildConfigGen but their dependent task.loc.json + en-US/resources.resjson were not re-emitted from the build pass. CI 'Verify task source changes' flagged them. Re-ran 'node make.js build --task AzurePowerShellV{4,5}' which regenerates all config mirrors (Default + Node24_1) from the updated task.json sources. Four files updated per task (Default and Node24 both have task.loc.json + en-US resjson). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Strings/resources.resjson/en-US/resources.resjson | 3 +-- _generated/AzurePowerShellV4/task.loc.json | 3 +-- .../Strings/resources.resjson/en-US/resources.resjson | 3 +-- _generated/AzurePowerShellV4_Node24/task.loc.json | 3 +-- .../Strings/resources.resjson/en-US/resources.resjson | 3 +-- _generated/AzurePowerShellV5/task.loc.json | 3 +-- .../Strings/resources.resjson/en-US/resources.resjson | 3 +-- _generated/AzurePowerShellV5_Node24/task.loc.json | 3 +-- 8 files changed, 8 insertions(+), 16 deletions(-) diff --git a/_generated/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson index f7d72639dfbe..5357601c22f5 100644 --- a/_generated/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson +++ b/_generated/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "loc.messages.JS_ExitCode": "PowerShell exited with code '%s'.", "loc.messages.JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", - "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/task.loc.json b/_generated/AzurePowerShellV4/task.loc.json index 4becd99ed930..667e0acb5bd8 100644 --- a/_generated/AzurePowerShellV4/task.loc.json +++ b/_generated/AzurePowerShellV4/task.loc.json @@ -212,8 +212,7 @@ "InvalidAzurePsVersion": "ms-resource:loc.messages.InvalidAzurePsVersion", "JS_ExitCode": "ms-resource:loc.messages.JS_ExitCode", "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", - "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", - "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" + "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal" }, "_buildConfigMapping": { "Default": "4.274.6", diff --git a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/en-US/resources.resjson index f7d72639dfbe..5357601c22f5 100644 --- a/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/en-US/resources.resjson +++ b/_generated/AzurePowerShellV4_Node24/Strings/resources.resjson/en-US/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "loc.messages.JS_ExitCode": "PowerShell exited with code '%s'.", "loc.messages.JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", - "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/task.loc.json b/_generated/AzurePowerShellV4_Node24/task.loc.json index 3e74ea009e8b..1aa4c3849a94 100644 --- a/_generated/AzurePowerShellV4_Node24/task.loc.json +++ b/_generated/AzurePowerShellV4_Node24/task.loc.json @@ -216,8 +216,7 @@ "InvalidAzurePsVersion": "ms-resource:loc.messages.InvalidAzurePsVersion", "JS_ExitCode": "ms-resource:loc.messages.JS_ExitCode", "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", - "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", - "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" + "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal" }, "_buildConfigMapping": { "Default": "4.274.6", diff --git a/_generated/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson index 168dc362bd47..12a72280c5e2 100644 --- a/_generated/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson +++ b/_generated/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "loc.messages.PS_ExitCode": "PowerShell exited with code '{0}'.", - "loc.messages.Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", - "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/task.loc.json b/_generated/AzurePowerShellV5/task.loc.json index 3b4748a87c42..5c496251463d 100644 --- a/_generated/AzurePowerShellV5/task.loc.json +++ b/_generated/AzurePowerShellV5/task.loc.json @@ -206,8 +206,7 @@ "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", "PS_ExitCode": "ms-resource:loc.messages.PS_ExitCode", - "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning", - "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" + "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning" }, "_buildConfigMapping": { "Default": "5.274.6", diff --git a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/en-US/resources.resjson index 168dc362bd47..12a72280c5e2 100644 --- a/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/en-US/resources.resjson +++ b/_generated/AzurePowerShellV5_Node24/Strings/resources.resjson/en-US/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "loc.messages.PS_ExitCode": "PowerShell exited with code '{0}'.", - "loc.messages.Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", - "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/task.loc.json b/_generated/AzurePowerShellV5_Node24/task.loc.json index 108d4d4006e6..eeafe99a7d3a 100644 --- a/_generated/AzurePowerShellV5_Node24/task.loc.json +++ b/_generated/AzurePowerShellV5_Node24/task.loc.json @@ -210,8 +210,7 @@ "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", "PS_ExitCode": "ms-resource:loc.messages.PS_ExitCode", - "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning", - "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" + "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning" }, "_buildConfigMapping": { "Default": "5.274.6", From 24d91adc9945947655de848c52a1c8844025bad6 Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Wed, 13 May 2026 14:51:01 +0200 Subject: [PATCH 22/25] Clean stale ScriptArgsSanitized from V4/V5 source task.loc.json + en-US resjson MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tasks/AzurePowerShellV4 and V5 use the _buildConfigMapping mechanism, so 'node make.js build --task X' regenerates only the _generated/ mirrors — the source Tasks//task.loc.json and Strings/.../en-US/resources.resjson are hand-maintained / BCG-synced, not build-regenerated. When I removed ScriptArgsSanitized from task.json earlier, the build's regen pass updated V2/V3/SFV1 source loc files (those tasks don't have build configs) but left V4/V5 source loc files with the now-stale entry. BCG verify caught the divergence: V4 task.loc.json had 9 messages (including ScriptArgsSanitized) while V4 task.json had 8. Manually stripped ScriptArgsSanitized from Tasks/AzurePowerShellV{4,5}/ task.loc.json + Strings/.../en-US/resources.resjson (non-en-US locales were already cleaned in a prior commit). BCG verify now reports clean. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Strings/resources.resjson/en-US/resources.resjson | 3 +-- Tasks/AzurePowerShellV4/task.loc.json | 3 +-- .../Strings/resources.resjson/en-US/resources.resjson | 3 +-- Tasks/AzurePowerShellV5/task.loc.json | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Tasks/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson index f7d72639dfbe..5357601c22f5 100644 --- a/Tasks/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/AzurePowerShellV4/Strings/resources.resjson/en-US/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.InvalidAzurePsVersion": "The Azure PowerShell version '{0}' specified is not in the correct format. Please check the format. An example of correct format is 1.0.1", "loc.messages.JS_ExitCode": "PowerShell exited with code '%s'.", "loc.messages.JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", - "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", - "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV4/task.loc.json b/Tasks/AzurePowerShellV4/task.loc.json index 09c762c3f1ce..07db49980cbd 100644 --- a/Tasks/AzurePowerShellV4/task.loc.json +++ b/Tasks/AzurePowerShellV4/task.loc.json @@ -212,7 +212,6 @@ "InvalidAzurePsVersion": "ms-resource:loc.messages.InvalidAzurePsVersion", "JS_ExitCode": "ms-resource:loc.messages.JS_ExitCode", "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", - "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", - "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" + "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal" } } diff --git a/Tasks/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson index 168dc362bd47..12a72280c5e2 100644 --- a/Tasks/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/AzurePowerShellV5/Strings/resources.resjson/en-US/resources.resjson @@ -39,6 +39,5 @@ "loc.messages.JS_Stderr": "PowerShell wrote one or more lines to the standard error stream.", "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", "loc.messages.PS_ExitCode": "PowerShell exited with code '{0}'.", - "loc.messages.Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}", - "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`). More information is available here: https://aka.ms/ado/75787" + "loc.messages.Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" } \ No newline at end of file diff --git a/Tasks/AzurePowerShellV5/task.loc.json b/Tasks/AzurePowerShellV5/task.loc.json index 410ca2726b40..f10b4d2cf627 100644 --- a/Tasks/AzurePowerShellV5/task.loc.json +++ b/Tasks/AzurePowerShellV5/task.loc.json @@ -206,7 +206,6 @@ "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", "PS_ExitCode": "ms-resource:loc.messages.PS_ExitCode", - "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning", - "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" + "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning" } } From 1615be27e24b4f4a2cc0625845effc3941f36a2a Mon Sep 17 00:00:00 2001 From: "Uladzimir Tratsiakou (Vladimir/Vova)" Date: Wed, 13 May 2026 16:22:37 +0200 Subject: [PATCH 23/25] Mock Invoke-ScriptArgumentSanitization in per-task L0 tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The per-task L0 tests for AzurePowerShellV2-V5 and ServiceFabricPowerShellV1 dot-source Tests/lib/Initialize-Test.ps1 (which mocks Import-Module so the Sanitizer common module isn't actually loaded), then directly invoke the task's main script. After this PR's retrofit, those main scripts call Invoke-ScriptArgumentSanitization — which is undefined under the test mock, so PowerShell aborts with 'term not recognized'. MacOS/Linux CI passed because per-task PowerShell-based L0 suites only run on Windows. My local validation also missed it; adding the per-task L0 step to validate-pr-22171.ps1 so future iterations catch this class of failure before push. Fix: add Register-Mock Invoke-ScriptArgumentSanitization (stub no-op) right after Initialize-Test.ps1 in each of the 40 affected source test files across the 5 tasks. BuildConfigGen propagated the mock to the V4/V5 generated mirror Tests/ trees automatically. Local: all 5 tasks now pass L0 (8-13 passing each). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/AzurePowerShellV2/Tests/DoesNotUnravelOutput.ps1 | 1 + Tasks/AzurePowerShellV2/Tests/PerformsBasicFlow.ps1 | 1 + Tasks/AzurePowerShellV2/Tests/RedirectsErrors.ps1 | 1 + Tasks/AzurePowerShellV2/Tests/RemovesFunctionsAndVariables.ps1 | 1 + Tasks/AzurePowerShellV2/Tests/ThrowsForInvalidVersion.ps1 | 1 + .../AzurePowerShellV2/Tests/ThrowsWhenInvalidScriptArguments.ps1 | 1 + Tasks/AzurePowerShellV2/Tests/ThrowsWhenInvalidScriptPath.ps1 | 1 + Tasks/AzurePowerShellV2/Tests/ValidateInlineScriptFlow.ps1 | 1 + Tasks/AzurePowerShellV3/Tests/DoesNotFailOnStandardError.ps1 | 1 + .../Tests/DoesNotThrowForNativeCommandError.ps1 | 1 + Tasks/AzurePowerShellV3/Tests/DoesNotUnravelOutput.ps1 | 1 + Tasks/AzurePowerShellV3/Tests/FailsForNativeCommandError.ps1 | 1 + Tasks/AzurePowerShellV3/Tests/PerformsBasicFlow.ps1 | 1 + Tasks/AzurePowerShellV3/Tests/RedirectsErrors.ps1 | 1 + Tasks/AzurePowerShellV3/Tests/RemovesFunctionsAndVariables.ps1 | 1 + Tasks/AzurePowerShellV3/Tests/ThrowsForInvalidVersion.ps1 | 1 + .../AzurePowerShellV3/Tests/ThrowsWhenInvalidScriptArguments.ps1 | 1 + Tasks/AzurePowerShellV3/Tests/ThrowsWhenInvalidScriptPath.ps1 | 1 + Tasks/AzurePowerShellV3/Tests/ValidateInlineScriptFlow.ps1 | 1 + Tasks/AzurePowerShellV4/Tests/ChecksForPowerShell.ps1 | 1 + Tasks/AzurePowerShellV4/Tests/ChecksForPowerShellCore.ps1 | 1 + Tasks/AzurePowerShellV4/Tests/ChecksForWorkingDirectory.ps1 | 1 + Tasks/AzurePowerShellV4/Tests/PerformsBasicFlow.ps1 | 1 + Tasks/AzurePowerShellV4/Tests/ThrowsForInvalidVersion.ps1 | 1 + .../AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptArguments.ps1 | 1 + Tasks/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptPath.ps1 | 1 + Tasks/AzurePowerShellV5/Tests/ChecksForPowerShell.ps1 | 1 + Tasks/AzurePowerShellV5/Tests/ChecksForPowerShellCore.ps1 | 1 + Tasks/AzurePowerShellV5/Tests/ChecksForWorkingDirectory.ps1 | 1 + Tasks/AzurePowerShellV5/Tests/PerformsBasicFlow.ps1 | 1 + Tasks/AzurePowerShellV5/Tests/ThrowsForInvalidVersion.ps1 | 1 + .../AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptArguments.ps1 | 1 + Tasks/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptPath.ps1 | 1 + Tasks/ServiceFabricPowerShellV1/Tests/DoesNotUnravelOutput.ps1 | 1 + Tasks/ServiceFabricPowerShellV1/Tests/PerformsBasicFlow.ps1 | 1 + Tasks/ServiceFabricPowerShellV1/Tests/RedirectsErrors.ps1 | 1 + .../Tests/RemovesFunctionsAndVariables.ps1 | 1 + .../Tests/ThrowsWhenInvalidScriptArguments.ps1 | 1 + .../Tests/ThrowsWhenInvalidScriptPath.ps1 | 1 + .../ServiceFabricPowerShellV1/Tests/ValidateInlineScriptFlow.ps1 | 1 + _generated/AzurePowerShellV4/Tests/ChecksForPowerShell.ps1 | 1 + _generated/AzurePowerShellV4/Tests/ChecksForPowerShellCore.ps1 | 1 + _generated/AzurePowerShellV4/Tests/ChecksForWorkingDirectory.ps1 | 1 + _generated/AzurePowerShellV4/Tests/PerformsBasicFlow.ps1 | 1 + _generated/AzurePowerShellV4/Tests/ThrowsForInvalidVersion.ps1 | 1 + .../AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptArguments.ps1 | 1 + .../AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptPath.ps1 | 1 + .../AzurePowerShellV4_Node24/Tests/ChecksForPowerShell.ps1 | 1 + .../AzurePowerShellV4_Node24/Tests/ChecksForPowerShellCore.ps1 | 1 + .../AzurePowerShellV4_Node24/Tests/ChecksForWorkingDirectory.ps1 | 1 + _generated/AzurePowerShellV4_Node24/Tests/PerformsBasicFlow.ps1 | 1 + .../AzurePowerShellV4_Node24/Tests/ThrowsForInvalidVersion.ps1 | 1 + .../Tests/ThrowsWhenInvalidScriptArguments.ps1 | 1 + .../Tests/ThrowsWhenInvalidScriptPath.ps1 | 1 + _generated/AzurePowerShellV5/Tests/ChecksForPowerShell.ps1 | 1 + _generated/AzurePowerShellV5/Tests/ChecksForPowerShellCore.ps1 | 1 + _generated/AzurePowerShellV5/Tests/ChecksForWorkingDirectory.ps1 | 1 + _generated/AzurePowerShellV5/Tests/PerformsBasicFlow.ps1 | 1 + _generated/AzurePowerShellV5/Tests/ThrowsForInvalidVersion.ps1 | 1 + .../AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptArguments.ps1 | 1 + .../AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptPath.ps1 | 1 + .../AzurePowerShellV5_Node24/Tests/ChecksForPowerShell.ps1 | 1 + .../AzurePowerShellV5_Node24/Tests/ChecksForPowerShellCore.ps1 | 1 + .../AzurePowerShellV5_Node24/Tests/ChecksForWorkingDirectory.ps1 | 1 + _generated/AzurePowerShellV5_Node24/Tests/PerformsBasicFlow.ps1 | 1 + .../AzurePowerShellV5_Node24/Tests/ThrowsForInvalidVersion.ps1 | 1 + .../Tests/ThrowsWhenInvalidScriptArguments.ps1 | 1 + .../Tests/ThrowsWhenInvalidScriptPath.ps1 | 1 + 68 files changed, 68 insertions(+) diff --git a/Tasks/AzurePowerShellV2/Tests/DoesNotUnravelOutput.ps1 b/Tasks/AzurePowerShellV2/Tests/DoesNotUnravelOutput.ps1 index 8495f4d1be71..0df5cc94c045 100644 --- a/Tasks/AzurePowerShellV2/Tests/DoesNotUnravelOutput.ps1 +++ b/Tasks/AzurePowerShellV2/Tests/DoesNotUnravelOutput.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/DoesNotUnravelOutput_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV2/Tests/PerformsBasicFlow.ps1 b/Tasks/AzurePowerShellV2/Tests/PerformsBasicFlow.ps1 index 65e20e907bbe..0cd222abf895 100644 --- a/Tasks/AzurePowerShellV2/Tests/PerformsBasicFlow.ps1 +++ b/Tasks/AzurePowerShellV2/Tests/PerformsBasicFlow.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV2/Tests/RedirectsErrors.ps1 b/Tasks/AzurePowerShellV2/Tests/RedirectsErrors.ps1 index 0c859cede7d7..6c07ee55b8f6 100644 --- a/Tasks/AzurePowerShellV2/Tests/RedirectsErrors.ps1 +++ b/Tasks/AzurePowerShellV2/Tests/RedirectsErrors.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/RedirectsErrors_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV2/Tests/RemovesFunctionsAndVariables.ps1 b/Tasks/AzurePowerShellV2/Tests/RemovesFunctionsAndVariables.ps1 index 0887ff599fa7..ddad9ca377b4 100644 --- a/Tasks/AzurePowerShellV2/Tests/RemovesFunctionsAndVariables.ps1 +++ b/Tasks/AzurePowerShellV2/Tests/RemovesFunctionsAndVariables.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization # Arrange the task inputs. $targetAzurePs = "4.1.0" diff --git a/Tasks/AzurePowerShellV2/Tests/ThrowsForInvalidVersion.ps1 b/Tasks/AzurePowerShellV2/Tests/ThrowsForInvalidVersion.ps1 index 5afc27858f1e..55aa0976b88b 100644 --- a/Tasks/AzurePowerShellV2/Tests/ThrowsForInvalidVersion.ps1 +++ b/Tasks/AzurePowerShellV2/Tests/ThrowsForInvalidVersion.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "foobar.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV2/Tests/ThrowsWhenInvalidScriptArguments.ps1 b/Tasks/AzurePowerShellV2/Tests/ThrowsWhenInvalidScriptArguments.ps1 index af93358163bc..af223daab977 100644 --- a/Tasks/AzurePowerShellV2/Tests/ThrowsWhenInvalidScriptArguments.ps1 +++ b/Tasks/AzurePowerShellV2/Tests/ThrowsWhenInvalidScriptArguments.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($arguments in @( "script`rarguments", "script`narguments" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { $arguments } -- -Name ScriptArguments diff --git a/Tasks/AzurePowerShellV2/Tests/ThrowsWhenInvalidScriptPath.ps1 b/Tasks/AzurePowerShellV2/Tests/ThrowsWhenInvalidScriptPath.ps1 index a1334790ccba..1dbea747c0f9 100644 --- a/Tasks/AzurePowerShellV2/Tests/ThrowsWhenInvalidScriptPath.ps1 +++ b/Tasks/AzurePowerShellV2/Tests/ThrowsWhenInvalidScriptPath.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($path in @( "script`rpath", "script`npath" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/Tasks/AzurePowerShellV2/Tests/ValidateInlineScriptFlow.ps1 b/Tasks/AzurePowerShellV2/Tests/ValidateInlineScriptFlow.ps1 index 4a7a36069adf..3ebf7da93a62 100644 --- a/Tasks/AzurePowerShellV2/Tests/ValidateInlineScriptFlow.ps1 +++ b/Tasks/AzurePowerShellV2/Tests/ValidateInlineScriptFlow.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization Unregister-Mock Get-VstsInput $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "InlineScript" } -- -Name ScriptType -Require diff --git a/Tasks/AzurePowerShellV3/Tests/DoesNotFailOnStandardError.ps1 b/Tasks/AzurePowerShellV3/Tests/DoesNotFailOnStandardError.ps1 index 9078e46724c7..66f20a8c1f6f 100644 --- a/Tasks/AzurePowerShellV3/Tests/DoesNotFailOnStandardError.ps1 +++ b/Tasks/AzurePowerShellV3/Tests/DoesNotFailOnStandardError.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/RedirectsErrors_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV3/Tests/DoesNotThrowForNativeCommandError.ps1 b/Tasks/AzurePowerShellV3/Tests/DoesNotThrowForNativeCommandError.ps1 index 44f540f2d53c..e69e8f6ef06c 100644 --- a/Tasks/AzurePowerShellV3/Tests/DoesNotThrowForNativeCommandError.ps1 +++ b/Tasks/AzurePowerShellV3/Tests/DoesNotThrowForNativeCommandError.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/NativeCommandError_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV3/Tests/DoesNotUnravelOutput.ps1 b/Tasks/AzurePowerShellV3/Tests/DoesNotUnravelOutput.ps1 index 8d4c4df0d788..56eff28cc03e 100644 --- a/Tasks/AzurePowerShellV3/Tests/DoesNotUnravelOutput.ps1 +++ b/Tasks/AzurePowerShellV3/Tests/DoesNotUnravelOutput.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/DoesNotUnravelOutput_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV3/Tests/FailsForNativeCommandError.ps1 b/Tasks/AzurePowerShellV3/Tests/FailsForNativeCommandError.ps1 index c2a54f5fc5f9..0876e1ab5a97 100644 --- a/Tasks/AzurePowerShellV3/Tests/FailsForNativeCommandError.ps1 +++ b/Tasks/AzurePowerShellV3/Tests/FailsForNativeCommandError.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/NativeCommandError_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV3/Tests/PerformsBasicFlow.ps1 b/Tasks/AzurePowerShellV3/Tests/PerformsBasicFlow.ps1 index 7b0ba4034109..0cc0f26b69f8 100644 --- a/Tasks/AzurePowerShellV3/Tests/PerformsBasicFlow.ps1 +++ b/Tasks/AzurePowerShellV3/Tests/PerformsBasicFlow.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV3/Tests/RedirectsErrors.ps1 b/Tasks/AzurePowerShellV3/Tests/RedirectsErrors.ps1 index 7e5171449466..6f13205edbfd 100644 --- a/Tasks/AzurePowerShellV3/Tests/RedirectsErrors.ps1 +++ b/Tasks/AzurePowerShellV3/Tests/RedirectsErrors.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/RedirectsErrors_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV3/Tests/RemovesFunctionsAndVariables.ps1 b/Tasks/AzurePowerShellV3/Tests/RemovesFunctionsAndVariables.ps1 index 13fa43aeed49..be3c1c0f5321 100644 --- a/Tasks/AzurePowerShellV3/Tests/RemovesFunctionsAndVariables.ps1 +++ b/Tasks/AzurePowerShellV3/Tests/RemovesFunctionsAndVariables.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization # Arrange the task inputs. $targetAzurePs = "4.1.0" diff --git a/Tasks/AzurePowerShellV3/Tests/ThrowsForInvalidVersion.ps1 b/Tasks/AzurePowerShellV3/Tests/ThrowsForInvalidVersion.ps1 index 5afc27858f1e..55aa0976b88b 100644 --- a/Tasks/AzurePowerShellV3/Tests/ThrowsForInvalidVersion.ps1 +++ b/Tasks/AzurePowerShellV3/Tests/ThrowsForInvalidVersion.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "foobar.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV3/Tests/ThrowsWhenInvalidScriptArguments.ps1 b/Tasks/AzurePowerShellV3/Tests/ThrowsWhenInvalidScriptArguments.ps1 index af93358163bc..af223daab977 100644 --- a/Tasks/AzurePowerShellV3/Tests/ThrowsWhenInvalidScriptArguments.ps1 +++ b/Tasks/AzurePowerShellV3/Tests/ThrowsWhenInvalidScriptArguments.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($arguments in @( "script`rarguments", "script`narguments" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { $arguments } -- -Name ScriptArguments diff --git a/Tasks/AzurePowerShellV3/Tests/ThrowsWhenInvalidScriptPath.ps1 b/Tasks/AzurePowerShellV3/Tests/ThrowsWhenInvalidScriptPath.ps1 index a1334790ccba..1dbea747c0f9 100644 --- a/Tasks/AzurePowerShellV3/Tests/ThrowsWhenInvalidScriptPath.ps1 +++ b/Tasks/AzurePowerShellV3/Tests/ThrowsWhenInvalidScriptPath.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($path in @( "script`rpath", "script`npath" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/Tasks/AzurePowerShellV3/Tests/ValidateInlineScriptFlow.ps1 b/Tasks/AzurePowerShellV3/Tests/ValidateInlineScriptFlow.ps1 index d832f06995d0..5d5319119040 100644 --- a/Tasks/AzurePowerShellV3/Tests/ValidateInlineScriptFlow.ps1 +++ b/Tasks/AzurePowerShellV3/Tests/ValidateInlineScriptFlow.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization Unregister-Mock Get-VstsInput $targetAzurePs = "4.1.0" if([string]::IsNullOrEmpty($env:Agent_TempDirectory)) { diff --git a/Tasks/AzurePowerShellV4/Tests/ChecksForPowerShell.ps1 b/Tasks/AzurePowerShellV4/Tests/ChecksForPowerShell.ps1 index c88aa1ffb54d..fd91558ad9a4 100644 --- a/Tasks/AzurePowerShellV4/Tests/ChecksForPowerShell.ps1 +++ b/Tasks/AzurePowerShellV4/Tests/ChecksForPowerShell.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV4/Tests/ChecksForPowerShellCore.ps1 b/Tasks/AzurePowerShellV4/Tests/ChecksForPowerShellCore.ps1 index 60caed9e28fe..d087cbbc8524 100644 --- a/Tasks/AzurePowerShellV4/Tests/ChecksForPowerShellCore.ps1 +++ b/Tasks/AzurePowerShellV4/Tests/ChecksForPowerShellCore.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV4/Tests/ChecksForWorkingDirectory.ps1 b/Tasks/AzurePowerShellV4/Tests/ChecksForWorkingDirectory.ps1 index 4f824ae5b8c2..83141982bc3f 100644 --- a/Tasks/AzurePowerShellV4/Tests/ChecksForWorkingDirectory.ps1 +++ b/Tasks/AzurePowerShellV4/Tests/ChecksForWorkingDirectory.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" $input_workingDirectory = "C:\Users" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/Tasks/AzurePowerShellV4/Tests/PerformsBasicFlow.ps1 b/Tasks/AzurePowerShellV4/Tests/PerformsBasicFlow.ps1 index 6a2b2e74708d..f6a023d5e293 100644 --- a/Tasks/AzurePowerShellV4/Tests/PerformsBasicFlow.ps1 +++ b/Tasks/AzurePowerShellV4/Tests/PerformsBasicFlow.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV4/Tests/ThrowsForInvalidVersion.ps1 b/Tasks/AzurePowerShellV4/Tests/ThrowsForInvalidVersion.ps1 index 5afc27858f1e..55aa0976b88b 100644 --- a/Tasks/AzurePowerShellV4/Tests/ThrowsForInvalidVersion.ps1 +++ b/Tasks/AzurePowerShellV4/Tests/ThrowsForInvalidVersion.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "foobar.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptArguments.ps1 b/Tasks/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptArguments.ps1 index af93358163bc..af223daab977 100644 --- a/Tasks/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptArguments.ps1 +++ b/Tasks/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptArguments.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($arguments in @( "script`rarguments", "script`narguments" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { $arguments } -- -Name ScriptArguments diff --git a/Tasks/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptPath.ps1 b/Tasks/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptPath.ps1 index a1334790ccba..1dbea747c0f9 100644 --- a/Tasks/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptPath.ps1 +++ b/Tasks/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptPath.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($path in @( "script`rpath", "script`npath" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/Tasks/AzurePowerShellV5/Tests/ChecksForPowerShell.ps1 b/Tasks/AzurePowerShellV5/Tests/ChecksForPowerShell.ps1 index 7ea294a29d90..27e50b607042 100644 --- a/Tasks/AzurePowerShellV5/Tests/ChecksForPowerShell.ps1 +++ b/Tasks/AzurePowerShellV5/Tests/ChecksForPowerShell.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV5/Tests/ChecksForPowerShellCore.ps1 b/Tasks/AzurePowerShellV5/Tests/ChecksForPowerShellCore.ps1 index ebf4f7706981..57a339bdedf6 100644 --- a/Tasks/AzurePowerShellV5/Tests/ChecksForPowerShellCore.ps1 +++ b/Tasks/AzurePowerShellV5/Tests/ChecksForPowerShellCore.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV5/Tests/ChecksForWorkingDirectory.ps1 b/Tasks/AzurePowerShellV5/Tests/ChecksForWorkingDirectory.ps1 index 4747d0181cc4..6a992509fad6 100644 --- a/Tasks/AzurePowerShellV5/Tests/ChecksForWorkingDirectory.ps1 +++ b/Tasks/AzurePowerShellV5/Tests/ChecksForWorkingDirectory.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" $input_workingDirectory = "C:\Users" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/Tasks/AzurePowerShellV5/Tests/PerformsBasicFlow.ps1 b/Tasks/AzurePowerShellV5/Tests/PerformsBasicFlow.ps1 index 7cb63f9cb4c8..24894aca2052 100644 --- a/Tasks/AzurePowerShellV5/Tests/PerformsBasicFlow.ps1 +++ b/Tasks/AzurePowerShellV5/Tests/PerformsBasicFlow.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV5/Tests/ThrowsForInvalidVersion.ps1 b/Tasks/AzurePowerShellV5/Tests/ThrowsForInvalidVersion.ps1 index 5afc27858f1e..55aa0976b88b 100644 --- a/Tasks/AzurePowerShellV5/Tests/ThrowsForInvalidVersion.ps1 +++ b/Tasks/AzurePowerShellV5/Tests/ThrowsForInvalidVersion.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "foobar.ps1" } -- -Name ScriptPath diff --git a/Tasks/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptArguments.ps1 b/Tasks/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptArguments.ps1 index af93358163bc..af223daab977 100644 --- a/Tasks/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptArguments.ps1 +++ b/Tasks/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptArguments.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($arguments in @( "script`rarguments", "script`narguments" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { $arguments } -- -Name ScriptArguments diff --git a/Tasks/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptPath.ps1 b/Tasks/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptPath.ps1 index a1334790ccba..1dbea747c0f9 100644 --- a/Tasks/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptPath.ps1 +++ b/Tasks/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptPath.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($path in @( "script`rpath", "script`npath" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/Tasks/ServiceFabricPowerShellV1/Tests/DoesNotUnravelOutput.ps1 b/Tasks/ServiceFabricPowerShellV1/Tests/DoesNotUnravelOutput.ps1 index f0cbfd1c4680..8f486ee1fad2 100644 --- a/Tasks/ServiceFabricPowerShellV1/Tests/DoesNotUnravelOutput.ps1 +++ b/Tasks/ServiceFabricPowerShellV1/Tests/DoesNotUnravelOutput.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization . $PSScriptRoot\SetupMocks.ps1 # Setup input arguments diff --git a/Tasks/ServiceFabricPowerShellV1/Tests/PerformsBasicFlow.ps1 b/Tasks/ServiceFabricPowerShellV1/Tests/PerformsBasicFlow.ps1 index 16d8a17c6c3b..93081fc4ba87 100644 --- a/Tasks/ServiceFabricPowerShellV1/Tests/PerformsBasicFlow.ps1 +++ b/Tasks/ServiceFabricPowerShellV1/Tests/PerformsBasicFlow.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization . $PSScriptRoot\SetupMocks.ps1 Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/ServiceFabricPowerShellV1/Tests/RedirectsErrors.ps1 b/Tasks/ServiceFabricPowerShellV1/Tests/RedirectsErrors.ps1 index 504cbb57404a..f8490d674f9d 100644 --- a/Tasks/ServiceFabricPowerShellV1/Tests/RedirectsErrors.ps1 +++ b/Tasks/ServiceFabricPowerShellV1/Tests/RedirectsErrors.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization . $PSScriptRoot\SetupMocks.ps1 Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/RedirectsErrors_TargetScript.ps1" } -- -Name ScriptPath diff --git a/Tasks/ServiceFabricPowerShellV1/Tests/RemovesFunctionsAndVariables.ps1 b/Tasks/ServiceFabricPowerShellV1/Tests/RemovesFunctionsAndVariables.ps1 index 1a2803bc05ac..22b35e084a62 100644 --- a/Tasks/ServiceFabricPowerShellV1/Tests/RemovesFunctionsAndVariables.ps1 +++ b/Tasks/ServiceFabricPowerShellV1/Tests/RemovesFunctionsAndVariables.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization . $PSScriptRoot\SetupMocks.ps1 # Arrange the task inputs. diff --git a/Tasks/ServiceFabricPowerShellV1/Tests/ThrowsWhenInvalidScriptArguments.ps1 b/Tasks/ServiceFabricPowerShellV1/Tests/ThrowsWhenInvalidScriptArguments.ps1 index 569b962b0e9d..999d76319480 100644 --- a/Tasks/ServiceFabricPowerShellV1/Tests/ThrowsWhenInvalidScriptArguments.ps1 +++ b/Tasks/ServiceFabricPowerShellV1/Tests/ThrowsWhenInvalidScriptArguments.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization . $PSScriptRoot\SetupMocks.ps1 foreach ($arguments in @( "script`rarguments", "script`narguments" )) { diff --git a/Tasks/ServiceFabricPowerShellV1/Tests/ThrowsWhenInvalidScriptPath.ps1 b/Tasks/ServiceFabricPowerShellV1/Tests/ThrowsWhenInvalidScriptPath.ps1 index e4c5b5764fff..b4b09ee8400e 100644 --- a/Tasks/ServiceFabricPowerShellV1/Tests/ThrowsWhenInvalidScriptPath.ps1 +++ b/Tasks/ServiceFabricPowerShellV1/Tests/ThrowsWhenInvalidScriptPath.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization . $PSScriptRoot\SetupMocks.ps1 foreach ($path in @( "script`rpath", "script`npath" )) { diff --git a/Tasks/ServiceFabricPowerShellV1/Tests/ValidateInlineScriptFlow.ps1 b/Tasks/ServiceFabricPowerShellV1/Tests/ValidateInlineScriptFlow.ps1 index 50c6432cd3e2..966315a3002a 100644 --- a/Tasks/ServiceFabricPowerShellV1/Tests/ValidateInlineScriptFlow.ps1 +++ b/Tasks/ServiceFabricPowerShellV1/Tests/ValidateInlineScriptFlow.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization . $PSScriptRoot\SetupMocks.ps1 Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { "InlineScript" } -- -Name ScriptType -Require diff --git a/_generated/AzurePowerShellV4/Tests/ChecksForPowerShell.ps1 b/_generated/AzurePowerShellV4/Tests/ChecksForPowerShell.ps1 index c88aa1ffb54d..fd91558ad9a4 100644 --- a/_generated/AzurePowerShellV4/Tests/ChecksForPowerShell.ps1 +++ b/_generated/AzurePowerShellV4/Tests/ChecksForPowerShell.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV4/Tests/ChecksForPowerShellCore.ps1 b/_generated/AzurePowerShellV4/Tests/ChecksForPowerShellCore.ps1 index 60caed9e28fe..d087cbbc8524 100644 --- a/_generated/AzurePowerShellV4/Tests/ChecksForPowerShellCore.ps1 +++ b/_generated/AzurePowerShellV4/Tests/ChecksForPowerShellCore.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV4/Tests/ChecksForWorkingDirectory.ps1 b/_generated/AzurePowerShellV4/Tests/ChecksForWorkingDirectory.ps1 index 4f824ae5b8c2..83141982bc3f 100644 --- a/_generated/AzurePowerShellV4/Tests/ChecksForWorkingDirectory.ps1 +++ b/_generated/AzurePowerShellV4/Tests/ChecksForWorkingDirectory.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" $input_workingDirectory = "C:\Users" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/_generated/AzurePowerShellV4/Tests/PerformsBasicFlow.ps1 b/_generated/AzurePowerShellV4/Tests/PerformsBasicFlow.ps1 index 6a2b2e74708d..f6a023d5e293 100644 --- a/_generated/AzurePowerShellV4/Tests/PerformsBasicFlow.ps1 +++ b/_generated/AzurePowerShellV4/Tests/PerformsBasicFlow.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV4/Tests/ThrowsForInvalidVersion.ps1 b/_generated/AzurePowerShellV4/Tests/ThrowsForInvalidVersion.ps1 index 5afc27858f1e..55aa0976b88b 100644 --- a/_generated/AzurePowerShellV4/Tests/ThrowsForInvalidVersion.ps1 +++ b/_generated/AzurePowerShellV4/Tests/ThrowsForInvalidVersion.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "foobar.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptArguments.ps1 b/_generated/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptArguments.ps1 index af93358163bc..af223daab977 100644 --- a/_generated/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptArguments.ps1 +++ b/_generated/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptArguments.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($arguments in @( "script`rarguments", "script`narguments" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { $arguments } -- -Name ScriptArguments diff --git a/_generated/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptPath.ps1 b/_generated/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptPath.ps1 index a1334790ccba..1dbea747c0f9 100644 --- a/_generated/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptPath.ps1 +++ b/_generated/AzurePowerShellV4/Tests/ThrowsWhenInvalidScriptPath.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($path in @( "script`rpath", "script`npath" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/_generated/AzurePowerShellV4_Node24/Tests/ChecksForPowerShell.ps1 b/_generated/AzurePowerShellV4_Node24/Tests/ChecksForPowerShell.ps1 index c88aa1ffb54d..fd91558ad9a4 100644 --- a/_generated/AzurePowerShellV4_Node24/Tests/ChecksForPowerShell.ps1 +++ b/_generated/AzurePowerShellV4_Node24/Tests/ChecksForPowerShell.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV4_Node24/Tests/ChecksForPowerShellCore.ps1 b/_generated/AzurePowerShellV4_Node24/Tests/ChecksForPowerShellCore.ps1 index 60caed9e28fe..d087cbbc8524 100644 --- a/_generated/AzurePowerShellV4_Node24/Tests/ChecksForPowerShellCore.ps1 +++ b/_generated/AzurePowerShellV4_Node24/Tests/ChecksForPowerShellCore.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV4_Node24/Tests/ChecksForWorkingDirectory.ps1 b/_generated/AzurePowerShellV4_Node24/Tests/ChecksForWorkingDirectory.ps1 index 4f824ae5b8c2..83141982bc3f 100644 --- a/_generated/AzurePowerShellV4_Node24/Tests/ChecksForWorkingDirectory.ps1 +++ b/_generated/AzurePowerShellV4_Node24/Tests/ChecksForWorkingDirectory.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" $input_workingDirectory = "C:\Users" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/_generated/AzurePowerShellV4_Node24/Tests/PerformsBasicFlow.ps1 b/_generated/AzurePowerShellV4_Node24/Tests/PerformsBasicFlow.ps1 index 6a2b2e74708d..f6a023d5e293 100644 --- a/_generated/AzurePowerShellV4_Node24/Tests/PerformsBasicFlow.ps1 +++ b/_generated/AzurePowerShellV4_Node24/Tests/PerformsBasicFlow.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV4_Node24/Tests/ThrowsForInvalidVersion.ps1 b/_generated/AzurePowerShellV4_Node24/Tests/ThrowsForInvalidVersion.ps1 index 5afc27858f1e..55aa0976b88b 100644 --- a/_generated/AzurePowerShellV4_Node24/Tests/ThrowsForInvalidVersion.ps1 +++ b/_generated/AzurePowerShellV4_Node24/Tests/ThrowsForInvalidVersion.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "foobar.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV4_Node24/Tests/ThrowsWhenInvalidScriptArguments.ps1 b/_generated/AzurePowerShellV4_Node24/Tests/ThrowsWhenInvalidScriptArguments.ps1 index af93358163bc..af223daab977 100644 --- a/_generated/AzurePowerShellV4_Node24/Tests/ThrowsWhenInvalidScriptArguments.ps1 +++ b/_generated/AzurePowerShellV4_Node24/Tests/ThrowsWhenInvalidScriptArguments.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($arguments in @( "script`rarguments", "script`narguments" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { $arguments } -- -Name ScriptArguments diff --git a/_generated/AzurePowerShellV4_Node24/Tests/ThrowsWhenInvalidScriptPath.ps1 b/_generated/AzurePowerShellV4_Node24/Tests/ThrowsWhenInvalidScriptPath.ps1 index a1334790ccba..1dbea747c0f9 100644 --- a/_generated/AzurePowerShellV4_Node24/Tests/ThrowsWhenInvalidScriptPath.ps1 +++ b/_generated/AzurePowerShellV4_Node24/Tests/ThrowsWhenInvalidScriptPath.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($path in @( "script`rpath", "script`npath" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/_generated/AzurePowerShellV5/Tests/ChecksForPowerShell.ps1 b/_generated/AzurePowerShellV5/Tests/ChecksForPowerShell.ps1 index 7ea294a29d90..27e50b607042 100644 --- a/_generated/AzurePowerShellV5/Tests/ChecksForPowerShell.ps1 +++ b/_generated/AzurePowerShellV5/Tests/ChecksForPowerShell.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV5/Tests/ChecksForPowerShellCore.ps1 b/_generated/AzurePowerShellV5/Tests/ChecksForPowerShellCore.ps1 index ebf4f7706981..57a339bdedf6 100644 --- a/_generated/AzurePowerShellV5/Tests/ChecksForPowerShellCore.ps1 +++ b/_generated/AzurePowerShellV5/Tests/ChecksForPowerShellCore.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV5/Tests/ChecksForWorkingDirectory.ps1 b/_generated/AzurePowerShellV5/Tests/ChecksForWorkingDirectory.ps1 index 4747d0181cc4..6a992509fad6 100644 --- a/_generated/AzurePowerShellV5/Tests/ChecksForWorkingDirectory.ps1 +++ b/_generated/AzurePowerShellV5/Tests/ChecksForWorkingDirectory.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" $input_workingDirectory = "C:\Users" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/_generated/AzurePowerShellV5/Tests/PerformsBasicFlow.ps1 b/_generated/AzurePowerShellV5/Tests/PerformsBasicFlow.ps1 index 7cb63f9cb4c8..24894aca2052 100644 --- a/_generated/AzurePowerShellV5/Tests/PerformsBasicFlow.ps1 +++ b/_generated/AzurePowerShellV5/Tests/PerformsBasicFlow.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV5/Tests/ThrowsForInvalidVersion.ps1 b/_generated/AzurePowerShellV5/Tests/ThrowsForInvalidVersion.ps1 index 5afc27858f1e..55aa0976b88b 100644 --- a/_generated/AzurePowerShellV5/Tests/ThrowsForInvalidVersion.ps1 +++ b/_generated/AzurePowerShellV5/Tests/ThrowsForInvalidVersion.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "foobar.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptArguments.ps1 b/_generated/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptArguments.ps1 index af93358163bc..af223daab977 100644 --- a/_generated/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptArguments.ps1 +++ b/_generated/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptArguments.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($arguments in @( "script`rarguments", "script`narguments" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { $arguments } -- -Name ScriptArguments diff --git a/_generated/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptPath.ps1 b/_generated/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptPath.ps1 index a1334790ccba..1dbea747c0f9 100644 --- a/_generated/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptPath.ps1 +++ b/_generated/AzurePowerShellV5/Tests/ThrowsWhenInvalidScriptPath.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($path in @( "script`rpath", "script`npath" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/_generated/AzurePowerShellV5_Node24/Tests/ChecksForPowerShell.ps1 b/_generated/AzurePowerShellV5_Node24/Tests/ChecksForPowerShell.ps1 index 7ea294a29d90..27e50b607042 100644 --- a/_generated/AzurePowerShellV5_Node24/Tests/ChecksForPowerShell.ps1 +++ b/_generated/AzurePowerShellV5_Node24/Tests/ChecksForPowerShell.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV5_Node24/Tests/ChecksForPowerShellCore.ps1 b/_generated/AzurePowerShellV5_Node24/Tests/ChecksForPowerShellCore.ps1 index ebf4f7706981..57a339bdedf6 100644 --- a/_generated/AzurePowerShellV5_Node24/Tests/ChecksForPowerShellCore.ps1 +++ b/_generated/AzurePowerShellV5_Node24/Tests/ChecksForPowerShellCore.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV5_Node24/Tests/ChecksForWorkingDirectory.ps1 b/_generated/AzurePowerShellV5_Node24/Tests/ChecksForWorkingDirectory.ps1 index 4747d0181cc4..6a992509fad6 100644 --- a/_generated/AzurePowerShellV5_Node24/Tests/ChecksForWorkingDirectory.ps1 +++ b/_generated/AzurePowerShellV5_Node24/Tests/ChecksForWorkingDirectory.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" $input_workingDirectory = "C:\Users" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require diff --git a/_generated/AzurePowerShellV5_Node24/Tests/PerformsBasicFlow.ps1 b/_generated/AzurePowerShellV5_Node24/Tests/PerformsBasicFlow.ps1 index 7cb63f9cb4c8..24894aca2052 100644 --- a/_generated/AzurePowerShellV5_Node24/Tests/PerformsBasicFlow.ps1 +++ b/_generated/AzurePowerShellV5_Node24/Tests/PerformsBasicFlow.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization $targetAzurePs = "4.1.0" Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "$PSScriptRoot/PerformsBasicFlow_TargetScript.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV5_Node24/Tests/ThrowsForInvalidVersion.ps1 b/_generated/AzurePowerShellV5_Node24/Tests/ThrowsForInvalidVersion.ps1 index 5afc27858f1e..55aa0976b88b 100644 --- a/_generated/AzurePowerShellV5_Node24/Tests/ThrowsForInvalidVersion.ps1 +++ b/_generated/AzurePowerShellV5_Node24/Tests/ThrowsForInvalidVersion.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require Register-Mock Get-VstsInput { "foobar.ps1" } -- -Name ScriptPath diff --git a/_generated/AzurePowerShellV5_Node24/Tests/ThrowsWhenInvalidScriptArguments.ps1 b/_generated/AzurePowerShellV5_Node24/Tests/ThrowsWhenInvalidScriptArguments.ps1 index af93358163bc..af223daab977 100644 --- a/_generated/AzurePowerShellV5_Node24/Tests/ThrowsWhenInvalidScriptArguments.ps1 +++ b/_generated/AzurePowerShellV5_Node24/Tests/ThrowsWhenInvalidScriptArguments.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($arguments in @( "script`rarguments", "script`narguments" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { $arguments } -- -Name ScriptArguments diff --git a/_generated/AzurePowerShellV5_Node24/Tests/ThrowsWhenInvalidScriptPath.ps1 b/_generated/AzurePowerShellV5_Node24/Tests/ThrowsWhenInvalidScriptPath.ps1 index a1334790ccba..1dbea747c0f9 100644 --- a/_generated/AzurePowerShellV5_Node24/Tests/ThrowsWhenInvalidScriptPath.ps1 +++ b/_generated/AzurePowerShellV5_Node24/Tests/ThrowsWhenInvalidScriptPath.ps1 @@ -3,6 +3,7 @@ param() # Arrange. . $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1 +Register-Mock Invoke-ScriptArgumentSanitization foreach ($path in @( "script`rpath", "script`npath" )) { Unregister-Mock Get-VstsInput Register-Mock Get-VstsInput { "FilePath" } -- -Name ScriptType -Require From 60c771c8d97e88e7e15f513ab8375be41012abfe Mon Sep 17 00:00:00 2001 From: Vladimir Tretyakov Date: Mon, 18 May 2026 15:07:53 +0200 Subject: [PATCH 24/25] Roll forward all PR-touched task versions to sprint 275 The sprint version on master rolled from 274 to 275 (via #22175), so ci/check-downgrading.js now rejects every task left at *.274.*. Bump each task's Default minor to 275, with the smallest patch >= master's current patch. Tasks with a Node24_1 BuildConfig get Node24_1 = Default + 1 (per the same convention used earlier in this PR). New versions: AzureFileCopyV1 1.275.0 AzureFileCopyV2 2.275.0 AzureFileCopyV3 3.275.0 AzureFileCopyV4 4.275.0 / 4.275.1 (Node24_1) AzureFileCopyV5 5.275.0 / 5.275.1 (Node24_1) AzureFileCopyV6 6.275.2 / 6.275.3 (Node24_1) AzurePowerShellV2 2.275.0 AzurePowerShellV3 3.275.0 AzurePowerShellV4 4.275.2 / 4.275.3 (Node24_1) AzurePowerShellV5 5.275.4 / 5.275.5 (Node24_1) PowerShellOnTargetMachinesV3 3.275.0 PowerShellV2 2.275.0 ServiceFabricPowerShellV1 1.275.0 SqlAzureDacpacDeploymentV1 1.275.0 SqlDacpacDeploymentOnMachineGroupV0 0.275.0 WindowsMachineFileCopyV1 1.275.0 WindowsMachineFileCopyV2 2.275.0 Source task.json/task.loc.json, _generated mirrors, _buildConfigMapping entries, and *.versionmap.txt files are all kept consistent. No code changes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Tasks/AzureFileCopyV1/task.json | 4 ++-- Tasks/AzureFileCopyV1/task.loc.json | 4 ++-- Tasks/AzureFileCopyV2/task.json | 4 ++-- Tasks/AzureFileCopyV2/task.loc.json | 4 ++-- Tasks/AzureFileCopyV3/task.json | 4 ++-- Tasks/AzureFileCopyV3/task.loc.json | 4 ++-- Tasks/AzureFileCopyV4/task.json | 4 ++-- Tasks/AzureFileCopyV4/task.loc.json | 4 ++-- Tasks/AzureFileCopyV5/task.json | 4 ++-- Tasks/AzureFileCopyV5/task.loc.json | 4 ++-- Tasks/AzureFileCopyV6/task.json | 4 ++-- Tasks/AzureFileCopyV6/task.loc.json | 4 ++-- Tasks/AzurePowerShellV2/task.json | 4 ++-- Tasks/AzurePowerShellV2/task.loc.json | 4 ++-- Tasks/AzurePowerShellV3/task.json | 4 ++-- Tasks/AzurePowerShellV3/task.loc.json | 4 ++-- Tasks/AzurePowerShellV4/task.json | 4 ++-- Tasks/AzurePowerShellV4/task.loc.json | 4 ++-- Tasks/AzurePowerShellV5/task.json | 4 ++-- Tasks/AzurePowerShellV5/task.loc.json | 4 ++-- Tasks/PowerShellOnTargetMachinesV3/task.json | 2 +- Tasks/PowerShellOnTargetMachinesV3/task.loc.json | 2 +- Tasks/PowerShellV2/task.json | 4 ++-- Tasks/PowerShellV2/task.loc.json | 4 ++-- Tasks/ServiceFabricPowerShellV1/task.json | 2 +- Tasks/ServiceFabricPowerShellV1/task.loc.json | 2 +- Tasks/SqlAzureDacpacDeploymentV1/task.json | 4 ++-- Tasks/SqlAzureDacpacDeploymentV1/task.loc.json | 4 ++-- Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.json | 4 ++-- Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.loc.json | 4 ++-- Tasks/WindowsMachineFileCopyV1/task.json | 2 +- Tasks/WindowsMachineFileCopyV1/task.loc.json | 2 +- Tasks/WindowsMachineFileCopyV2/task.json | 2 +- Tasks/WindowsMachineFileCopyV2/task.loc.json | 2 +- _generated/AzureFileCopyV4.versionmap.txt | 4 ++-- _generated/AzureFileCopyV4/task.json | 8 ++++---- _generated/AzureFileCopyV4/task.loc.json | 8 ++++---- _generated/AzureFileCopyV4_Node24/task.json | 8 ++++---- _generated/AzureFileCopyV4_Node24/task.loc.json | 8 ++++---- _generated/AzureFileCopyV5.versionmap.txt | 4 ++-- _generated/AzureFileCopyV5/task.json | 8 ++++---- _generated/AzureFileCopyV5/task.loc.json | 8 ++++---- _generated/AzureFileCopyV5_Node24/task.json | 8 ++++---- _generated/AzureFileCopyV5_Node24/task.loc.json | 8 ++++---- _generated/AzureFileCopyV6.versionmap.txt | 4 ++-- _generated/AzureFileCopyV6/task.json | 8 ++++---- _generated/AzureFileCopyV6/task.loc.json | 8 ++++---- _generated/AzureFileCopyV6_Node24/task.json | 8 ++++---- _generated/AzureFileCopyV6_Node24/task.loc.json | 8 ++++---- _generated/AzurePowerShellV4.versionmap.txt | 4 ++-- _generated/AzurePowerShellV4/task.json | 8 ++++---- _generated/AzurePowerShellV4/task.loc.json | 8 ++++---- _generated/AzurePowerShellV4_Node24/task.json | 8 ++++---- _generated/AzurePowerShellV4_Node24/task.loc.json | 8 ++++---- _generated/AzurePowerShellV5.versionmap.txt | 4 ++-- _generated/AzurePowerShellV5/task.json | 8 ++++---- _generated/AzurePowerShellV5/task.loc.json | 8 ++++---- _generated/AzurePowerShellV5_Node24/task.json | 8 ++++---- _generated/AzurePowerShellV5_Node24/task.loc.json | 8 ++++---- 59 files changed, 150 insertions(+), 150 deletions(-) diff --git a/Tasks/AzureFileCopyV1/task.json b/Tasks/AzureFileCopyV1/task.json index a1bab18d030d..dce0cc40f721 100644 --- a/Tasks/AzureFileCopyV1/task.json +++ b/Tasks/AzureFileCopyV1/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 274, - "Patch": 1 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV1/task.loc.json b/Tasks/AzureFileCopyV1/task.loc.json index 197da79081db..72a84a556356 100644 --- a/Tasks/AzureFileCopyV1/task.loc.json +++ b/Tasks/AzureFileCopyV1/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 274, - "Patch": 1 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV2/task.json b/Tasks/AzureFileCopyV2/task.json index 1b61be6b2152..96ac5141e57c 100644 --- a/Tasks/AzureFileCopyV2/task.json +++ b/Tasks/AzureFileCopyV2/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 274, - "Patch": 1 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV2/task.loc.json b/Tasks/AzureFileCopyV2/task.loc.json index 008365f189f1..bb1f09465b74 100644 --- a/Tasks/AzureFileCopyV2/task.loc.json +++ b/Tasks/AzureFileCopyV2/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 274, - "Patch": 1 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV3/task.json b/Tasks/AzureFileCopyV3/task.json index 0e3ad94063b1..9b40f7cd5f6c 100644 --- a/Tasks/AzureFileCopyV3/task.json +++ b/Tasks/AzureFileCopyV3/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 3, - "Minor": 274, - "Patch": 1 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV3/task.loc.json b/Tasks/AzureFileCopyV3/task.loc.json index fb512f360d7a..bd8c805f1bd5 100644 --- a/Tasks/AzureFileCopyV3/task.loc.json +++ b/Tasks/AzureFileCopyV3/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 3, - "Minor": 274, - "Patch": 1 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV4/task.json b/Tasks/AzureFileCopyV4/task.json index 57cdc76f2541..7db9eb412bb2 100644 --- a/Tasks/AzureFileCopyV4/task.json +++ b/Tasks/AzureFileCopyV4/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 4, - "Minor": 274, - "Patch": 2 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV4/task.loc.json b/Tasks/AzureFileCopyV4/task.loc.json index 8fec6dee7060..4df54251841d 100644 --- a/Tasks/AzureFileCopyV4/task.loc.json +++ b/Tasks/AzureFileCopyV4/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 4, - "Minor": 274, - "Patch": 2 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV5/task.json b/Tasks/AzureFileCopyV5/task.json index 34b21029a053..fbb6fcb9e6c2 100644 --- a/Tasks/AzureFileCopyV5/task.json +++ b/Tasks/AzureFileCopyV5/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 5, - "Minor": 274, - "Patch": 2 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV5/task.loc.json b/Tasks/AzureFileCopyV5/task.loc.json index 8fe0bc48311b..3c3e1e0b3328 100644 --- a/Tasks/AzureFileCopyV5/task.loc.json +++ b/Tasks/AzureFileCopyV5/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 5, - "Minor": 274, - "Patch": 2 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV6/task.json b/Tasks/AzureFileCopyV6/task.json index 53bd39114ad4..558edd13b1e4 100644 --- a/Tasks/AzureFileCopyV6/task.json +++ b/Tasks/AzureFileCopyV6/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 6, - "Minor": 274, - "Patch": 4 + "Minor": 275, + "Patch": 2 }, "demands": [ "azureps" diff --git a/Tasks/AzureFileCopyV6/task.loc.json b/Tasks/AzureFileCopyV6/task.loc.json index cee763bd16a2..d63d22a1684e 100644 --- a/Tasks/AzureFileCopyV6/task.loc.json +++ b/Tasks/AzureFileCopyV6/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 6, - "Minor": 274, - "Patch": 4 + "Minor": 275, + "Patch": 2 }, "demands": [ "azureps" diff --git a/Tasks/AzurePowerShellV2/task.json b/Tasks/AzurePowerShellV2/task.json index 4070663eba93..d4566ae03d13 100644 --- a/Tasks/AzurePowerShellV2/task.json +++ b/Tasks/AzurePowerShellV2/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 274, - "Patch": 2 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" diff --git a/Tasks/AzurePowerShellV2/task.loc.json b/Tasks/AzurePowerShellV2/task.loc.json index 5a46c106a30b..ad54a5a9523a 100644 --- a/Tasks/AzurePowerShellV2/task.loc.json +++ b/Tasks/AzurePowerShellV2/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 274, - "Patch": 2 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" diff --git a/Tasks/AzurePowerShellV3/task.json b/Tasks/AzurePowerShellV3/task.json index 62ba216d2d44..dac3b58a04e3 100644 --- a/Tasks/AzurePowerShellV3/task.json +++ b/Tasks/AzurePowerShellV3/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 3, - "Minor": 274, - "Patch": 2 + "Minor": 275, + "Patch": 0 }, "releaseNotes": "Added support for Fail on standard error and ErrorActionPreference", "demands": [ diff --git a/Tasks/AzurePowerShellV3/task.loc.json b/Tasks/AzurePowerShellV3/task.loc.json index c4dfeff5de53..1d3eaf6d12cd 100644 --- a/Tasks/AzurePowerShellV3/task.loc.json +++ b/Tasks/AzurePowerShellV3/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 3, - "Minor": 274, - "Patch": 2 + "Minor": 275, + "Patch": 0 }, "releaseNotes": "ms-resource:loc.releaseNotes", "demands": [ diff --git a/Tasks/AzurePowerShellV4/task.json b/Tasks/AzurePowerShellV4/task.json index cb94d1581b87..bd84295f479f 100644 --- a/Tasks/AzurePowerShellV4/task.json +++ b/Tasks/AzurePowerShellV4/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 4, - "Minor": 274, - "Patch": 6 + "Minor": 275, + "Patch": 2 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ diff --git a/Tasks/AzurePowerShellV4/task.loc.json b/Tasks/AzurePowerShellV4/task.loc.json index 07db49980cbd..188d924b2ccd 100644 --- a/Tasks/AzurePowerShellV4/task.loc.json +++ b/Tasks/AzurePowerShellV4/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 4, - "Minor": 274, - "Patch": 6 + "Minor": 275, + "Patch": 2 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ diff --git a/Tasks/AzurePowerShellV5/task.json b/Tasks/AzurePowerShellV5/task.json index c2b88fecc4e5..b249d9ec75d3 100644 --- a/Tasks/AzurePowerShellV5/task.json +++ b/Tasks/AzurePowerShellV5/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 5, - "Minor": 274, - "Patch": 6 + "Minor": 275, + "Patch": 4 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ diff --git a/Tasks/AzurePowerShellV5/task.loc.json b/Tasks/AzurePowerShellV5/task.loc.json index f10b4d2cf627..dbc1bfb1f7cc 100644 --- a/Tasks/AzurePowerShellV5/task.loc.json +++ b/Tasks/AzurePowerShellV5/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 5, - "Minor": 274, - "Patch": 6 + "Minor": 275, + "Patch": 4 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ diff --git a/Tasks/PowerShellOnTargetMachinesV3/task.json b/Tasks/PowerShellOnTargetMachinesV3/task.json index def59686fb60..28bd0fdf152d 100644 --- a/Tasks/PowerShellOnTargetMachinesV3/task.json +++ b/Tasks/PowerShellOnTargetMachinesV3/task.json @@ -13,7 +13,7 @@ "author": "Microsoft Corporation", "version": { "Major": 3, - "Minor": 274, + "Minor": 275, "Patch": 0 }, "groups": [ diff --git a/Tasks/PowerShellOnTargetMachinesV3/task.loc.json b/Tasks/PowerShellOnTargetMachinesV3/task.loc.json index 59b519edcffa..c0250dee9747 100644 --- a/Tasks/PowerShellOnTargetMachinesV3/task.loc.json +++ b/Tasks/PowerShellOnTargetMachinesV3/task.loc.json @@ -13,7 +13,7 @@ "author": "Microsoft Corporation", "version": { "Major": 3, - "Minor": 274, + "Minor": 275, "Patch": 0 }, "groups": [ diff --git a/Tasks/PowerShellV2/task.json b/Tasks/PowerShellV2/task.json index 16f16a29c89f..ca4e180142c0 100644 --- a/Tasks/PowerShellV2/task.json +++ b/Tasks/PowerShellV2/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 274, - "Patch": 1 + "Minor": 275, + "Patch": 0 }, "releaseNotes": "Script task consistency. Added support for macOS and Linux.", "minimumAgentVersion": "2.115.0", diff --git a/Tasks/PowerShellV2/task.loc.json b/Tasks/PowerShellV2/task.loc.json index 68d8920b7f5f..6d3ce0489f04 100644 --- a/Tasks/PowerShellV2/task.loc.json +++ b/Tasks/PowerShellV2/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 274, - "Patch": 1 + "Minor": 275, + "Patch": 0 }, "releaseNotes": "ms-resource:loc.releaseNotes", "minimumAgentVersion": "2.115.0", diff --git a/Tasks/ServiceFabricPowerShellV1/task.json b/Tasks/ServiceFabricPowerShellV1/task.json index 4674c5a693e3..df75bd2f3e4c 100644 --- a/Tasks/ServiceFabricPowerShellV1/task.json +++ b/Tasks/ServiceFabricPowerShellV1/task.json @@ -17,7 +17,7 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 274, + "Minor": 275, "Patch": 0 }, "demands": [ diff --git a/Tasks/ServiceFabricPowerShellV1/task.loc.json b/Tasks/ServiceFabricPowerShellV1/task.loc.json index 211ae2c19492..e64dea5f1f64 100644 --- a/Tasks/ServiceFabricPowerShellV1/task.loc.json +++ b/Tasks/ServiceFabricPowerShellV1/task.loc.json @@ -17,7 +17,7 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 274, + "Minor": 275, "Patch": 0 }, "demands": [ diff --git a/Tasks/SqlAzureDacpacDeploymentV1/task.json b/Tasks/SqlAzureDacpacDeploymentV1/task.json index 646bb17cc076..9836f3245599 100644 --- a/Tasks/SqlAzureDacpacDeploymentV1/task.json +++ b/Tasks/SqlAzureDacpacDeploymentV1/task.json @@ -16,8 +16,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 274, - "Patch": 1 + "Minor": 275, + "Patch": 0 }, "demands": [ "sqlpackage" diff --git a/Tasks/SqlAzureDacpacDeploymentV1/task.loc.json b/Tasks/SqlAzureDacpacDeploymentV1/task.loc.json index 193d501a9ff1..0599ecae3bc4 100644 --- a/Tasks/SqlAzureDacpacDeploymentV1/task.loc.json +++ b/Tasks/SqlAzureDacpacDeploymentV1/task.loc.json @@ -16,8 +16,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 274, - "Patch": 1 + "Minor": 275, + "Patch": 0 }, "demands": [ "sqlpackage" diff --git a/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.json b/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.json index ac38a7c67497..a4e7f953d72d 100644 --- a/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.json +++ b/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.json @@ -16,8 +16,8 @@ "author": "Microsoft Corporation", "version": { "Major": 0, - "Minor": 274, - "Patch": 1 + "Minor": 275, + "Patch": 0 }, "demands": [], "minimumAgentVersion": "1.102.0", diff --git a/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.loc.json b/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.loc.json index 0a242566a9dd..3c5e1bcce7ee 100644 --- a/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.loc.json +++ b/Tasks/SqlDacpacDeploymentOnMachineGroupV0/task.loc.json @@ -16,8 +16,8 @@ "author": "Microsoft Corporation", "version": { "Major": 0, - "Minor": 274, - "Patch": 1 + "Minor": 275, + "Patch": 0 }, "demands": [], "minimumAgentVersion": "1.102.0", diff --git a/Tasks/WindowsMachineFileCopyV1/task.json b/Tasks/WindowsMachineFileCopyV1/task.json index 0632024234fc..e78f73bc3bb5 100644 --- a/Tasks/WindowsMachineFileCopyV1/task.json +++ b/Tasks/WindowsMachineFileCopyV1/task.json @@ -13,7 +13,7 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 274, + "Minor": 275, "Patch": 0 }, "minimumAgentVersion": "1.104.0", diff --git a/Tasks/WindowsMachineFileCopyV1/task.loc.json b/Tasks/WindowsMachineFileCopyV1/task.loc.json index c5915f58c32f..c646346ce5c2 100644 --- a/Tasks/WindowsMachineFileCopyV1/task.loc.json +++ b/Tasks/WindowsMachineFileCopyV1/task.loc.json @@ -13,7 +13,7 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 274, + "Minor": 275, "Patch": 0 }, "minimumAgentVersion": "1.104.0", diff --git a/Tasks/WindowsMachineFileCopyV2/task.json b/Tasks/WindowsMachineFileCopyV2/task.json index db23c08b8f23..83e9dc30f830 100644 --- a/Tasks/WindowsMachineFileCopyV2/task.json +++ b/Tasks/WindowsMachineFileCopyV2/task.json @@ -13,7 +13,7 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 274, + "Minor": 275, "Patch": 0 }, "releaseNotes": "What's new in Version 2.0:
  Proxy support is being added.
   Removed support of legacy DTL machines.", diff --git a/Tasks/WindowsMachineFileCopyV2/task.loc.json b/Tasks/WindowsMachineFileCopyV2/task.loc.json index 11db8d730cc6..d2e774e9ad20 100644 --- a/Tasks/WindowsMachineFileCopyV2/task.loc.json +++ b/Tasks/WindowsMachineFileCopyV2/task.loc.json @@ -13,7 +13,7 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 274, + "Minor": 275, "Patch": 0 }, "releaseNotes": "ms-resource:loc.releaseNotes", diff --git a/_generated/AzureFileCopyV4.versionmap.txt b/_generated/AzureFileCopyV4.versionmap.txt index 84e4b86f9148..bba4842d31e0 100644 --- a/_generated/AzureFileCopyV4.versionmap.txt +++ b/_generated/AzureFileCopyV4.versionmap.txt @@ -1,2 +1,2 @@ -Default|4.274.2 -Node24_1|4.274.3 +Default|4.275.0 +Node24_1|4.275.1 diff --git a/_generated/AzureFileCopyV4/task.json b/_generated/AzureFileCopyV4/task.json index 7f1d8faf34c6..a600a2aeb0f1 100644 --- a/_generated/AzureFileCopyV4/task.json +++ b/_generated/AzureFileCopyV4/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 4, - "Minor": 274, - "Patch": 2 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" @@ -309,8 +309,8 @@ "ServicePrincipalError": "There was an error with the service principal used for the deployment." }, "_buildConfigMapping": { - "Default": "4.274.2", + "Default": "4.275.0", "LocalPackages": "4.249.4", - "Node24_1": "4.274.3" + "Node24_1": "4.275.1" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV4/task.loc.json b/_generated/AzureFileCopyV4/task.loc.json index b24056bffb94..091dcb7fb8d1 100644 --- a/_generated/AzureFileCopyV4/task.loc.json +++ b/_generated/AzureFileCopyV4/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 4, - "Minor": 274, - "Patch": 2 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" @@ -309,8 +309,8 @@ "ServicePrincipalError": "ms-resource:loc.messages.ServicePrincipalError" }, "_buildConfigMapping": { - "Default": "4.274.2", + "Default": "4.275.0", "LocalPackages": "4.249.4", - "Node24_1": "4.274.3" + "Node24_1": "4.275.1" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV4_Node24/task.json b/_generated/AzureFileCopyV4_Node24/task.json index e6deb2506ddd..ac907bd787a3 100644 --- a/_generated/AzureFileCopyV4_Node24/task.json +++ b/_generated/AzureFileCopyV4_Node24/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 4, - "Minor": 274, - "Patch": 3 + "Minor": 275, + "Patch": 1 }, "demands": [ "azureps" @@ -309,8 +309,8 @@ "ServicePrincipalError": "There was an error with the service principal used for the deployment." }, "_buildConfigMapping": { - "Default": "4.274.2", + "Default": "4.275.0", "LocalPackages": "4.249.4", - "Node24_1": "4.274.3" + "Node24_1": "4.275.1" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV4_Node24/task.loc.json b/_generated/AzureFileCopyV4_Node24/task.loc.json index 1e556f5db2f5..e890f71f71cf 100644 --- a/_generated/AzureFileCopyV4_Node24/task.loc.json +++ b/_generated/AzureFileCopyV4_Node24/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 4, - "Minor": 274, - "Patch": 3 + "Minor": 275, + "Patch": 1 }, "demands": [ "azureps" @@ -309,8 +309,8 @@ "ServicePrincipalError": "ms-resource:loc.messages.ServicePrincipalError" }, "_buildConfigMapping": { - "Default": "4.274.2", + "Default": "4.275.0", "LocalPackages": "4.249.4", - "Node24_1": "4.274.3" + "Node24_1": "4.275.1" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV5.versionmap.txt b/_generated/AzureFileCopyV5.versionmap.txt index d3b672651995..9703c27019a0 100644 --- a/_generated/AzureFileCopyV5.versionmap.txt +++ b/_generated/AzureFileCopyV5.versionmap.txt @@ -1,2 +1,2 @@ -Default|5.274.2 -Node24_1|5.274.3 +Default|5.275.0 +Node24_1|5.275.1 diff --git a/_generated/AzureFileCopyV5/task.json b/_generated/AzureFileCopyV5/task.json index 9ff927d6af06..878419138d11 100644 --- a/_generated/AzureFileCopyV5/task.json +++ b/_generated/AzureFileCopyV5/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 5, - "Minor": 274, - "Patch": 2 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" @@ -309,8 +309,8 @@ "AzModuleNotFound": "Could not find the modules: 'Az.Accounts'. If the module was recently installed, retry after restarting the Azure Pipelines task agent." }, "_buildConfigMapping": { - "Default": "5.274.2", + "Default": "5.275.0", "LocalPackages": "5.249.4", - "Node24_1": "5.274.3" + "Node24_1": "5.275.1" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV5/task.loc.json b/_generated/AzureFileCopyV5/task.loc.json index c8e7889a8ab4..12eadc980a83 100644 --- a/_generated/AzureFileCopyV5/task.loc.json +++ b/_generated/AzureFileCopyV5/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 5, - "Minor": 274, - "Patch": 2 + "Minor": 275, + "Patch": 0 }, "demands": [ "azureps" @@ -309,8 +309,8 @@ "AzModuleNotFound": "ms-resource:loc.messages.AzModuleNotFound" }, "_buildConfigMapping": { - "Default": "5.274.2", + "Default": "5.275.0", "LocalPackages": "5.249.4", - "Node24_1": "5.274.3" + "Node24_1": "5.275.1" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV5_Node24/task.json b/_generated/AzureFileCopyV5_Node24/task.json index b92b6b38cd1a..3a343ffa44ac 100644 --- a/_generated/AzureFileCopyV5_Node24/task.json +++ b/_generated/AzureFileCopyV5_Node24/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 5, - "Minor": 274, - "Patch": 3 + "Minor": 275, + "Patch": 1 }, "demands": [ "azureps" @@ -309,8 +309,8 @@ "AzModuleNotFound": "Could not find the modules: 'Az.Accounts'. If the module was recently installed, retry after restarting the Azure Pipelines task agent." }, "_buildConfigMapping": { - "Default": "5.274.2", + "Default": "5.275.0", "LocalPackages": "5.249.4", - "Node24_1": "5.274.3" + "Node24_1": "5.275.1" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV5_Node24/task.loc.json b/_generated/AzureFileCopyV5_Node24/task.loc.json index d1b842f11c5a..71d2224e16b5 100644 --- a/_generated/AzureFileCopyV5_Node24/task.loc.json +++ b/_generated/AzureFileCopyV5_Node24/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 5, - "Minor": 274, - "Patch": 3 + "Minor": 275, + "Patch": 1 }, "demands": [ "azureps" @@ -309,8 +309,8 @@ "AzModuleNotFound": "ms-resource:loc.messages.AzModuleNotFound" }, "_buildConfigMapping": { - "Default": "5.274.2", + "Default": "5.275.0", "LocalPackages": "5.249.4", - "Node24_1": "5.274.3" + "Node24_1": "5.275.1" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV6.versionmap.txt b/_generated/AzureFileCopyV6.versionmap.txt index 24b739e923b6..64b58dda1532 100644 --- a/_generated/AzureFileCopyV6.versionmap.txt +++ b/_generated/AzureFileCopyV6.versionmap.txt @@ -1,2 +1,2 @@ -Default|6.274.4 -Node24_1|6.274.5 +Default|6.275.2 +Node24_1|6.275.3 diff --git a/_generated/AzureFileCopyV6/task.json b/_generated/AzureFileCopyV6/task.json index f1dd6d08cfb7..137f9908ec6d 100644 --- a/_generated/AzureFileCopyV6/task.json +++ b/_generated/AzureFileCopyV6/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 6, - "Minor": 274, - "Patch": 4 + "Minor": 275, + "Patch": 2 }, "demands": [ "azureps" @@ -296,8 +296,8 @@ "AzModuleNotFound": "Could not find the modules: 'Az.Accounts'. If the module was recently installed, retry after restarting the Azure Pipelines task agent." }, "_buildConfigMapping": { - "Default": "6.274.4", + "Default": "6.275.2", "LocalPackages": "6.249.4", - "Node24_1": "6.274.5" + "Node24_1": "6.275.3" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV6/task.loc.json b/_generated/AzureFileCopyV6/task.loc.json index 7565f0031ee4..65eb56e212e0 100644 --- a/_generated/AzureFileCopyV6/task.loc.json +++ b/_generated/AzureFileCopyV6/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 6, - "Minor": 274, - "Patch": 4 + "Minor": 275, + "Patch": 2 }, "demands": [ "azureps" @@ -296,8 +296,8 @@ "AzModuleNotFound": "ms-resource:loc.messages.AzModuleNotFound" }, "_buildConfigMapping": { - "Default": "6.274.4", + "Default": "6.275.2", "LocalPackages": "6.249.4", - "Node24_1": "6.274.5" + "Node24_1": "6.275.3" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV6_Node24/task.json b/_generated/AzureFileCopyV6_Node24/task.json index d63bcb85e9e5..87f3dd9b29b1 100644 --- a/_generated/AzureFileCopyV6_Node24/task.json +++ b/_generated/AzureFileCopyV6_Node24/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 6, - "Minor": 274, - "Patch": 5 + "Minor": 275, + "Patch": 3 }, "demands": [ "azureps" @@ -296,8 +296,8 @@ "AzModuleNotFound": "Could not find the modules: 'Az.Accounts'. If the module was recently installed, retry after restarting the Azure Pipelines task agent." }, "_buildConfigMapping": { - "Default": "6.274.4", + "Default": "6.275.2", "LocalPackages": "6.249.4", - "Node24_1": "6.274.5" + "Node24_1": "6.275.3" } } \ No newline at end of file diff --git a/_generated/AzureFileCopyV6_Node24/task.loc.json b/_generated/AzureFileCopyV6_Node24/task.loc.json index 06a8dd2d0141..17f3c8555db4 100644 --- a/_generated/AzureFileCopyV6_Node24/task.loc.json +++ b/_generated/AzureFileCopyV6_Node24/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 6, - "Minor": 274, - "Patch": 5 + "Minor": 275, + "Patch": 3 }, "demands": [ "azureps" @@ -296,8 +296,8 @@ "AzModuleNotFound": "ms-resource:loc.messages.AzModuleNotFound" }, "_buildConfigMapping": { - "Default": "6.274.4", + "Default": "6.275.2", "LocalPackages": "6.249.4", - "Node24_1": "6.274.5" + "Node24_1": "6.275.3" } } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4.versionmap.txt b/_generated/AzurePowerShellV4.versionmap.txt index 6bcf51ec9c6b..1686f0fa7f83 100644 --- a/_generated/AzurePowerShellV4.versionmap.txt +++ b/_generated/AzurePowerShellV4.versionmap.txt @@ -1,2 +1,2 @@ -Default|4.274.6 -Node24_1|4.274.7 +Default|4.275.2 +Node24_1|4.275.3 diff --git a/_generated/AzurePowerShellV4/task.json b/_generated/AzurePowerShellV4/task.json index 6a765438c079..7c34b5f63760 100644 --- a/_generated/AzurePowerShellV4/task.json +++ b/_generated/AzurePowerShellV4/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 4, - "Minor": 274, - "Patch": 6 + "Minor": 275, + "Patch": 2 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ @@ -215,8 +215,8 @@ "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." }, "_buildConfigMapping": { - "Default": "4.274.6", + "Default": "4.275.2", "LocalPackages": "4.249.4", - "Node24_1": "4.274.7" + "Node24_1": "4.275.3" } } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4/task.loc.json b/_generated/AzurePowerShellV4/task.loc.json index 667e0acb5bd8..9048eb6d0697 100644 --- a/_generated/AzurePowerShellV4/task.loc.json +++ b/_generated/AzurePowerShellV4/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 4, - "Minor": 274, - "Patch": 6 + "Minor": 275, + "Patch": 2 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ @@ -215,8 +215,8 @@ "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal" }, "_buildConfigMapping": { - "Default": "4.274.6", + "Default": "4.275.2", "LocalPackages": "4.249.4", - "Node24_1": "4.274.7" + "Node24_1": "4.275.3" } } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/task.json b/_generated/AzurePowerShellV4_Node24/task.json index a61af1136704..bf0771fda2fb 100644 --- a/_generated/AzurePowerShellV4_Node24/task.json +++ b/_generated/AzurePowerShellV4_Node24/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 4, - "Minor": 274, - "Patch": 7 + "Minor": 275, + "Patch": 3 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ @@ -219,8 +219,8 @@ "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired." }, "_buildConfigMapping": { - "Default": "4.274.6", + "Default": "4.275.2", "LocalPackages": "4.249.4", - "Node24_1": "4.274.7" + "Node24_1": "4.275.3" } } \ No newline at end of file diff --git a/_generated/AzurePowerShellV4_Node24/task.loc.json b/_generated/AzurePowerShellV4_Node24/task.loc.json index 1aa4c3849a94..35a337f31142 100644 --- a/_generated/AzurePowerShellV4_Node24/task.loc.json +++ b/_generated/AzurePowerShellV4_Node24/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 4, - "Minor": 274, - "Patch": 7 + "Minor": 275, + "Patch": 3 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ @@ -219,8 +219,8 @@ "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal" }, "_buildConfigMapping": { - "Default": "4.274.6", + "Default": "4.275.2", "LocalPackages": "4.249.4", - "Node24_1": "4.274.7" + "Node24_1": "4.275.3" } } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5.versionmap.txt b/_generated/AzurePowerShellV5.versionmap.txt index 4f01f6bbfb8c..c287f3e7a781 100644 --- a/_generated/AzurePowerShellV5.versionmap.txt +++ b/_generated/AzurePowerShellV5.versionmap.txt @@ -1,2 +1,2 @@ -Default|5.274.6 -Node24_1|5.274.7 +Default|5.275.4 +Node24_1|5.275.5 diff --git a/_generated/AzurePowerShellV5/task.json b/_generated/AzurePowerShellV5/task.json index 248aba250e9a..ec109bee9fba 100644 --- a/_generated/AzurePowerShellV5/task.json +++ b/_generated/AzurePowerShellV5/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 5, - "Minor": 274, - "Patch": 6 + "Minor": 275, + "Patch": 4 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ @@ -209,8 +209,8 @@ "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" }, "_buildConfigMapping": { - "Default": "5.274.6", + "Default": "5.275.4", "LocalPackages": "5.249.4", - "Node24_1": "5.274.7" + "Node24_1": "5.275.5" } } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5/task.loc.json b/_generated/AzurePowerShellV5/task.loc.json index 5c496251463d..e3ee067335cf 100644 --- a/_generated/AzurePowerShellV5/task.loc.json +++ b/_generated/AzurePowerShellV5/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 5, - "Minor": 274, - "Patch": 6 + "Minor": 275, + "Patch": 4 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ @@ -209,8 +209,8 @@ "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning" }, "_buildConfigMapping": { - "Default": "5.274.6", + "Default": "5.275.4", "LocalPackages": "5.249.4", - "Node24_1": "5.274.7" + "Node24_1": "5.275.5" } } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/task.json b/_generated/AzurePowerShellV5_Node24/task.json index 205461122adf..ea91874dc501 100644 --- a/_generated/AzurePowerShellV5_Node24/task.json +++ b/_generated/AzurePowerShellV5_Node24/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 5, - "Minor": 274, - "Patch": 7 + "Minor": 275, + "Patch": 5 }, "releaseNotes": "Added support for Az Module and cross platform agents.", "groups": [ @@ -213,8 +213,8 @@ "Az_LowerVersionWarning": "Specified {0} version {1} is out of date, the latest version is {2}" }, "_buildConfigMapping": { - "Default": "5.274.6", + "Default": "5.275.4", "LocalPackages": "5.249.4", - "Node24_1": "5.274.7" + "Node24_1": "5.275.5" } } \ No newline at end of file diff --git a/_generated/AzurePowerShellV5_Node24/task.loc.json b/_generated/AzurePowerShellV5_Node24/task.loc.json index eeafe99a7d3a..99bb92952bd4 100644 --- a/_generated/AzurePowerShellV5_Node24/task.loc.json +++ b/_generated/AzurePowerShellV5_Node24/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 5, - "Minor": 274, - "Patch": 7 + "Minor": 275, + "Patch": 5 }, "releaseNotes": "ms-resource:loc.releaseNotes", "groups": [ @@ -213,8 +213,8 @@ "Az_LowerVersionWarning": "ms-resource:loc.messages.Az_LowerVersionWarning" }, "_buildConfigMapping": { - "Default": "5.274.6", + "Default": "5.275.4", "LocalPackages": "5.249.4", - "Node24_1": "5.274.7" + "Node24_1": "5.275.5" } } \ No newline at end of file From 48c777561cde3f458b529645412827f8639d7b09 Mon Sep 17 00:00:00 2001 From: Vladimir Tretyakov Date: Mon, 18 May 2026 16:42:03 +0200 Subject: [PATCH 25/25] Bump ServiceFabricPowerShellV1 SDK to 0.21.0 + fix L0 test PR ref Addresses review feedback on PR #22171: 1. ServiceFabricPowerShellV1 was pinning VstsTaskSdk 0.11.0, but Get-VstsPipelineFeature (used by the new Invoke-ScriptArgumentSanitization dispatcher) only landed in 0.20.0+. The dispatcher's Test-ShouldUseSanitizer falls open to no-op when the cmdlet is missing, which silently made the SF V1 sanitization inert in production - exactly the regression the new helper was designed to surface only on real failures. Bumped to 0.21.0 to match AzurePowerShellV5 / PowerShellV2 (sister sanitizer-adopting PowerShell tasks). Verified safe: - SF V1 only uses Get-VstsInput / Trace-VstsEnteringInvocation, which are stable across SDK versions. - All SF V1 L0 tests Register-Mock Invoke-ScriptArgumentSanitization at top, so the actual SDK call is never exercised in tests. - Tests/lib/Initialize-Test.ps1 already provides a global stub for Get-VstsPipelineFeature, so the dispatcher's cmdlet-presence check is neutralized in test runs regardless of SDK version. 2. L0Invoke-ScriptArgumentSanitization.ps1 header comment referenced the predecessor fork PR #22163 (which this PR explicitly replaces); updated to #22171. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 | 2 +- Tasks/ServiceFabricPowerShellV1/make.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 b/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 index 0c41bb3fc4c5..d7188a0b7e2d 100644 --- a/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 +++ b/Tasks/Common/Sanitizer/Tests/L0Invoke-ScriptArgumentSanitization.ps1 @@ -1,4 +1,4 @@ -# Unit tests for Invoke-ScriptArgumentSanitization dispatcher (added by MSRC 115118 / PR #22163). +# Unit tests for Invoke-ScriptArgumentSanitization dispatcher (added by MSRC 115118 / PR #22171). # # Mirrors the precedent set by Tasks/SqlAzureDacpacDeploymentV1/Tests/L0SecurityFunctions.ps1 # (PR #21947): each scenario configures Register-Mock for Get-SanitizerCallStatus, diff --git a/Tasks/ServiceFabricPowerShellV1/make.json b/Tasks/ServiceFabricPowerShellV1/make.json index aa717cdaf52c..0654e24ae0e7 100644 --- a/Tasks/ServiceFabricPowerShellV1/make.json +++ b/Tasks/ServiceFabricPowerShellV1/make.json @@ -21,7 +21,7 @@ "nugetv2": [ { "name": "VstsTaskSdk", - "version": "0.11.0", + "version": "0.21.0", "repository": "https://www.powershellgallery.com/api/v2/", "cp": [ {