更新Office365个人联系人 背景:

更新Office365个人联系人 背景:,office365,microsoft-graph-api,office365api,Office365,Microsoft Graph Api,Office365api,我们公司有12名协调员。每个协调员管理一组个人联系人 Coordinator1管理409个个人联系人 协调员2管理216个个人联系人 等等 我们有一个夜间任务,它填充一个SQL Server表,该表保存个人联系信息 表中的数据被提取到12个不同的CSV文件,然后发送给每个协调员 协调员有责任将此CSV文件导入其Outlook,以使其个人联系人列表保持最新(是的,这些个人联系人每天都会更改) 对于大多数协调员来说,整个CSV文件的导入都有点太多了,其目标是实现自动化,或者使Outlook个人联

我们公司有12名协调员。每个协调员管理一组个人联系人

  • Coordinator1管理409个个人联系人
  • 协调员2管理216个个人联系人
  • 等等
我们有一个夜间任务,它填充一个SQL Server
,该表保存个人联系信息

中的数据被提取到12个不同的
CSV文件
,然后发送给每个协调员

协调员有责任将此
CSV文件导入其Outlook,以使其个人联系人列表保持最新(是的,这些个人联系人每天都会更改)

对于大多数协调员来说,整个CSV文件的导入都有点太多了,其目标是实现自动化,或者使Outlook个人联系人同步,这样这些协调员就不必执行此日常手动任务

我所尝试的: 我创建了一个C#控制台应用程序,并添加了ADAL和Microsoft Graph客户端库NuGet包

我已经在Azure中正确注册了我的应用程序,并获得了
客户Id
客户机密

我已经设置了相应的
应用程序和委派权限

我能够运行应用程序,获取
令牌
,并调用Microsoft Graph客户端

问题是: 在撰写本文时,我的问题是Microsoft Graph不支持创建
联系人列表
,也不允许我在此
联系人列表
中添加、删除或更新个人联系人

无法使用
。每次向组中添加用户时,都会向该特定用户发送一封电子邮件,让他知道自己已添加到组中

此外,同一个用户可以将自己从组中删除,我们只是不希望这样

Microsoft Graph还支持创建
文件夹
,并将人员添加到这些文件夹中,但不幸的是,我发现这些文件夹的唯一用途是组织内容

对于文件夹,我无法向特定文件夹发送电子邮件,而该文件夹又会向该文件夹中的每个人发送电子邮件。这就是
联系人列表
的目的……但是,在撰写本文时,API没有任何关于
联系人列表
的内容

有人有更好的建议或解决方法来完成我的任务吗

我不介意重写整个控制台应用程序,甚至完全改变整个方法(比如使用Powershell)

我所关心的就是不要再让这12位协调员手动导入
CSV文件了

提前谢谢

PS:我甚至查看了Microsoft Flow,但还没有找到一个可以更新Outlook个人联系人的流。

目前,两者都不支持“联系人组”

但是,您可以使用以编程方式创建它们。中有一个带有示例C#代码的演练

目前,双方都不支持“联络小组”


但是,您可以使用以编程方式创建它们。中有一个带有示例C#代码的演练

如果有人在乎的话,这就是最终结果

static void Main(string[] args)
{
    try
    {
        var domain = "mydomain.com";
        var email = "service_account@mydomain.com";
        var accountPassword = "Password1";
        var emailToImpersonify = "frank_underwood@mydomain.com";
        var contactGroupDisplayName = "MySuperAmazingContactGroup";

        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
        service.Credentials = new NetworkCredential(email, accountPassword, domain);
        service.AutodiscoverUrl(email, RedirectionUrlValidationCallback);

        // Make sure the account [service_account@mydomain.com] is a member of the ApplicationImpersonation admin role. 
        service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, emailToImpersonify);

        // Prior to creating the ContactGroup, check and delete any pre-existing ContactGroup
        SearchFilter sfSearch = new SearchFilter.IsEqualTo(ContactGroupSchema.DisplayName, contactGroupDisplayName);
        FindItemsResults<Item> results = service.FindItems(WellKnownFolderName.Contacts, sfSearch, new ItemView(int.MaxValue));
        if (results != null)
        {
            foreach (Item item in results)
                item.Delete(DeleteMode.HardDelete);
        }

        // Create the new ContactGroup with a few members
        ContactGroup newContactGroup = new ContactGroup(service);
        newContactGroup.DisplayName = contactGroupDisplayName;
        newContactGroup.Members.Add(new GroupMember("user1@contoso.com"));
        newContactGroup.Members.Add(new GroupMember("user2@contoso.com"));
        newContactGroup.Save();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
static void Main(字符串[]args)
{
尝试
{
var domain=“mydomain.com”;
var email=“服务_account@mydomain.com";
var accountPassword=“Password1”;
var emailToImpersonify=“frank_underwood@mydomain.com";
var contactGroupDisplayName=“MySuperAmazingContactGroup”;
ExchangeService服务=新的ExchangeService(ExchangeVersion.Exchange2013);
service.Credentials=新的网络凭据(电子邮件、帐户密码、域);
自动发现URL(电子邮件、重定向URL验证回调);
//确保帐户[服务]正常_account@mydomain.com]是ApplicationImpersonation管理员角色的成员。
service.ImpersonatedUserId=新的ImpersonatedUserId(ConnectingIdType.SmtpAddress,emailToImpersonify);
//在创建ContactGroup之前,请检查并删除任何预先存在的ContactGroup
SearchFilter sfSearch=newsearchfilter.IsEqualTo(ContactGroupSchema.DisplayName,contactGroupDisplayName);
FindItemsResults=service.FindItems(WellKnownFolderName.Contacts,sfSearch,new ItemView(int.MaxValue));
如果(结果!=null)
{
foreach(结果中的项目)
item.Delete(DeleteMode.HardDelete);
}
//创建包含几个成员的新联系人组
ContactGroup newContactGroup=新联系人组(服务);
newContactGroup.DisplayName=contactGroupDisplayName;
newContactGroup.Members.Add(新组成员(“user1@contoso.com"));
newContactGroup.Members.Add(新组成员(“user2@contoso.com"));
newContactGroup.Save();
}
捕获(例外情况除外)
{
掷骰子;
}
}

如果有人在乎,这里是最终结果

static void Main(string[] args)
{
    try
    {
        var domain = "mydomain.com";
        var email = "service_account@mydomain.com";
        var accountPassword = "Password1";
        var emailToImpersonify = "frank_underwood@mydomain.com";
        var contactGroupDisplayName = "MySuperAmazingContactGroup";

        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
        service.Credentials = new NetworkCredential(email, accountPassword, domain);
        service.AutodiscoverUrl(email, RedirectionUrlValidationCallback);

        // Make sure the account [service_account@mydomain.com] is a member of the ApplicationImpersonation admin role. 
        service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, emailToImpersonify);

        // Prior to creating the ContactGroup, check and delete any pre-existing ContactGroup
        SearchFilter sfSearch = new SearchFilter.IsEqualTo(ContactGroupSchema.DisplayName, contactGroupDisplayName);
        FindItemsResults<Item> results = service.FindItems(WellKnownFolderName.Contacts, sfSearch, new ItemView(int.MaxValue));
        if (results != null)
        {
            foreach (Item item in results)
                item.Delete(DeleteMode.HardDelete);
        }

        // Create the new ContactGroup with a few members
        ContactGroup newContactGroup = new ContactGroup(service);
        newContactGroup.DisplayName = contactGroupDisplayName;
        newContactGroup.Members.Add(new GroupMember("user1@contoso.com"));
        newContactGroup.Members.Add(new GroupMember("user2@contoso.com"));
        newContactGroup.Save();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
static void Main(字符串[]args)
{
尝试
{
var domain=“mydomain.com”;
var email=“服务_account@mydomain.com";
var accountPassword=“Password1”;
var emailToImpersonify=“frank_underwood@mydomain.com";
var contactGroupDisplayName=“MySuperAmazingContactGroup”;
ExchangeService服务=新的ExchangeService(ExchangeVersion.Exchange2013);
service.Credentials=新的网络凭据(电子邮件、帐户密码、域);
自动发现URL(电子邮件、重定向URL验证回调);
//确保帐户[服务]正常_account@mydomain.com]是ApplicationImpersonation管理员角色的成员。
service.ImpersonatedUserId=新的ImpersonatedUserId(ConnectingIdType.SmtpAddress,emailToImpersonify);
//在创建ContactGroup之前,请检查并删除任何预先存在的联系人