Set-AzSqlServerActiveDirectoryAdministrator: не удается найти объект Azure Active Directory 'service_principal_name'

Я выполняю следующую команду

$sp = az ad sp show --id $env:ARM_CLIENT_ID --query '{objectId: objectId, displayName: displayName}'
az sql server ad-admin create --resource-group data-eastus2 `
    --server-name data-eastus2-sqlsvr `
    --display-name $sp.name `
    --object-id $sp.id

который отлично работает без предоставления каких-либо разрешений Graph API для принципала службы. Попытка имитировать эту функциональность с помощью модуля Az Powershell, выполнив следующие

Set-AzSqlServerActiveDirectoryAdministrator -ResourceGroupName 'data-eastus2'  -ServerName 'data-eastus2-sqlsvr' -DisplayName $sp.name -ObjectId $sp.id

дает исключение

Set-AzSqlServerActiveDirectoryAdministrator: не удается найти объект Azure Active Directory 'service_principal_name'. Убедитесь, что авторизуемый пользователь или группа зарегистрированы в каталоге Azure Active Directory текущей подписки. Чтобы получить список групп Azure Active Directory, используйте Get-AzADGroup, или чтобы получить список пользователей Azure Active Directory, используйте Get-AzADUser. В строке: 1 символ: 1 + Set-AzSqlServerActiveDirectoryAdministrator -ResourceGroupName 'data ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: CloseError: (:) [Set-AzSqlServer ... ryAdministrator], ArgumentException + FullyQualifiedErrorId: Microsoft.Azure.Commands.Sql.ServerActiveDirectoryAdministrator.Cmdlet.SetAzureSqlServerActiveDirectoryAdministrator

Предоставление разрешений API Azure Active Directory Graph - Directory.Read.All и Microsoft Graph - Directory.Read.All не помогло.


person Alexey Auslender    schedule 09.05.2020    source источник


Ответы (2)


Azure CLI az sql server ad-admin create не будет вызывать Azure AD Graph для проверки переданных вами параметров, он просто вызывает REST API _ 2_, чтобы установить администратора. Даже если вы передадите неверные --display-name и --object-id (также должны иметь формат Guid), команда также будет работать нормально. Вы можете проверить детали с помощью параметра --debug.

введите здесь описание изображения

Azure PowerShell Set-AzSqlServerActiveDirectoryAdministrator будет вызывать Azure AD Graph _ 8_ для проверки правильности объекта. И если тип результата не Azure AD security group, он дополнительно вызовет _ 10_. Поэтому, если тип результата является субъектом службы, он также вызовет _ 11_, тогда это вызовет проблему. Вы можете использовать инструмент Fiddler, чтобы поймать reuqest, как показано ниже.

введите здесь описание изображения

введите здесь описание изображения

Поэтому, если вы хотите использовать Set-AzSqlServerActiveDirectoryAdministrator, вы можете создать security group (не офисную группу) в Azure AD, добавить участника службы в группу, а затем добавить группу к администратору сервера sql, как указано в ответе @ alphaz18.

$sp = Get-AzADServicePrincipal -ObjectId "<object-id>"
$group = Get-AzADGroup -DisplayName "joysec"
Add-AzADGroupMember -TargetGroupObjectId $group.Id -MemberObjectId $sp.Id
Set-AzSqlServerActiveDirectoryAdministrator -ResourceGroupName "<groupname>" -ServerName "<servername>" -DisplayName $group.DisplayName -ObjectId $group.Id

Примечание. Чтобы запустить приведенный выше сценарий, вам необходимо предоставить Directory.ReadWrite.All разрешение приложения Azure Active Directory Graph (не Microsoft Graph) для вашего приложения AD, и есть некоторая задержка, подождите, пока пока и тестирую. введите здесь описание изображения

введите здесь описание изображения

person Joy Wang    schedule 11.05.2020

Скорее всего, я не могу подтвердить это, так как я не уверен на 100%, но я думаю, что set-azsqlserveractivedirectoryadministrator фильтрует только azaduser или azadgroup. вероятно, он не будет искать субъектов обслуживания. в качестве обходного пути, если вы хотите этого добиться. вы можете создать лазурную группу объявлений под названием dbas или что-то в этом роде. и добавьте субъекта-службы в эту группу. затем добавьте группу на сервер sql, используя команду set-azsql.

так что-то вроде этого:

$sp = Get-AzADServicePrincipal -DisplayName "theserviceprincipalname"
Add-AzADGroupMember -MemberObjectId $($sp.id) -TargetGroupDisplayName "AAD Group Name"

Set-AzSqlServerActiveDirectoryAdministrator -ResourceGroupName 'data-eastus2'  -ServerName 'data-eastus2-sqlsvr' -DisplayName "AAD Group Name"

Надеюсь, что это сработает для вас, а не на 100% прямо ответить на то, что вы спрашиваете, но я считаю, что это жизнеспособный обходной путь для ваших требований, надеюсь.

person alphaz18    schedule 10.05.2020