我是使用EWS管理的API的新手。
以下是我在使用EWS APIs时面临的问题:EWS API - 冒充更新由服务账户以外的任何其他用户创建的日历项目时,出现错误 "访问被拒绝。检查凭证后再试。"
详情:1.我使用的是一个服务账户,例如:[email protected]。该用户是全局管理员,还分配了ApplicationImpersonation角色。(登录在线Office 365账户->管理->选择 "Exchange "选项卡->选择左侧面板上的权限->创建一个冒充角色->在角色中分配ApplicationImpersonation:和成员中的[email protected]。-> 点击保存)
由其他用户创建一个日历项目,例如:[email protected],并邀请一个与会者 - [email protected]。
在一个c#程序中,我使用一个服务账号[email protected]连接到EWS服务,获取其日历事件。如果一个事件的组织者是其他用户[email protected],那么我就用下面的方式冒充来更新日历事件项的属性--主题、正文等。
private static void Impersonate(string organizer)
{
string impersonatedUserSMTPAddress = organizer;
ImpersonatedUserId impersonatedUserId =
new ImpersonatedUserId(ConnectingIdType.SmtpAddress, impersonatedUserSMTPAddress);
service.ImpersonatedUserId = impersonatedUserId;
}
直到昨天下午,它还能正常工作。突然,它开始抛出一个异常 "访问被拒绝。检查凭证并再次尝试"。每当我尝试更新该事件时。
private static void FindAndUpdate(ExchangeService service) { CalendarView cv = new CalendarView(DateTime.Now, DateTime.Now.AddDays(30)); cv.MaxItemsReturned = 25; try { 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调用限制的一天,但我今天仍然看到这个问题。
任何帮助是感激的。
谢谢你的帮助
找到了解决方案。
只有添加冒充的ID到现有的服务实例中是行不通的。你还需要重新验证自动发现的网址。
我在调查一个冒充+日历的问题,发现了这个论坛的帖子。
我确信你的问题在于你试图获取然后更新日历项(约会)的方式。
你是用一个凭证(邮箱A)来获取日历项。然后在后面,在下面一行
Impersonate(masterItem.Organizer.Address.ToString());
您正在指示Ews服务对象作为被冒充的身份(邮箱B的凭据)工作。
由于您已经从邮箱A中获取了预约,现在试图使用邮箱B的凭证在邮箱A中更新该预约,如果邮箱B对邮箱A的日历没有权限,我认为这应该是行不通的。
所以在这里,其实你是想更新邮箱A的日历项,使用邮箱B的冒充凭证,由于邮箱B对邮箱A的凭证没有权限,所以出现了访问被拒绝的错误。
希望这也能帮助到别人!谢谢