Я пытаюсь использовать службу подписки на события TFS для динамического создания подписки через веб-интерфейс. Подписки идут на промежуточную учетную запись. Для наших целей мы будем называть две учетные записи «пользователями без права администратора» и «хранилищем подписки».Не удалось разблокировать олицетворение в Team Foundation Server 2010 Веб-доступ
Администратор может создать предупреждение для учетной записи «Подписка на подписку», а учетная запись хранения подписки может создавать оповещения для себя, но пользователь, не являющийся администратором, не может создавать подписки в учетной записи хранилища. Я получаю следующее сообщение об ошибке:
Access Denied: {имя пользователя учетной записи} необходимо следующее разрешение (ы) на ресурс $ подписка: для выполнения этого действия: Редактировать
код, который я» м, используя это:
IEventService eventService = (IEventService)this.tfsCollection.GetService(typeof(IEventService));
eventService.SubscribeEvent(userAccountIdentity.Sid, Strings.WorkItemChangedEvent, string.Format(Strings.Condition0, workItem.ToString(CultureInfo.InvariantCulture)), deliveryPreference, string.Format(Strings.AlertTag0, workItem.ToString(CultureInfo.InvariantCulture)));
Пожалуйста, принять на веру, что все параметры верны, и что их значения не имеют никакого отношения к этому обсуждению. :) tfsCollection
- это объект TfsTeamProjectCollection
, который исходит из свойства Connection.TeamProjectCollection
страницы.
Моя первая мысль была разорвать олицетворения так, что он использует учетную запись службы (в данном случае, NetworkService), так что я сделал метод расширения, который принимает Action
и выполняет его без олицетворения, следующим образом:
public static void WithoutImpersonation(this Action actionToPerform)
{
using (var ctx = WindowsIdentity.Impersonate(IntPtr.Zero))
{
try
{
actionToPerform();
}
finally
{
ctx.Undo();
}
}
}
Это правильно нарушает олицетворение на протяжении Action
(проверка WindowsIdentity.GetCurrentUser()
возвращает учетную запись NetworkService вместо учетной записи пользователя), но по-прежнему не удается создать подписку на события с той же ошибкой. Авторизованным пользователем TfsTeamProjectCollection
является также учетная запись NetworkService.