我想创建一个服务,通过EWS抓取托管Exchange服务器(“myclient.onmicrosoft.com”)上所有用户的所有收件箱。
当我连接到同一域中的本地交换服务器时,这已经很好用了。但是当我尝试将此服务连接到托管交换机时,它会抛出401(错误的授权)错误。当然,这是一个与托管交换服务器不同的域。 我的服务在内部部署服务器上运行,并使用“上帝模式”用户对所有活动目录用户进行非个性化操作。我的问题是:如何将我的内部部署系统的用户正确连接到不同域中的托管交换机?
注意:当我直接使用凭据并且模拟方式适用于内部部署安装时,它可以正常工作。
到目前为止我做了什么(我想知道这是正确的方法):在我们的内部部署服务器上,我创建了一个域“myclient.onmicrosoft.com”,就像托管服务器和AD用户一样使用与托管交换机相同的名称和密码(称为“mytest@myclient.onmicrosoft.com”)。
在我的抓取工具上,我做了:
我在我们的内部部署服务器上获得了所有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"];
}
然后,对于每个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!
我缺少什么想法?
答案 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
。