0

我有 Windows 服务,它使用EWS 和 Impersonation Access侦听本地 Exchange 邮箱。

我有一个具有模拟访问权限的管理员用户(服务帐户),并且我为我的 Windows 服务登录配置了相同的用户。

在 C#.Net 中使用 NTLM 身份验证来登录和模拟邮箱。当我启动我的 Windows 服务并尝试模拟邮箱时,即使我对我的服务帐户具有模拟访问权限,我也会收到以下错误。

“Error While initial sync for mailbox SCHEDTEST91@SCHED2010.COM. Exception: Microsoft.Exchange.WebServices.Data.ServiceResponseException: The account does not have permission to impersonate the requested user.
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ProcessWebException(WebException webException)
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request)
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(IEwsHttpWebRequest& request)
   at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
   at SXA.ES.EWSNotificationListenerService.NotificationListener.NotificationSynchronizerBase.GetCurrentSyncState(String smtpAddress, String autodiscoverUrl)”

令人惊讶的是,这个问题发生在托管我的 Windows 服务的特定虚拟机上。

我总共有 4 台虚拟机和 4 台虚拟机,Windows 服务工作正常并且能够模拟 2 台虚拟机上的邮箱,但是使用相同的配置和相同的设置,其他 2 台出现上述错误。

这是我创建 OnPremise Exchange 服务的代码:

public ExchangeService CreateOnPremiseExchangeService(ExchangeServiceProperties properties)
        {
            var exchangeService = CreateExchangeService(properties);

            exchangeService.UseDefaultCredentials = true;

            return exchangeService;
        }

private static ExchangeService CreateExchangeService(ExchangeServiceProperties properties)
        {
            var exchangeService = new ExchangeService(properties.ExchangeVersion)
            {
                Url = properties.ExchangeUri,
                ReturnClientRequestId = true,
                SendClientLatencies = true,
                UserAgent = properties.UserAgent
            };

            if (properties.TraceListener != null)
            {
                exchangeService.TraceListener = properties.TraceListener;
                exchangeService.TraceFlags = TraceFlags.All;
                exchangeService.TraceEnabled = true;
            }

            if (!string.IsNullOrWhiteSpace(properties.TargetMailbox))
            {
                exchangeService.ImpersonatedUserId = new ImpersonatedUserId(
                    ConnectingIdType.SmtpAddress,
                    properties.TargetMailbox);
            }

            return exchangeService;
        }

我试着在谷歌上搜索了很多关于这个问题的信息,但找不到任何帖子。

我在这里寻求帮助来解决这个问题。如果有人在使用 C#.Net 使用 EWS 服务时遇到同样的问题,请告诉我,并为此提供解决方案。

注意:如果我在这里使用基本身份验证,那么它在这 2 个虚拟机上也可以正常工作,这个问题仅在 NTLM Windows 身份验证中发生。

4

1 回答 1

0

我已进一步调查并找到了此问题的根本原因,请参阅下面的详细信息以及如何解决该问题。

  1. 实际上,我已经在遇到问题的 VM 上安装了 Outlook 并配置了电子邮件帐户(没有模拟访问权限的用户电子邮件帐户),在电子邮件帐户配置后立即重新启动 Outlook 时,它会提示对话框输入凭据,我已经输入了用户名称和密码以及我已经选中“记住我的凭据”复选框,然后单击确定。
  2. 现在,如果您转到Control Panel\User Accounts\Credential Manager,您将在 Windows Credentials 部分看到两个条目,一个用于 Exchange Server 网络地址 ( ABCEXCHANGESERVER.DOMAIN.COM ),其用户名与您在 Outlook 中配置的用户名相同以及与 Windows 身份相同的用户名的另一个单独条目。
  3. 当我从Control Panel\User Accounts\Credential Manager中删除 Exchange Server 网络地址 ( ABCEXCHANGESERVER.DOMAIN.COM ) 条目时,这个问题得到了解决。
  4. 据我了解,ABCEXCHANGESERVER.DOMAIN.COM在我们的例子中是交换服务器域/网络地址,在访问邮箱时被EWSOutlook使用。因此,当我们在 Outlook 和凭据对话框中配置邮箱时,如果我们选中“记住我的凭据”复选框,它会缓存对ABCEXCHANGESERVER.DOMAIN.COM的 Exchange 调用以及凭据管理器中的邮箱配置文件的凭据。现在,当我们的服务尝试使用NTLM调用ABCEXCHANGESERVER.DOMAIN.COM时,它首先检查ABCEXCHANGESERVER.DOMAIN.COM的凭据缓存网络/域地址,如果在那里找到任何条目,它总是使用缓存的凭据而不是我们的服务登录凭据。
  5. 如果有人遇到同样的问题,只需从Control Panel\User Accounts\Credential Manager清除 Exchange Server 网络地址条目,这个问题就会得到解决。

我的建议是,避免在 VM 上配置 Outlook。这将如何帮助。

于 2018-10-05T19:45:19.970 回答