如何在托管Exchange上使用EWS进行模拟?

时间:2014-12-23 16:35:05

标签: c# impersonation exchangewebservices

我想创建一个服务,通过EWS抓取托管Exchange服务器(“myclient.onmicrosoft.com”)上所有用户的所有收件箱。

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

注意:当我直接使用凭据并且模拟方式适用于内部部署安装时,它可以正常工作。

到目前为止我做了什么(我想知道这是正确的方法):在我们的内部部署服务器上,我创建了一个域“myclient.onmicrosoft.com”,就像托管服务器和AD用户一样使用与托管交换机相同的名称和密码(称为“mytest@myclient.onmicrosoft.com”)。

在我的抓取工具上,我做了:

  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!
    
  3. 我缺少什么想法?

1 个答案:

答案 0 :(得分:1)

您需要使用" god-mode"的凭据。 user,但将ImpersonatedUserId设置为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