当前位置: 首页 > 知识库问答 >
问题:

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

孙项禹
2023-03-14

我不熟悉使用EWS管理的API。

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

详细信息:1.我正在使用服务帐户,例如。abc@xyz.onmicrosoft.com.此用户是全局管理员,并且还分配了ApplicationImpersonation角色。(登录Online Office 365帐户-

>

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

    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;
    }
    

    直到昨天下午,它都在正常工作。突然,它开始抛出一个异常“访问被拒绝。检查凭据,然后重试。”每当我尝试更新该事件时。

    private static void FindAndUpdate(ExchangeService服务){CalendarView cv=new Calendar View(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);
        }
    }
    

    这里会有什么问题呢?最初,我认为这可能是一个限制策略,即在一天内限制某些API调用后停止相同的用户,但我今天仍然看到这个问题。

    感谢任何帮助。

    谢谢。

  • 共有2个答案

    巫欣荣
    2023-03-14

    我正在调查一个模拟日历问题,发现了这个论坛帖子。

    我确信你的问题在于你试图获取并更新日历项目(约会)的方式。

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

    模拟(主项目。组织者。地址。到字符串());

    您正在指示 Ews 服务对象用作模拟标识(邮箱 B 的凭据)。

    因为您已经从邮箱A中获取了约会,现在尝试使用邮箱B的凭据更新邮箱A中的约会,如果邮箱B没有邮箱A日历的权限,这应该是行不通的。

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

    希望这个也能帮到别人谢谢

    汲昊空
    2023-03-14

    找到解决方案:

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

     类似资料:
    • 我尝试按照此权限指南在node.js上使用Microsoft Graph API(https://graph.microsoft.com/v1.0/me/calendarView)访问日历事件,但收到错误响应: 调用是使用 : 请求具有有效令牌和对…/me/via的调用 退货: 因此,我假设这是在我创建了两个应用程序(一个用于节点服务器,一个用于 Web 客户端应用程序)https://manag

    • 我正在尝试用office 365 API构建我的第一个应用程序,但有一个大问题。 我正试图通过Office 365 API和Azure Active Directory获取用户的主要信息,为此我正在做: 1)获取访问令牌。对https://login.windows.net/common/oauth2/token令牌的http post请求: 头:内容类型:应用程序/x-www-表单-乌伦编码 发

    • 我正在尝试将DataStudio报表连接到表和来自BigQuery的视图。在BigQuery中,表从位于我的驱动器中的GoogleSheet接收数据,视图正在查询同一个表,但添加了一些新字段。当我尝试将图表连接到其中一个数据源时,出现以下错误: BigQuery错误:访问被拒绝:BigQuery BigQuery:获取驱动器凭据时权限被拒绝。 原因是什么?我该怎么做才能解决这个问题? 我要说的是,

    • 问题内容: 在某种程度上,当我尝试通过命令行访问MySQL时,已经设法解决了该错误: 我尝试使用此HowTo重置密码,但没有任何运气。 我已经卸载了mysql completley并重新安装了,但是仍然需要输入密码。我不知道为什么会这样! 有人可以帮我获得默认安装的MySQL吗? 环境 Fedora Core 10,完全根访问权限,安装了Apache和PHP 感谢您的任何帮助!! 编辑 对于所有想

    • 我最近才更新到新版本的forge,没有改变我的设置,当我去构建我的应用程序时,我得到了一个错误,说它找不到文件…

    • 这个问题已经问过好几次了,但没有一个解决办法对我有效。我以管理员身份运行DOS命令窗口,但当运行keytool命令安装证书时,我得到了上面的错误: 我在Windows10上使用JDK 1.8.0_191。为什么拒绝对管理员的访问?