пожалуйста, добавьте информацию в ссылку на ваш ответ.

я есть проект VSTS, подключенный через участника службы к подписке Azure через конечную точку диспетчера ресурсов Azure. Это хорошо работает для моих сборок, которые конфигурируют ресурсы ARM через шаблонные, управляемые параметрами развертывания.

У меня есть дополнительное требование для настройки групп Azure AD как части сборки. У меня есть скрипт, который отлично работает с моей локальной машины. Когда я развернул его через сборку, и он выполнялся на размещенном контроллере сборки, сценарий изначально не смог найти модуль AzureAD. Я справился с этим, включив скрипт в git Repo и получив к нему доступ через:

$adModulePath = $PSScriptRoot + "\PsModules\AzureAD\2.0.0.131\AzureAD.psd1"
Import-Module $adModulePath 

Тем не менее, у меня теперь есть другая проблема, когда дело доходит до запускаNew-AzureADGroup, Сценарий требуетConnect-AzureAD запускаться до того, как команда будет введена. Это прекрасно работает путем жесткого кодирования учетных данных, но я не хочу этого делать, я хочу, чтобы он работал в контексте созданного SPN, который запускает сценарии на размещенном контроллере сборки.

Итак, вопрос в том, могу ли я получить текущий контекст SPN выполнения Azure PowerShell и передать егоConnect-AzureAD избежать хранения учетных данных в виде простого текста? Я пропускаю трюк? Есть ли альтернативы?

Мой текущий код, как показано ниже, прокомментированное соединение работает нормально из команды, как с жестко закодированными значениями. Вызов без параметров представляет пользовательский интерфейс входа в систему, который завершает сборку, поскольку он, очевидно, не является интерактивным.

## Login to Azure
#$SecurePassword = ConvertTo-SecureString $AdminPassword -AsPlainText -Force
#$AdminCredential = New-Object System.Management.Automation.PSCredential ($AdminUserEmailAddress, $SecurePassword)
#Connect-AzureAD -Credential $AdminCredential

Connect-AzureAD

Write-Output "------------------ Start: Group Creation ------------------"

$TestForAdminGroup = Get-AzureADGroup -SearchString $AdminGroup
$TestForContributorGroup = Get-AzureADGroup -SearchString $ContributorGroup
$TestForReaderGroup = Get-AzureADGroup -SearchString $ReaderGroup

Спасибо

 Murray Foxcroft05 окт. 2017 г., 08:00
Нет, к сожалению нет. Я ценю, что Azure AD не зависит от подписки Azure, но было бы хорошо, если бы модули Poweshell могли использовать один и тот же контекст. Это не так уж важно, но теперь мне нужно управлять двумя наборами учетных данных, чтобы запускать мои сборки Azure для одной подписки.
 starian chen-MSFT04 окт. 2017 г., 07:22
Нет, вам нужно вызвать Connect-AzureAD с помощью скрипта учетных данных, вы можете сохранить учетные данные в секретной переменной (нажмите на значок замка, это жесткое кодирование)
 Murray Foxcroft04 окт. 2017 г., 09:14
Спасибо - это вариант, я надеялся, что будет лучший способ.
 starian chen-MSFT05 окт. 2017 г., 03:54
Connect-AzureAD также требуется, если вы делаете это вручную на локальном компьютере. Я пытался использовать основной ключ и идентификатор для создания учетных данных, но не могу использовать для Connect-AzureAD. У вас есть способ сделать это с основным ключом и идентификатором?

Ответы на вопрос(3)

модуль Powershell не может использовать один и тот же контекст, и вам нужно сохранить учетные данные в секретной переменной в VSTS.

Решение Вопроса

Расширение VSTS что я выпустил некоторое время назад. Мое расширение используетAzure Resource Manager endpoint в качестве ввода.

Запустите его сейчас в пуле агентов Microsoft Hosted Visual Studio 2017 с помощью приведенного ниже кода. Смотрите для получения дополнительной информации мойпубликация о том, как использовать командлеты AzureAD PowerShell в агенте VSTS.

Write-Verbose "Import AzureAD module because is not on default VSTS agent"
$azureAdModulePath = $PSScriptRoot + "\AzureAD\2.0.1.16\AzureAD.psd1"
Import-Module $azureAdModulePath 

# Workaround to use AzureAD in this task. Get an access token and call Connect-AzureAD
$serviceNameInput = Get-VstsInput -Name ConnectedServiceNameSelector -Require
$serviceName = Get-VstsInput -Name $serviceNameInput -Require
$endPointRM = Get-VstsEndpoint -Name $serviceName -Require

$clientId = $endPointRM.Auth.Parameters.ServicePrincipalId
$clientSecret = $endPointRM.Auth.Parameters.ServicePrincipalKey
$tenantId = $endPointRM.Auth.Parameters.TenantId

$adTokenUrl = "https://login.microsoftonline.com/$tenantId/oauth2/token"
$resource = "https://graph.windows.net/"

$body = @{
    grant_type    = "client_credentials"
    client_id     = $clientId
    client_secret = $clientSecret
    resource      = $resource
}

$response = Invoke-RestMethod -Method 'Post' -Uri $adTokenUrl -ContentType "application/x-www-form-urlencoded" -Body $body
$token = $response.access_token

Write-Verbose "Login to AzureAD with same application as endpoint"
Connect-AzureAD -AadAccessToken $token -AccountId $clientId -TenantId $tenantId
 Jari Turkia01 февр. 2019 г., 14:46
Приведенный выше код можно запустить только внутри расширения DevOps Azure. Если вы хотите сделать то же самое из задачи Azure Powershell, см.stackoverflow.com/questions/41803816/...
 Murray Foxcroft14 авг. 2018 г., 20:57
Хороший пример отправки сообщений для получения токена доступа. Я не нашел Get-VstsEndpoint, который, кажется, имеет секретный соус. Благодарю.
 robpvn13 сент. 2018 г., 15:48
Ссылка, кажется, не работает, Google говорит мне, что это должно бытьlocktar.nl/programming/powershell/...
 Ralph Jansen13 сент. 2018 г., 18:10
Спасибо исправил ссылку

можно использовать принципала службы, следуя примеру 3 здесь:

https://docs.microsoft.com/en-us/powershell/module/azuread/connect-azuread?view=azureadps-2.0

Создав самоподписанный сертификат и прикрепив его, вы можете подключиться к Azure AD, передав отпечаток сертификата вместе с несколькими другими параметрами:

Connect-AzureAD -TenantId $ tenantId -ApplicationId $ sp.AppId -CertificateThumbprint $ thumb

 Irreducible09 нояб. 2017 г., 13:31
пожалуйста, добавьте информацию в ссылку на ваш ответ.

Ваш ответ на вопрос