C# 交换EWS获取房间日历

C# 交换EWS获取房间日历,c#,calendar,exchangewebservices,C#,Calendar,Exchangewebservices,我试图获取特定会议室的所有会议,也许我走错了路,但到目前为止,最有希望的结果是当我模拟会议室,然后获取日历视图时产生的-问题是,对于每个日历条目,主题包含用户的名称,而不是实际的会议主题。例如,主题数据成员不包含“预算会议”,而是包含“Bob Smith” 是否有更好的方法获取特定房间的日历条目列表?这是我的密码: ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1); service.Cr

我试图获取特定会议室的所有会议,也许我走错了路,但到目前为止,最有希望的结果是当我模拟会议室,然后获取日历视图时产生的-问题是,对于每个日历条目,主题包含用户的名称,而不是实际的会议主题。例如,主题数据成员不包含“预算会议”,而是包含“Bob Smith”

是否有更好的方法获取特定房间的日历条目列表?这是我的密码:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
service.Credentials = new WebCredentials("bobsled@yourdomain.onmicrosoft.com", "password");
service.AutodiscoverUrl("bobsmith@yourdomain.com", RedirectionUrlValidationCallback);
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "sanfrancisco@yourdomain.onmicrosoft.com");

DateTime startDate = DateTime.Now;
DateTime endDate = startDate.AddDays(30);
const int NUM_APPTS = 5;

CalendarFolder calendar = CalendarFolder.Bind(service, WellKnownFolderName.Calendar, new PropertySet());
CalendarView cView = new CalendarView(startDate, endDate, NUM_APPTS);
cView.PropertySet = new PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End);
FindItemsResults<Appointment> appointments = calendar.FindAppointments(cView);

foreach (Appointment a in appointments)
{
    Console.Write("Subject: " + a.Subject.ToString() + " ");
    Console.Write("Start: " + a.Start.ToString() + " ");
    Console.Write("End: " + a.End.ToString());
    Console.WriteLine();
}
ExchangeService服务=新的ExchangeService(ExchangeVersion.Exchange2010\u SP1);
service.Credentials=新的WebCredentials(“bobsled@yourdomain.onmicrosoft.com“,”密码“);
服务。自动发现URL(“bobsmith@yourdomain.com,重定向UrlValidationCallback);
service.ImpersonatedUserId=新的ImpersonatedUserId(ConnectingIdType.SmtpAddress,“sanfrancisco@yourdomain.onmicrosoft.com");
DateTime startDate=DateTime.Now;
DateTime endDate=开始日期。添加日期(30);
常量int NUM_APPTS=5;
CalendarFolder calendar=CalendarFolder.Bind(服务,WellKnownFolderName.calendar,新属性集());
CalendarView cView=新的CalendarView(开始日期、结束日期、数值应用);
cView.PropertySet=newpropertyset(appointschema.Subject,appointschema.Start,appointschema.End);
FindItemsResults约会=calendar.FindAppoints(cView);
foreach(预约中的预约)
{
Console.Write(“Subject:+a.Subject.ToString()+”);
编写(“Start:+a.Start.ToString()+”);
Console.Write(“End:+a.End.ToString());
Console.WriteLine();
}

如果您想尝试另一种方法,您可以获得所有约会,然后根据位置进行筛选:

ExchangeServices.ExchangeService exchangeService = connectToServiceWhatever(userInfo); // have working service
var folderView = new ExchangeServices.FolderView(100);   // or something like 100, idunno
folderView.Traversal = ExchangeServices.FolderTraversal.Deep;
folderView.PropertySet = new ExchangeServices.PropertySet(ExchangeServices.FolderSchema.FolderClass,
                ExchangeServices.FolderSchema.DisplayName, ExchangeServices.FolderSchema.TotalCount,
                ExchangeServices.FolderSchema.ParentFolderId);   // ... and/or whatever else you want to get - folderclass is important though. 
ExchangeServices.FindFoldersResults folders = exchangeService.FindFolders(ExchangeServices.WellKnownFolderName.MsgFolderRoot, folderView);
现在,您只需按文件夹类型进行筛选,获取所有项目,然后按文件室进行筛选:

var appointments = folders.Where(f => f.FolderClass == "IPF.Appointment").SelectMany(f => exchangeService.FindItems(f.Id, new ExchangeServices.ItemView(folder.TotalCount < 5 ? folder.TotalCount : 5)).Where(a => a.Location == "Boardroom");  // or whatever room you want. 
var appointments=folders.Where(f=>f.FolderClass==“IPF.Appointment”)。选择many(f=>exchangeService.FindItems(f.Id,new ExchangeServices.ItemView(folder.TotalCount<5?folder.TotalCount:5))。其中(a=>a.Location==“董事会会议室”);//或您想要的任何房间。
这可能不是可以复制的,因为我现在刚把它打印出来,但我希望它足以让人理解这个想法。你最终会在你的这一方面做更多的工作,但希望你最终也能够检查约会。主题,约会。开始|结束。ToUniversalTime()等

以下是工作代码:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
service.Credentials = new WebCredentials("bobsmith@yourdomain.onmicrosoft.com", "password");
service.AutodiscoverUrl("bobsmith@yourdomain.onmicrosoft.com", RedirectionUrlValidationCallback);

var folderView = new FolderView(100);   // or something like 100, idunno
folderView.Traversal = FolderTraversal.Deep;
folderView.PropertySet = new PropertySet(FolderSchema.FolderClass,FolderSchema.DisplayName, FolderSchema.TotalCount,FolderSchema.ParentFolderId);   // ... and/or whatever else you want to get - folderclass is important though. 

FindFoldersResults folders = service.FindFolders(WellKnownFolderName.MsgFolderRoot, folderView);
// Process each item.
foreach (Folder myFolder in folders.Folders)
{
    if (myFolder is CalendarFolder)
    {
        var calendar = (myFolder as CalendarFolder);
        // Initialize values for the start and end times, and the number of appointments to retrieve.
        DateTime startDate = DateTime.Now;
        DateTime endDate = startDate.AddDays(30);
        const int NUM_APPTS = 15;
        // Set the start and end time and number of appointments to retrieve.
        CalendarView cView = new CalendarView(startDate, endDate, NUM_APPTS);
        // Limit the properties returned to the appointment's subject, start time, and end time.
        cView.PropertySet = new PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End);
        // Retrieve a collection of appointments by using the calendar view.
        FindItemsResults<Appointment> appointments = calendar.FindAppointments(cView);
        foreach (Appointment a in appointments)
        {
            Console.Write("Subject: " + a.Subject.ToString() + " ");
            Console.Write("Start: " + a.Start.ToString() + " ");
            Console.Write("End: " + a.End.ToString());
            Console.WriteLine();
        }
    }
}
ExchangeService服务=新的ExchangeService(ExchangeVersion.Exchange2010\u SP1);
service.Credentials=新的WebCredentials(“bobsmith@yourdomain.onmicrosoft.com“,”密码“);
服务。自动发现URL(“bobsmith@yourdomain.onmicrosoft.com,重定向UrlValidationCallback);
var folderView=new folderView(100);//或类似于100的值,idunno
folderView.Traversal=FolderTraversal.Deep;
folderView.PropertySet=新的PropertySet(FolderSchema.FolderClass,FolderSchema.DisplayName,FolderSchema.TotalCount,FolderSchema.ParentFolderId);//…和/或您想要得到的任何东西-FolderClass很重要。
FindFoldersResults folders=service.FindFolders(WellKnownFolderName.MsgFolderRoot,folderView);
//处理每个项目。
foreach(文件夹中的文件夹myFolder.folders)
{
如果(myFolder是CalendarFolder)
{
var calendar=(myFolder作为CalendarFolder);
//初始化开始和结束时间以及要检索的约会数的值。
DateTime startDate=DateTime.Now;
DateTime endDate=开始日期。添加日期(30);
常数int NUM_APPTS=15;
//设置要检索的开始和结束时间以及约会数。
CalendarView cView=新的CalendarView(开始日期、结束日期、数值应用);
//限制返回到约会主题、开始时间和结束时间的属性。
cView.PropertySet=newpropertyset(appointschema.Subject,appointschema.Start,appointschema.End);
//使用日历视图检索约会集合。
FindItemsResults约会=calendar.FindAppoints(cView);
foreach(预约中的预约)
{
Console.Write(“Subject:+a.Subject.ToString()+”);
编写(“Start:+a.Start.ToString()+”);
Console.Write(“End:+a.End.ToString());
Console.WriteLine();
}
}
}

默认情况下,在将约会发送到会议室资源时,Exchange会将主题替换为组织者的名称。这可以通过Exchange管理控制台使用以下命令禁用,以保留主题

Set-CalendarProcessing -Identity <RESOURCEMAILBOX> -DeleteSubject $False -AddOrganizerToSubject $False
Set CalendarProcessing-Identity-DeleteSubject$False-AddOrganizerToSubject$False

参考资料:

Genius,太棒了,谢谢!我不得不修复代码中的一些调用,但最终它成功了哈哈,是的,对不起,我已经有一段时间没有使用这些东西了,其中一些内容刚刚脱离内存。如果你想对错误的答案进行编辑,那将非常酷。你不能直接抓取日历文件夹吗使用众所周知的名称?FolderId calendarFolderId=new FolderId(WellKnownFolderName.Calendar,mailboxToAccess);FindItemsResults findResults=Service.FindApoints(calendarFolderId,calendarView);另一个答案对我不起作用,使用了OP提到的方法