Где я могу администрировать адреса электронной почты пользователей 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;
    }
}

Я считаю, что это хранится в Active Directory.

Для TFS2017+ каждый пользователь может иметь предпочитаемый адрес электронной почты, который он может настроить в своем профиле, в веб-интерфейсе.

Он может переопределить или заменить электронную почту, установленную в Active Directory. Он также имеет преимущество, заключающееся в мгновенном изменении, никакой синхронизации не требуется.

Поле будет инициализировано со значением, которое было установлено в Active Directory. Синхронизация больше не происходит.

Другие вопросы по тегам