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

Office365 API - 管理员访问其他用户/会议室的日历事件

薛英卫
2023-03-14

通过点击此请求:https://outlook.office365.com/api/v1.0/users/room@email.com/events 浏览器中,我可以输入我的管理员用户名和密码并获取该特定房间的日历事件。但是,当我尝试从经过管理员身份验证的本机应用程序进行此调用时,我收到此响应:reason=“调用应访问 oauth 令牌中指定的邮箱。error_category=“invalid_grant” 如何获取以管理员身份验证的特定聊天室的日历事件?

共有2个答案

杜成和
2023-03-14

这个小小的PLUG-N-COMPILE-RUN(呜呜!)Java类应该演示如何获取会议室资源用户的活动日历。Azure V2.0 REST API当前不允许这样做。确保对Exchange服务进行身份验证的身份验证用户是要检索其事件的会议室资源用户日历的“代理”。您的Exchange/Office365管理员可能需要为您设置。我在这里抓取了JavaEWSAPI:/maven2/com/microsoft/EWS-Java-API/EWS-Java API/2.0/EWS-Java-API-2.0.jar和javadoc的索引。这是一个很好的参考。如果您转到Github repo,还可以使用Maven、Gradle或其他方法将API集成到代码中:https://github.com/OfficeDev/ews-java-api.《入门指南》是……嗯……我没法说(有充分的理由)。这么说吧,你最好使用一下你的搜索引擎,以便弄清楚如何做其他事情!浏览Javadoc中的类对我帮助很大。够了,废话废话……关于代码:(哦,我包括了所有的导入!我总是讨厌当我得到一段代码样本时,我不得不去寻找和搜索导入。不过,我还是让你去连接实际的库吧!如果你能做到这一步,你就不会再穿代码尿布了!;-)

package com.on.and.play

import java.net.URI;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.text.DateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.text.SimpleDateFormat

import microsoft.exchange.webservices.data.core.service.item.Appointment;
import microsoft.exchange.webservices.data.core.service.schema.AppointmentSchema;
import microsoft.exchange.webservices.data.core.service.folder.CalendarFolder;
import microsoft.exchange.webservices.data.search.CalendarView;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.search.FindItemsResults;
import microsoft.exchange.webservices.data.property.complex.FolderId;
import microsoft.exchange.webservices.data.search.FolderView
import microsoft.exchange.webservices.data.core.service.schema.FolderSchema
import microsoft.exchange.webservices.data.search.FindFoldersResults
import microsoft.exchange.webservices.data.search.filter.SearchFilter
import microsoft.exchange.webservices.data.core.enumeration.search.FolderTraversal
import microsoft.exchange.webservices.data.core.service.item.Item;
import microsoft.exchange.webservices.data.core.service.schema.ItemSchema;
import microsoft.exchange.webservices.data.property.complex.Mailbox
import microsoft.exchange.webservices.data.search.ItemView;
import microsoft.exchange.webservices.data.core.PropertySet;
import microsoft.exchange.webservices.data.property.definition.PropertyDefinition
import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
import microsoft.exchange.webservices.data.core.enumeration.property.BasePropertySet;
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException
import java.net.URI;

class MyTestService {
  public List getRoomCalendar() {       
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
    // replace somebodyreal@somewhere.com with a real email address that is
    // a delegate of ConferenceRoom@somewhere.com. Your exchange admin may  
    // need to set that up for you. 
    ExchangeCredentials credentials 
        = new WebCredentials("somebodyreal@somewhere.com",
                             "their_plain_text_password_God_bless_Microsoft");
    service.setCredentials(credentials);
    service.setUrl(new URI("https://outlook.office365.com/EWS/Exchange.asmx"));
    // service.autodiscoverUrl("toddp@touchsource.com", );
    FolderView fv = new FolderView(100);
    fv.setTraversal(FolderTraversal.Deep);
    // replace ConferenceRoom@somewhere.com with your resource's email address 
    FolderId confRoomFolderId = new FolderId(WellKnownFolderName.Calendar, 
                                             new Mailbox("ConferenceRoom@somewhere.com"));
    List apntmtDataList = new ArrayList();          
    Calendar now = Calendar.getInstance();
    Date startDate = Calendar.getInstance().getTime();
    now.add(Calendar.DATE, 30);
    Date endDate = now.getTime();
    try {
      CalendarFolder calendarFolder = CalendarFolder.bind(service, confRoomFolderId);
      CalendarView cView = new CalendarView(startDate, endDate, 5);
      cView.setPropertySet(new PropertySet(AppointmentSchema.Subject, 
                                           AppointmentSchema.Start,
                                           AppointmentSchema.End));
      // we can set other properties as well depending upon our need.
      FindItemsResults appointments = calendarFolder.findAppointments(cView);
      List<Appointment> appList = appointments.getItems();
      for (Appointment appointment : appList) {
        Map appointmentData = new HashMap();
        appointmentData = readAppointment(appointment);
        apntmtDataList.add(appointmentData);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    return apntmtDataList;
  } 

  public Map readAppointment(Appointment appointment) {
    Map appointmentData = new HashMap();
    try {
      DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
      appointmentData.put("appointmentItemId", appointment.getId().toString());
      appointmentData.put("appointmentSubject", appointment.getSubject());
      appointmentData.put("appointmentStartTime", df.format(appointment.getStart()));
      appointmentData.put("appointmentEndTime", df.format(appointment.getEnd()));
    } catch (ServiceLocalException e) {
      e.printStackTrace();
    }       
    return appointmentData;
  }
}
仉成益
2023-03-14

目前,我们只允许访问属于认证用户的邮件、日历和联系人。所以,你的场景是一个管理员访问conf。目前不支持房间日历。访问属于其他用户的资源,例如conf。房间日历在我们的支持路线图中,但我们还没有时间表与您分享。

同时,您有两种选择。

选项1:如果您能够在服务器上运行应用程序,您可以构建一个需要管理员同意的服务应用程序,但被授权访问Office 365租户中的任何邮箱。您将需要让您的本机应用程序与服务器上运行的应用程序进行对话。更多细节请看这个博客。

选项#2:您可以使用我们的Exchange Web Services SOAP API来实现您的方案。有关此选项和相关链接的更多详细信息,请参阅Office 365共享日历。

 类似资料:
  • 使用Office 365 API,我们希望允许用户查看会议室日历,并根据他们在Office 365中的权限为活动预订它们。 我理解,使用服务应用程序可以获得管理员的同意,但这并不是我们所有的用例都可以做到的。我们需要使用用户的实际权限,而不是在后台使用管理员的权限来绕过它们。 我还根据这个问题和这个问题了解到,使用以前的Office 365 API是不可能的。 我的问题是现在是否可以使用新的 MS

  • 我正在从V2-V3迁移谷歌日历API的过程中。我需要更新另一个用户日历列表。在V2中,通过重写OAuth令牌上的requestor_id字段,这是可能的。但是现在我也在使用OAuth2,这个技术不起作用了。 列出日历列表的请求是: 使用Calendar API V3可以实现此功能吗?

  • 我们正在尝试使用EWS管理的应用编程接口集成办公365。我们使用办公365管理中心创建了一个具有模拟角色的服务号。现在,我们如何使用该服务号访问应用程序中其他用户的数据(如邮件、联系人、日历)?谢谢,罗希特

  • 我所在的学校从2009年初开始运行谷歌教育应用程序。我负责创建、删除、修改等。学生电子邮件账户。我已经将我所有现有的C#应用程序从GData转换到新的管理SDK——生活很好。 上周,其中一个系向大约800名学生发送了一封包含错误的电子邮件。我被问到是否有可能创建一个快速应用程序,能够删除800名学生收件箱中的电子邮件。 使用我的“超级管理”域帐户,我能够使用Gmail应用编程接口创建一个应用程序,

  • 我正在使用Office 365 REST api访问我的帐户日历。我想访问我的帐户可以访问的所有日历,特别是出现在我的Office 365界面的“其他日历”部分中的会议室日历。 目前,如果我查询“https://outlook.office365.com/api/v1.0/me/calendars”终结点,则我只获取我拥有的日历,而不是会议室日历。 关于如何获取它们的任何线索(通过Office 3

  • 我正在使用谷歌日历(v3)API,与谷歌应用程序,并希望使用一个单一的oauth2凭据来确定用户在任何给定的点上空闲/忙碌。