Где я могу администрировать адреса электронной почты пользователей TFS? - PullRequest
11 голосов
/ 09 февраля 2012

В моем 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 ]

9 голосов
/ 10 февраля 2012

Отличный вопрос! Существует задание TFS, которое планируется запускать каждый час, чтобы обновить информацию об идентификаторах безопасности, хранящихся в TFS, по сравнению с данными в Active Directory. Некоторые из этих сведений включают отображаемое имя, идентификатор безопасности (SID), отличительное имя AD и адрес электронной почты, а также другие сведения. Вы можете узнать этот кеш деталей, посмотрев таблицу tbl_security_identity_cache в базе данных конфигурации.

Предупреждение : Запрос или изменение базы данных ставит вас в положение, при котором вы, скорее всего, не сможете получить поддержку от Microsoft. Рекомендуется, чтобы вы не делали этого, если это не было поручено представителем службы поддержки Microsoft в контексте активной поддержки. Вы действительно делали это правильно, используя TFS SDK для получения этой информации.

Если ваша среда TFS не находится в среде Active Directory, она попытается синхронизировать информацию с локального компьютера, на котором работает TFS. В нем не будет подробной информации об используемом адресе электронной почты, поэтому он останется пустым.

Начиная со следующей версии TFS после TFS 2010, каждый пользователь сможет обновить свой адрес электронной почты для уведомлений в своем профиле с помощью Team Web Access.

3 голосов
/ 27 марта 2017

Ниже приведено обновление для 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 (s), используемые TFS для уведомлений по электронной почте.В TFS 2013 U5 это можно найти с помощью следующего запроса:

USE Tfs_TFSConfiguration
SELECT Name, PropertyId FROM tbl_PropertyDefinition WHERE Name LIKE '%Address%'

Это даст вам PropertyId (s) для ConfirmedNotificationAddress и CustomNotificationAddresses;это два поля свойств, используемые TFS 2013 U5 для отправки уведомлений по электронной почте.

Далее необходимо найти InternalKindId для Identity Framework для 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 для аннулирования.)

2 голосов
/ 10 февраля 2012

Если 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;
    }
}
1 голос
/ 10 февраля 2012

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

0 голосов
/ 12 июля 2018

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

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

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

...