Где я могу администрировать адреса электронной почты пользователей TFS?
В моем Team Foundation Server у меня есть коллекция, содержащая командный проект. Этот командный проект имеет несколько участников. Следующие строки кода получают всех участников этого проекта:
TfsTeamProjectCollection collection = new TfsTeamProjectCollection(new Uri("http://tfs:8080/tfs/CollectionName"));
IGroupSecurityService groupSecurityService = collection.GetService<IGroupSecurityService>();
Identity contributors = groupSecurityService.ReadIdentity(SearchFactor.AccountName, "[ProjectName]\\Contributors", QueryMembership.Expanded);
Identity[] members = groupSecurityService.ReadIdentities(SearchFactor.Sid, contributors.Members, QueryMembership.None);
Каждая личность в членах имеет свойство MailAddress, которое в моем случае равно string.Empty.
Где я могу администрировать эти почтовые адреса?
Моей первой идеей было взглянуть на пользователей в Пуск-> Администрирование-> Управление компьютером-> Пользователи.
Я выбрал одного из пользователей и открыл его свойства. Я думал, что может быть свойство электронной почты, которое будет принимать TFS. Но я не мог найти один.
Затем я открыл консоль администрирования TFS, искал членство в группе и перешел к одному из пользователей. Также нет способа редактирования свойств.
Кто-нибудь знает, где установить этот адрес электронной почты?
5 ответов
Отличный вопрос! Существует задание TFS, которое планируется запускать каждый час, чтобы обновить информацию об идентификаторах безопасности, хранящихся в TFS, по сравнению с данными в Active Directory. Часть этой информации включает в себя, помимо прочих, отображаемое имя, идентификатор безопасности (SID), отличительное имя AD и адрес электронной почты. Вы можете узнать этот кеш деталей, посмотрев на tbl_security_identity_cache
таблица в базе данных конфигурации.
Предупреждение. Запрос к базе данных или ее изменение ставят вас в положение, при котором вы, скорее всего, не сможете получить поддержку от Microsoft. Рекомендуется, чтобы вы не делали этого, если это не было поручено представителем службы поддержки Microsoft в контексте активной поддержки. Вы действительно делали это правильно, используя TFS SDK для получения этой информации.
Если ваша среда TFS не находится в среде Active Directory, она попытается синхронизировать информацию с локального компьютера, на котором работает TFS. В нем не будет подробной информации об используемом адресе электронной почты, поэтому он останется пустым.
Начиная с следующей версии TFS после TFS 2010, каждый пользователь сможет обновить свой адрес электронной почты для уведомлений в своем профиле с помощью Team Web Access.
Следующее для TFS 2013 Обновление 5
** WARNING ** Getting caught editing the TFS database directly ** will void your Microsoft Support Agreement. ** What follows is not for the uninitiated. ** Proceed at your own risk. **
Найдите пользователя или пользователей с адресами электронной почты, которые необходимо установить. Там могут быть дубликаты в Identities
Таблица. Я обнаружил, что те, кто с самым высоким SequenceId
были активными Identities
,
Use Tfs_TFSConfiguration
SELECT i1.AccountName, i1.Id FROM tbl_Identity AS i1
LEFT OUTER JOIN tbl_Identity AS i2
ON (i1.AccountName=i2.AccountName AND i1.SequenceId<i2.SequenceId)
WHERE i2.AccountName IS NULL
AND i1.AccountName in ('<your first user>','<another user>','<and so on>')
Это дает список самых последних Id
(s) в форме GUID для учетных записей, которые необходимо обновить. Эти GUID должны быть переформатированы в ArtifactId
(s), который является преобразованным двоичным форматом. Это достигается путем изменения порядка следования байтов (от низкого к высокому) или каждой из первых трех частей GUID, но оставляя последние две части в порядке. Например:
Returned 'Id' GUID =01020304-0506-0708-090A-0B0C0D0E0F10
Byte Swapped GUID =04030201-0605-0807-090A-0B0C0D0E0F10
Reformatted 'ArtifacId'=0x0403020106050807090A0B0C0D0E0F10
Далее вы должны найти PropertyId
(ы) используется TFS для уведомлений по электронной почте. В TFS 2013 U5 это можно найти с помощью следующего запроса:
USE Tfs_TFSConfiguration
SELECT Name, PropertyId FROM tbl_PropertyDefinition WHERE Name LIKE '%Address%'
Это даст вам PropertyId
для ConfirmedNotificationAddress
а также CustomNotificationAddresses
; это два поля свойств, используемые TFS 2013 U5 для отправки уведомлений по электронной почте.
Далее вы должны найти InternalKindId
для Identity
Рамки для TFS DatabaseCategory
USE Tfs_TFSConfiguration
SELECT Description, InternalKindId FROM tbl_PropertyArtifactKind
WHERE Description='Identity'
Теперь, чтобы сложить все вместе,...
Если записи конфигурации для ваших пользователей уже существуют, вы можете обновить настройки с помощью:
USE Tfs_TFSConfiguration
UPDATE tbl_PropertyValue SET LeadingStringValue='<user's notification email address>'
WHERE ArtifactId=<ArtifactId, reformatted from tbl_Identity query>
AND PropertyId IN ('<first PropertyId from tbl_PropertyDefinition>', '<second id>')
Примечание: это ArtifactId
является двоичным значением, основанным на полубайтовом обмене GUID базы данных, и не будет соответствовать указанному в кавычках значению UPDATE
запрос. Т.е. эта часть запроса будет выглядеть примерно так:
WHERE ArtifactId=0x90D490F6BF7B31491CB894323F38A91F AND
Ниже я предполагаю, что PartitionId
это "1"; это следует проверить, прежде чем продолжить с помощью краткого сканирования записей в tbl_PropertyValue
Таблица.
Если вы загружаете параметры конфигурации, которые еще не были установлены:
USE Tfs_TFSConfiguration
INSERT INTO tbl_PropertyValue
(PartitionId, ArtifactId, InternalKindId, Version, PropertyId, LeadingStringValue)
VALUES ('1', <ArtifactId, reformatted from tbl_Identity query>,
'<InternalKindId from tbl_PropertyArtifactKind>',
'0',
'<first PropertyId from tbl_PropertyDefinition>',
'<user's notification email address>'),
('1', <ArtifactId, reformatted from tbl_Identity query>,
'<InternalKindId from tbl_PropertyArtifactKind>',
'0',
'<second PropertyId from tbl_PropertyDefinition>',
'<user's notification email address>')
Примечание: это ArtifactId
должно быть двоичным значением без кавычек, преобразованным из GUID, возвращенного из tbl_Identity
как объяснено выше.
Примечание: две записи созданы для каждого ArtifactId
по одному на каждого PropertyId
,
** WARNING ** Getting caught editing the TFS database directly ** will void your Microsoft Support Agreement. ** ** Proceed at your own risk. **
(Это работает для меня, но у меня нет соглашения о поддержке Microsoft для аннулирования.)
Если Active Directory не синхронизируется с TFS и предполагается, что ваша цель - сохранить адрес электронной почты для отправки уведомлений, вы можете использовать методы IEventService.GetEventSubscription ().
var eventService = (IEventService)collection.GetService(typeof(IEventService));
foreach (var member in members)
{
var subscription = eventService.GetEventSubscriptions(member.DisplayName).First();
{
if (subscription != null && string.IsNullOrEmpty(member.MailAddress))
member.MailAddress = subscription.DeliveryPreference.Address;
}
}
Для TFS2017+ каждый пользователь может иметь предпочитаемый адрес электронной почты, который он может настроить в своем профиле, в веб-интерфейсе.
Он может переопределить или заменить электронную почту, установленную в Active Directory. Он также имеет преимущество, заключающееся в мгновенном изменении, никакой синхронизации не требуется.
Поле будет инициализировано со значением, которое было установлено в Active Directory. Синхронизация больше не происходит.