Getting error: "The account does not have permission to impersonate the requested user" even though i have impersonation access

Getting error: "The account does not have permission to impersonate the requested user" even though i have impersonation access

我有 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 服务工作正常并且能够在 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 上搜索了很多关于这个问题,但找不到任何 post。

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

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

我已经进一步调查并找到了这个问题的根本原因,请参阅下面的详细信息以及如何修复它。

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

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