Microsoft Graph SDK (C#) 组邮箱

Microsoft Graph SDK (C#) Group Mailbox

我有一个连接的控制台应用程序,我正在编写它来帮助自动化即将到来的租户迁移。

我想要做的是从我们当前的租户中删除自定义域的所有关联,以便我可以将它们添加到新租户。

我目前拥有的:

ConsoleApp 已在 AAD 中注册,API 权限已分配并同意。

我导入了以下内容:

using Microsoft.Graph;
using Microsoft.Graph.Auth;
using Microsoft.Identity.Client

初始化一个graphClient:

GraphServiceClient graphClient = new GraphServiceClient(authProvider);

并成功对图表进行了 .GetAsync 次调用。

我需要什么帮助:

我正在尝试将群组的电子邮件更新为 'gItem.mailNickname@tenantID'。我有一个错误说 "Mail field is read-only"。通过 Graph Explorer,我注意到 proxyAddresses 字段包含该组的所有别名,并且邮件列为 "SMPT:..." 我正在尝试用 [= 覆盖 proxyAddresses 字段24=]

var upGroup = await graphClient
    .Groups["4f629be4-f592-4520-b80d-7570f68e276e"]
    .Request()
    .GetAsync();

var updateFields = new Group
{
    ProxyAddresses = new List<string>()
    {
    "SMPT:" + upGroup.MailNickname + "@" + tenantID,
    }
};

await graphClient
    .Groups[upGroup.Id]
    .Request()
    .UpdateAsync(updateFields);

我收到权限不足的错误,但已检查 AAD 以确保 Directory.ReadWrite.AllGroups.ReadWrite.All 均已配置和授予。

可以更改其他组属性,这让我质疑我在 proxyAddresses 属性.

上的结构

无法将代码添加到列表

var updateFields = new Group
{
    ProxyAddresses = new string[] { "SMTP:" + upGroup.MailNickname + "@" + tenantID }
};

完整代码:

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Graph;
using Microsoft.Graph.Auth;
using Microsoft.Identity.Client;

namespace RemoveGroupAliases
{

    class Program
    {
        private static string clientId = "";
        private static string tenantID = "";
        private static string clientSecret = "";
        private static IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
            .Create(clientId)
            .WithTenantId(tenantID)
            .WithClientSecret(clientSecret)
            .Build();

        static ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);

        static async Task Main(string[] args)
        {
            GraphServiceClient graphClient = new GraphServiceClient(authProvider);

            var groups = await graphClient
                .Groups
                .Request()
                .Filter("mailEnabled+eq+true")
                .GetAsync();

            foreach (var tgroup in groups)
            {
                Console.WriteLine(tgroup.Id);
                Console.WriteLine(tgroup.DisplayName);
            };

            var upGroup = await graphClient
                .Groups["4f629be4-f592-4520-b80d-7570f68e276e"]
                .Request()
                .GetAsync();

            var updateFields = new Group
            {
                ProxyAddresses = new List<String>()
                {
                "SMTP:" + upGroup.MailNickname + "@" + tenantID
                }
            };

            await graphClient
                .Groups[upGroup.Id]
                .Request()
                .UpdateAsync(updateFields);

            Console.ReadLine();
        }
    }
}

我的想法是提取所有启用邮件的组并删除所有域,以便我可以将其从该租户中删除并将其关联到新租户。一旦域被切换,我将有一个不同的程序来分配域和别名。当我将鼠标悬停在 proxyAddresses 的工具提示上时,最后一行显示 "Read-Only" 这可能是我的问题,但我没有将其视为错误。

您描述的情况根本不可能发生。您不能从一个租户分离组(或任何数据)并将其迁移到另一个租户。每个 AAD 租户都是一个独特的实体,与任何其他租户隔离。

Microsoft Graph 使用您提供的令牌将您的请求路由到生成令牌的租户中的正确 API/Service。您不能将单个令牌连接到多个租户。

此外,如 documentation 中所述,属性 mailproxyAddresses 是只读的。如果您希望更改群组的电子邮件别名,您可以可以更改mailNickname 属性。这只是组的 "alias",电子邮件地址的域部分由 AAD 和 Exchange 自动分配 ({mailNickname}@{default.tenant.domain})。