2012-02-09 9 views
10

En mi Team Foundation Server, tengo una colección que contiene un proyecto de equipo. Este proyecto de equipo tiene varios contribuyentes. Las siguientes líneas de código obtener todos los contribuyentes de ese proyecto:¿Dónde administro las direcciones de correo electrónico de los usuarios de TFS?

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); 

cada identidad en miembros tiene una propiedad MailAddress, que en mi caso es igual a String.Empty.

¿Dónde administro esas direcciones de correo?

Mi primera idea era tener un vistazo a los usuarios en Inicio-> Herramientas administrativas-> Informática Management-> Usuarios

he seleccionado uno de los usuarios y abrió sus propiedades. Pensé que podría haber una propiedad de correo electrónico que tomaría el TFS. Pero no pude encontrar uno.

Luego abrí la Consola de Administración TFS, busqué la Membresía de Grupo y navegué a uno de los usuarios. Tampoco hay forma de editar propiedades.

¿Alguien sabe dónde establecer esa dirección de correo electrónico?

Respuesta

9

¡Una gran pregunta! Hay un trabajo TFS que está programado para ejecutarse cada hora para actualizar la información sobre las identidades de seguridad almacenadas en TFS contra los detalles en Active Directory. Parte de esta información incluye el nombre para mostrar, el identificador de seguridad (SID), el nombre completo de AD y la dirección de correo electrónico, entre otros detalles. Puede encontrar este caché de detalles mirando la tabla tbl_security_identity_cache en la base de datos de configuración.

Advertencia: Consultar o cambiar la base de datos lo coloca en una posición en la que probablemente no podrá obtener el soporte de Microsoft. Se recomienda que no haga esto a menos que lo indique un representante de soporte técnico de Microsoft en el contexto de un caso de soporte activo. En realidad, lo estabas haciendo bien usando el TFS SDK para obtener esta información.

Si su entorno TFS no está en un entorno de Active Directory, intentará sincronizar información desde la máquina local donde se está ejecutando TFS. No tendrá detalles sobre la dirección de correo electrónico a usar, por lo que se dejará en blanco.

A partir de la próxima versión de TFS después de TFS 2010, cada usuario podrá actualizar su dirección de correo electrónico de notificación en su perfil mediante Team Web Access.

+0

Gracias por la respuesta detallada. Estas son buenas noticias. Entonces ahora puedo enviar automáticamente un correo electrónico a cada miembro del equipo cada vez que se lanza una compilación. :) – Christian

+0

¿Realmente no hay forma de administrar las direcciones de correo electrónico de los usuarios si TFS no está conectado a AD? Cualquier complemento, API o similar que pueda hacer tal cosa? – Xorandor

+0

Correcto: en TFS 2005, TFS 2008 y TFS 2010.Los usuarios podrían actualizar su dirección de correo electrónico de notificación en la próxima versión de TFS a través de Profile Management en Team Web Access, pero no estoy seguro de si habrá una interfaz de usuario expuesta para que los administradores los actualicen. La próxima versión de TFS aún no está lista, ¡así lo veremos! Si se almacena de una manera que se puede editar a través de la API, entonces alguien podría crear una herramienta personalizada para hacerlo también. –

1

Creo que esto se mantiene en Active Directory.

2

Si Active Directory no se sincroniza con TFS, y asumiendo que su objetivo es mantener la dirección de correo electrónico para enviar notificaciones, puede usar los métodos IEventService.GetEventSubscriptions().

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; 
    } 
} 
+0

La asignación 'member.MailAddress = ...' no es persistente, ¿Hay una función Guardar/Actualizar que deba llamarse después? – mhu

2

La siguiente es para TFS 2013 Actualización 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. ** 

localizar al usuario o usuarios con direcciones de correo electrónico que necesita ser fijado. Puede haber duplicados en la tabla Identities. Encontré que los que tenían el SequenceId más alto eran los activos 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>') 

Esto da una lista de las más recientes la Id (s), en forma GUID, para las cuentas que tiene que actualizar. Estos GUID deben formatearse en ArtifactId (s), que es un formato binario transformado. Esto se logra invirtiendo el orden de bytes (de menor a mayor) o cada una de las tres primeras partes del GUID, pero dejando las dos últimas partes en orden. Ej .:

Returned 'Id' GUID  =01020304-0506-0708-090A-0B0C0D0E0F10 
Byte Swapped GUID  =04030201-0605-0807-090A-0B0C0D0E0F10 
Reformatted 'ArtifacId'=0x0403020106050807090A0B0C0D0E0F10 

A continuación, usted tiene que encontrar la PropertyId (s) utilizado por TFS para notificaciones por correo electrónico. En TFS 2013 U5, esto se puede encontrar con la siguiente consulta:

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

Esto le dará la PropertyId (s) para ConfirmedNotificationAddress y CustomNotificationAddresses; cuáles son los dos campos de propiedad utilizados por TFS 2013 U5 para enviar correos electrónicos de notificación.

A continuación, usted tiene que encontrar la InternalKindId para el Marco Identity para el TFS DatabaseCategory

USE Tfs_TFSConfiguration 
SELECT Description, InternalKindId FROM tbl_PropertyArtifactKind 
WHERE Description='Identity' 

Ahora a poner todo junto, ...

Si los registros de configuración para el usuario (s) ya existen, puede actualizar la configuración con:

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>') 

Nota: que ArtifactId es un valor binario, basado en un GUID de base de datos de semi-bytes intercambiados, y no coincidirá con un valor cotizado en la consulta UPDATE.   I.e. esta parte de la consulta se verá algo como:

WHERE ArtifactId=0x90D490F6BF7B31491CB894323F38A91F AND 

A continuación Asumo que el PartitionId es '1'; esto debe verificarse antes de continuar con un breve examen de los registros en la tabla tbl_PropertyValue.
Si va a cargar los parámetros de configuración que aún no han sido establecidos:

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>') 

Nota: que ArtifactId debe ser un valor binario sin comillas, transformado desde el GUID volvió de la tbl_Identity como se explicó anteriormente.
Nota: que se crean dos registros para cada ArtifactId, uno para cada PropertyId.

** WARNING ** Getting caught editing the TFS database directly 
** will void your Microsoft Support Agreement. ** 
** Proceed at your own risk. ** 

(Esto funciona para mí, pero ...  , no tengo un acuerdo de soporte técnico de Microsoft para invalidar.)

Cuestiones relacionadas