Microsoft Graph SDK(C#)组邮箱

时间:2019-11-19 22:12:35

标签: c# microsoft-graph microsoft-graph-sdks

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

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

到目前为止我所拥有的:

ConsoleApp已向AAD注册,并且已分配API权限并获得同意。

我已导入以下内容:

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

初始化graphClient

GraphServiceClient graphClient = new GraphServiceClient(authProvider);

并成功调用了图形的.GetAsync

我需要什么帮助:

我正在尝试将网上论坛的电子邮件更新为'gItem.mailNickname@tenantID'。我说“邮件字段为只读”时出错。通过图形浏览器,我注意到proxyAddresses字段包含了该组的所有别名,并且邮件被列为“ SMPT:...”,我试图用以下方式覆盖proxyAddresses字段

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的工具提示上时,最后一行显示“只读”,这可能是我的问题,但我没有把它当作错误。

1 个答案:

答案 0 :(得分:0)

您所描述的场景根本不可能。您不能从一个租户分离组(或实际上是任何数据)并将其迁移到另一个租户。每个AAD租户都是一个独立的实体,并且与任何其他租户隔离。

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

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