如何在具有模拟的托管 Exchange 上使用 EWS

本文关键字:Exchange EWS 模拟 | 更新日期: 2023-09-27 18:35:11

我想创建一个服务,通过EWS对托管交换服务器("myclient.onmicrosoft.com")上所有用户的所有收件箱进行爬网。

当我连接到同一域中的本地交换服务器时,这已经很有效了。但是当我尝试将此服务连接到托管交易所时,它会抛出 401(错误的授权)错误。当然,这是一个与托管交换服务器不同的域。我的服务在本地服务器上运行,并使用"上帝模式"用户对所有活动目录用户进行非个性化设置。我的问题是:如何将我的本地系统的用户正确连接到不同域中的托管交易所?

注意:当我直接使用凭据并且模拟方式适用于本地安装时,它有效。

到目前为止,我所做的(我想知道这是正确的方法):在我们的本地服务器上,我创建了一个域"myclient.onmicrosoft.com",就像在托管服务器上一样,以及一个与托管交易所(称为"mytest@myclient.onmicrosoft.com")具有相同名称和密码的 AD 用户。

在我的爬虫服务上,我做到了:

  1. 我让所有 AD 用户都在我们的本地服务器中

    var allUsers = SearchAllActiveDirectoryUsers();
          foreach (DataRow user in allUsers.Rows)
          {
                    String domainName = (String)user["DomainName"];
                    String samAccountName = (String)user["SamAccountName"];
                    String principalName = (String)user["PrincipalName"];
                    String principalDomainName = (String)user["PrincipalDomainName"];
                    String mail = (String)user["Mail"];
            }
    
  2. 然后,对于每个AD用户,我将用户与交换服务连接起来,如下所示:

    ExchangeService ex = new ExchangeService(version);
        ex.Url = new Uri(“https://outlook.office365.com/EWS/Exchange.asmx”);
        ex.Credentials = new WebCredentials("mytest@myclient.onmicrosoft.com", “XXX”, " myclient.onmicrosoft.com"); 
        // THIS DOES WORK CORRECTLY!
        ex.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.PrincipalName, “mytest@myclient.onmicrosoft.com”);
        //this does NOT work!
    

知道我错过了什么吗?

如何在具有模拟的托管 Exchange 上使用 EWS

您需要使用"god-mode"用户的凭据,但将模拟用户 ID 设置为 AD 用户。像这样:

ex.Credentials = new WebCredentials("account_with_impersonation_rights@myclient.onmicrosoft.com", "password");
ex.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.PrincipalName, "mytest@myclient.onmicrosoft.com");

当您通过 EWS 连接到 Office 365 时,您始终需要提供凭据。你不能使用UseDefaultCredentials = true .