在 Exchange Online 上运行 Add-DistributionGroupMember PS cmdlet 时出现权限错误

问题描述

我目前正在尝试使用 PowerShell 脚本在 Azure AD 中自动创建用户,并在 Exchange Online 中自动添加通讯组。为此,我遵循了 this 指南 - 我已经使用证书设置了应用注册,这就是我向 Azure AD 和 Exchange Online 进行身份验证的方式 - 无需人工干预。

我在脚本中运行的特定 Exchange cmdlet(对于 EXO 部分)是 Add-distributionGroupMember -member "user@domain.com" -identity "dlist" -BypassSecurityGroupManagerCheck,一旦我运行它,我就会收到以下错误输出

Active Directory operation Failed on XXXXXXXXXXXXXXX.XXXXXXXXXXX.PROD.outlook.com. This error is not retriable. Additional information: Insufficient access rights to perform the operation.
Active directory response: 00002098: SecErr: DSID-XXXXXXXX,problem 4003 (INSUFF_ACCESS_RIGHTS),data 0
    + CategoryInfo          : NotSpecified: (:) [Add-distributionGroupMember],ADOperationException
    + FullyQualifiedErrorId : [Server=XXXXXXXXXXXXX,RequestId=8ac3130a-4bbe-41a0-b062-4768b6f51234,TimeStamp=1/3/2021 2:18:13 PM] [FailureCategory=Cmdlet-ADOperationException] XXXXXXX,Microsoft.Exchange.Management.RecipientTasks.Adddistribu
   tionGroupMember
    + PSComputerName        : outlook.office365.com

其他 cmdlet,例如 Get-MailBox 工作正常,但这个特定的问题不断给我带来问题。我已经尝试将 Azure 中我能想到的所有 API 权限授予应用程序,包括委托和应用程序权限,但我仍然面临错误。这是当前的完整列表,我没有任何成功:

我也尝试用应用程序权限替换一些委派权限,但也无济于事。我也尝试按照 article 中提到的那样为应用程序分配各种角色,每次出现 Insufficient access rights to perform the operation 错误时。

谁能告诉我为什么?我应该在哪里以及如何授予应用程序将用户添加到分发(邮件)列表的必要权限?

过去几天我一直在四处寻找,但没有找到答案。任何帮助将不胜感激。

解决方法

如果我没记错的话,在添加成员之前,您应该是该组的ManagedBy 的一部分。

第 1 步:

首先执行以下命令之一:

Set-DistributionGroup <NameOfGroup> -ManagedBy "<Your Alias>" -BypassSecurityGroupManagerCheck

或者:

Set-DistributionGroup Accounting -ManagedBy @{Add="< Your Alias>"} -BypassSecurityGroupManagerCheck

第 2 步:

然后执行命令将用户添加到组中。

Add-DistributionGroupMember -Identity <NameOfGroup> -Member user@contoso.com
,

根据我的测试,添加Exchange.ManageAsApp应用程序权限并分配Exchange服务管理员角色就足够了。

创建 AAD 应用并添加 Exchange.ManageAsApp 应用权限。

$appName = 'Exo_V2_App'

$api = (Get-AzureADServicePrincipal -Filter "AppID eq '00000002-0000-0ff1-ce00-000000000000'")

$permission = $api.AppRoles | Where-Object { $_.Value -eq 'Exchange.ManageAsApp' }

$apiPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
    ResourceAppId  = $api.AppId ;
    ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{
        Id   = $permission.Id ;
        Type = "Role"
    }
}

$myApp = New-AzureADApplication -DisplayName $appName -ReplyUrls 'http://localhost' -RequiredResourceAccess $apiPermission

$mySP = New-AzureADServicePrincipal -AppID $myApp.AppID

$myApp | Format-List DisplayName,ObjectID,AppID

将服务主体分配给 Exchange 服务管理员角色。

$directoryRole = 'Exchange Service Administrator'

$RoleId = (Get-AzureADDirectoryRole | Where-Object {$_.displayname -eq $directoryRole}).ObjectID

Add-AzureADDirectoryRoleMember -ObjectId $RoleId -RefObjectId $mySP.ObjectID -Verbose

您可以尝试创建一个新的干净的 Azure AD 应用程序,而无需添加额外的配置来进行测试。