我是使用EWS托管API的新手。
以下是我面临的EWS API问题: EWS API - 模拟更新由服务帐户以外的任何其他用户创建的日历项,引发错误“访问被拒绝。检查凭据,然后重试。”
详细说明: 1.我正在使用服务帐户,例如abc@xyz.onmicrosoft.com。此用户是全局管理员,还分配了ApplicationImpersonation角色。 (登录在线Office 365帐户 - >管理员 - >选择“交换”标签 - >选择左侧面板上的权限 - >创建模拟角色 - >在角色中分配ApplicationImpersonation:和abc@xyz.onmicrosoft。在会员中: - >点击保存)
由其他用户创建日历项目,例如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 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);
}
}
这里有什么问题?最初我认为它可能是一个限制政策,在当天制定某些API调用限制后停止同一用户,但我今天仍然看到这个问题。
感谢任何帮助。
由于
答案 0 :(得分:0)
找到解决方案:
仅将模拟ID添加到现有服务实例不起作用。您还需要重新验证自动发现网址。
答案 1 :(得分:0)
我正在调查“假冒+日历”问题,并找到了该论坛帖子。
我确定您的问题出在您尝试获取然后更新日历项(约会)的方式上。
您正在使用凭据获取日历项(邮箱A)。然后,在下一行
Impersonate(masterItem.Organizer.Address.ToString());
您正在指示Ews Service对象充当模拟身份(邮箱B的凭据)。
由于您已经从邮箱A中获取了约会,并且现在尝试使用邮箱B的凭据在邮箱A中更新该约会,因此如果邮箱B在邮箱A日历上没有权限,则IMHO无法正常工作。
因此,实际上,您实际上是在尝试使用邮箱B的模拟凭据来更新邮箱A的日历项目,并且由于邮箱B对邮箱A凭据没有权限,因此发生了“访问被拒绝”错误。
希望这也可以帮助其他人。 谢谢