Set-AzSqlServerActiveDirectoryAdministrator: не удается найти Azure объект Active Directory 'service_principal_name' - PullRequest
0 голосов
/ 09 мая 2020

Я запускаю следующую команду

$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 текущей подписки. Чтобы получить список 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

GraphAll - DirectoryRectoryAdministrator Azure. Directory.Read.All API Permissions не помогли.

Ответы [ 2 ]

1 голос
/ 11 мая 2020

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

enter image description here

Azure powershell Set-AzSqlServerActiveDirectoryAdministrator вызовет Azure AD Graph getObjectsByObjectIds: Get objects from a list of object IDs для проверки правильности объекта. И если тип результата не Azure AD security group, он будет вызывать Get a user. Поэтому, если тип результата является принципалом службы, он также вызовет Get a user, тогда это вызовет проблему. Вы можете использовать инструмент Fiddler, чтобы поймать reuqest, как показано ниже.

enter image description here

enter image description here

Итак, если вы хотите использовать Set-AzSqlServerActiveDirectoryAdministrator, вы можете создать a 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, и есть некоторые задержка, подождите немного и проверьте. enter image description here

enter image description here

0 голосов
/ 10 мая 2020

Скорее всего, я не могу подтвердить это, поскольку я не уверен на 100%, но я думаю, что set-azsqlserveractivedirectoryadministrator фильтрует только по azaduser или azadgroup. вероятно, он не будет искать субъектов обслуживания. в качестве обходного пути, если вы хотите выполнить sh this. вы можете создать группу объявлений azure под названием 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% напрямую ответить на то, чем вы были спрашиваю, но я надеюсь, что это жизнеспособный обходной путь в соответствии с вашими требованиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...