出现错误:即使我具有模拟访问权限,“该帐户也没有模拟所请求用户的权限”

时间:2018-09-11 14:56:21

标签: c# .net windows-services exchangewebservices ntlm-authentication

我有Windows服务,该服务使用具有模拟访问权限的EWS 监听本地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 Service可以正常工作,并且可以模拟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;
        }

我尝试在Google上进行大量搜索以查找此问题,但找不到任何帖子。

我正在这里寻求帮助以解决此问题。请让我知道是否有人在使用带有C#.Net的EWS Service时遇到相同的问题,并对此有解决方案。

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

1 个答案:

答案 0 :(得分:0)

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

  1. 实际上,我已在遇到问题的VM上安装了Outlook并配置了电子邮件帐户(没有模拟访问权限的用户电子邮件帐户),在配置电子邮件帐户后立即重新启动Outlook时,会提示输入凭据的对话框,输入了用户名和密码,并同时选中了“记住我的凭据”复选框,然后单击“确定”。
  2. 现在,如果转到控制面板\用户帐户\凭据管理器,您将在Windows凭据部分中看到两个条目,其中一个是Exchange Server网络地址( ABCEXCHANGESERVER.DOMAIN.COM < / strong>),其用户名与您在Outlook中配置的用户名相同,另一个用户名与Windows Identity相同。
  3. 控制面板\用户帐户\凭据管理器中删除Exchange Server网络地址( ABCEXCHANGESERVER.DOMAIN.COM )条目后,此问题已解决。
  4. 据我了解, ABCEXCHANGESERVER.DOMAIN.COM 在我们的情况下是交换服务器域/网络地址,并且被 EWS Outlook 使用访问邮箱时都可以。因此,当我们在Outlook和凭据对话框中配置邮箱时,如果选中“记住我的凭据”复选框,它将为 ABCEXCHANGESERVER.DOMAIN.COM 的Exchange调用以及邮箱配置文件缓存凭据在凭据管理器中。现在,当我们的服务尝试使用 NTLM 调用 ABCEXCHANGESERVER.DOMAIN.COM 时,它首先会检查凭据缓存以查找 ABCEXCHANGESERVER.DOMAIN.COM 的网络/域名地址并且如果在此处找到任何条目,它将始终使用缓存的凭据而不是我们的服务登录凭据。
  5. 如果有人遇到同样的问题,只需从控制面板\用户帐户\凭据管理器中清除Exchange Server网络地址条目,即可解决此问题。

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