使用 Microsoft 的 EWS 创建在线 Lync/Skype 会议

Using Microsoft's EWS to create online Lync/Skype meeting

有人知道如何使用 EWS 创建在线会议 (Lync/Skype) 的会议请求吗?

所以我的方法是首先通过 Outlook 创建一个在线定期会议,然后使用相同的 属性.

模拟事件的创建

这是我用于召开会议的代码片段(calendarView 已经用开始日期、结束日期等进行了初始化):

ExtendedPropertyDefinition extendedOnlineMeetingProperty =
                new ExtendedPropertyDefinition(new Guid("{00062008-0000-0000-c000-000000000046}"), 34112,
                    MapiPropertyType.Integer);

var properties = new PropertySet(
            ItemSchema.Id,
            AppointmentSchema.ICalUid,
            ItemSchema.Subject,
            AppointmentSchema.Start,
            AppointmentSchema.End,
            AppointmentSchema.Organizer,
            AppointmentSchema.Location,
            AppointmentSchema.LegacyFreeBusyStatus,
            AppointmentSchema.IsCancelled,
            AppointmentSchema.ICalRecurrenceId,
            AppointmentSchema.MyResponseType, // Mandatory Meeting.MyResponseType can be retrieved without a search in the participant list
            ItemSchema.LastModifiedTime,
            AppointmentSchema.IsOnlineMeeting,
            AppointmentSchema.IsMeeting,
            ItemSchema.DisplayTo) { };

 properties.Add(extendedOnlineMeetingProperty);


var activeResults = service.FindAppointments(WellKnownFolderName.Calendar, calendarView).ToList();
    if (activeResults.Count > 0)
    {
        service.LoadPropertiesForItems(activeResults, properties);
    }

我得到了 属性 IsOnlineMeeting 和正确的 bool 值(测试 - 在变量 activeResults 中创建了与 Outlook 的在线和定期会议),但我不知道从哪里获得会议 link 和加入会议所需的其他 Lync/Skype 属性。

我也不确定在哪里以及如何分配 Lync/Skype 会议 URL 和其他属性的值。

有时我问自己是否值得开发一些基于 MS 产品的应用程序,因为他们的文档很糟糕。

在骂了MS一个星期后,我找到了解决办法。使用 MFCMAPI 工具,您可以检查邮箱中的项目 属性 及其值。

  1. 下载程序link
  2. 构建并运行它
  3. Session - 登录 - 选择您的邮件配置文件 - 选择邮箱并双击
  4. 操作-打开特殊文件夹-日历-双击日历
  5. 在线打开项目S4B/Lync 会议
  6. UC* 属性正是我要找的。

如果你打开 属性 你可以在顶部看到这样的东西:

ag: 0x8096001E
Type: PT_STRING8
DASL: http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/UCMeetingSetting
Named Prop Name: UCMeetingSetting
Named Prop Guid: {00020329-0000-0000-C000-000000000046} = PS_PUBLIC_STRINGS

所以我对扩展 属性 的定义是错误的。它不仅是一个 属性,实际上你需要全部 7 个。

所以定义应该是:

private static ExtendedPropertyDefinition CreateOnlineMeetingProperty()
        {
            ExtendedPropertyDefinition extendedUCMeetingSetting =
                new ExtendedPropertyDefinition(new Guid("{00020329-0000-0000-C000-000000000046}"), "UCMeetingSetting",
                    MapiPropertyType.String);

            return extendedUCMeetingSetting;
        }

通过正确的扩展定义,您可以轻松地从项目中获取值。

  1. 正在访问 ExtendedPropertiesValue
  2. 呼叫TryGetProperty
var activeResults = service.FindAppointments(new
FolderId(WellKnownFolderName.Calendar, resource.Email),calendarView).ToList();

service.LoadPropertiesForItems(activeResults, properties);

foreach (Appointment result in activeResults)
{
// 1.
var b = result.ExtendedProperties[1].Value;
// 2.
string UCMeetingSetting;
result.TryGetProperty(extendedUCMeetingSetting, out UCMeetingSetting);
}

使用上述步骤,您可以获得所需的任何扩展 属性,而不仅仅是统一通信 (UC) 属性。

好的,我通过设置一个扩展属性成功地(几乎!)完成了这项工作:

appointment.SetExtendedProperty(
                new ExtendedPropertyDefinition(
                    new Guid("00020329-0000-0000-C000-000000000046"),
                    "OnlineMeetingExternalLink",
                    MapiPropertyType.String
                    ),
                skypeMeeting.JoinUrl
                );

我说几乎是因为当你在 Outlook 中打开它时,约会看起来并不完全像 Skype 会议:没有页脚将加入 link 和 phone 号码等。 也许还有其他差异,但目前我们在 Skype for business 中看到它带有加入按钮,我们还在 Outlook 提醒中看到它带有加入按钮。 作为解决方法,我们必须 hard-code 约会的正文内容。 还有会议 ID,可以使用 UCWA 2.0 (https://docs.microsoft.com/en-us/skype-sdk/ucwa/myonlinemeetings_ref)

我们使用 UCWA 2.0 创建了 Skype 电话会议并将其附加到 EWS 约会 object。