EWS API日历 - 模拟更新引发错误"访问被拒绝。检查凭据,然后重试。"

时间:2014-05-09 19:31:28

标签: calendar exchangewebservices ews-managed-api

我是使用EWS托管API的新手。

以下是我面临的EWS API问题: EWS API - 模拟更新由服务帐户以外的任何其他用户创建的日历项,引发错误“访问被拒绝。检查凭据,然后重试。”

详细说明: 1.我正在使用服务帐户,例如abc@xyz.onmicrosoft.com。此用户是全局管理员,还分配了ApplicationImpersonation角色。 (登录在线Office 365帐户 - >管理员 - >选择“交换”标签 - >选择左侧面板上的权限 - >创建模拟角色 - >在角色中分配ApplicationImpersonation:和abc@xyz.onmicrosoft。在会员中: - >点击保存)

  1. 由其他用户创建日历项目,例如pqr@xyz.onmicrosoft.com,并邀请与会者 - abc@xyz.onmicrosoft.com。

  2. 在c#程序中,我使用服务帐户连接到EWS服务 - abc@xyz.onmicrosoft.com,获取其日历事件。如果活动的组织者是其他用户--pqr@xyz.onmicrosoft.com,那么我会通过以下方式使用模拟来更新日历事件/项目属性 - 主题,正文等。

    private static void Impersonate(string organizer)
    {
        string impersonatedUserSMTPAddress = organizer;
        ImpersonatedUserId impersonatedUserId =
            new ImpersonatedUserId(ConnectingIdType.SmtpAddress, impersonatedUserSMTPAddress);
    
        service.ImpersonatedUserId = impersonatedUserId;
    }
    
  3. 到昨天下午工作正常。突然间,它开始抛出异常“访问被拒绝。检查凭据然后再试一次。”每当我尝试更新该事件时。

    private static void FindAndUpdate(ExchangeService服务)     {         CalendarView cv = new CalendarView(DateTime.Now,DateTime.Now.AddDays(30));         cv.MaxItemsReturned = 25;         尝试         {             FindItemsResults masterResults = service.FindItems(WellKnownFolderName.Calendar,cv);

            foreach (Appointment item in masterResults.Items)
            {
                if (item is Appointment)
                {
                    Appointment masterItem = item as Appointment;
                    if (!masterRecurEventIDs.Contains(masterItem.ICalUid.ToString()))
                    {
                        masterItem.Load();
    
                        if (!masterItem.Subject.Contains(" (Updated content)"))
                        {
                            //impersonate organizer to update and save for further use
                            Impersonate(masterItem.Organizer.Address.ToString());
    
                            // Update the subject and body
                            masterItem.Subject = masterItem.Subject + " (Updated content)";
    
                            string currentBodyType = masterItem.Body.BodyType.ToString();
                            masterItem.Body = masterItem.Body.Text + "\nUpdated Body Info: xxxxxxxxxxxx";
    
                            // This results in an UpdateItem operation call to EWS.
                            masterItem.Update(ConflictResolutionMode.AutoResolve);
    
                            // Send updated notification to organizer of an appointment
                            CreateAndSendEmail(masterItem.Organizer.Address.ToString(), masterItem.Subject);
    
                            masterRecurEventIDs.Add(masterItem.ICalUid.ToString());
                        }
                        else
                        {
                            Console.WriteLine("Event is already updated. No need to update again.:\r\n");
                            Console.WriteLine("Subject: " + masterItem.Subject);
                            Console.WriteLine("Description: " + masterItem.Body.Text);
                        }
                    }
    
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
        }
    }
    
  4. 这里有什么问题?最初我认为它可能是一个限制政策,在当天制定某些API调用限制后停止同一用户,但我今天仍然看到这个问题。

  5. 感谢任何帮助。

    由于

2 个答案:

答案 0 :(得分:0)

找到解决方案:

仅将模拟ID添加到现有服务实例不起作用。您还需要重新验证自动发现网址。

答案 1 :(得分:0)

我正在调查“假冒+日历”问题,并找到了该论坛帖子。

我确定您的问题出在您尝试获取然后更新日历项(约会)的方式上。

您正在使用凭据获取日历项(邮箱A)。然后,在下一行

Impersonate(masterItem.Organizer.Address.ToString());

您正在指示Ews Service对象充当模拟身份(邮箱B的凭据)。

由于您已经从邮箱A中获取了约会,并且现在尝试使用邮箱B的凭据在邮箱A中更新该约会,因此如果邮箱B在邮箱A日历上没有权限,则IMHO无法正常工作。

因此,实际上,您实际上是在尝试使用邮箱B的模拟凭据来更新邮箱A的日历项目,并且由于邮箱B对邮箱A凭据没有权限,因此发生了“访问被拒绝”错误。

希望这也可以帮助其他人。 谢谢