Affichage des articles dont le libellé est Project Server. Afficher tous les articles
Affichage des articles dont le libellé est Project Server. Afficher tous les articles

vendredi 4 novembre 2011

Petit rappel sur l'utilisation du connecteur entre Team Foundation Server et Project Server

Ajouter les droits du compte de service de TFS dans le service de Project Server


 
Le compte de service de TFS doit pouvoir avoir un accès complet au service de Project Server et donc à toutes les instances de PWA.

 
Pour ajouter ce compte de service vous devez ouvrir l’administration centrale de SharePoint 2010.

 
  • Allez dans « Application Management », et cliquez sur « Manage service applications ».
  • Dans la page « Manage Service Application », cliquez sur la ligne « Project Server Service Application ».
  • Dans le ruban, cliquez sur « Permissions ».
  • Indiquez le nom du compte de service de TFS, et cliquez sur « Add ».
  • Dans la zone du bas, cliquez sur « Full Control », et cliquez sur « OK ».

 
Ajouter les droits du compte de service de TFS dans les instances de PWA.

 
  • Ouvrez votre ou vos instances PWA (http://PS2010/PWA).
  • Allez dans « Server Settings »
  • Cliquez sur « Manage Users »
  • Cliquez sur « New User »
  • Dans la zone « * Display Name » indiquez le nom du compte de service « Ex : Compte de service TFS »
  • Dans la zone « * User longon account : » saisissez le compte de service « Ex : PS2010\TFSService »
  • Dans la zone « Security Groups » sélectionnez « Administrators » et cliquez sur « Add »
  • Dans la zone « Security Categories » cliquez sur « Add All >> »
  • Pour chaque catégories, sélectionnez dans la liste « Set permissions with Template: » « Administrator » puis cliquez sur « Apply »
  • Dans la zone « Global Permissions », sélectionnez dans la liste « Set permissions with Template: » « Administrator » et cliquez sur « Apply »
  • Enfin cliquez sur « Save »

  
Enregistrement de l’instance de PWA

 
Chaque enregistrement d’instance de PWA et de TFS doit être enregistré dans le système de synchronisation.

 
Commande :

 
TfsAdmin ProjectServer /RegisterPWA /pwa:pwaUrl /TFS:tfsUrl
  • pwaUrl : Adresse de PWA, http://PS2010/Pwa
  • tfsUrl : Adresse de TFS, http://PS2010:8080/tfs

 Batch :

 

 
@echo off
set v_PWA="http://ps2010/pwa"
set v_TFS="http://ps2010:8080/tfs"

 
cd c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE
set /p v_Question= if you want to register an instance of PWA : %v_PWA% (y or n) ?

 
if not %v_Question%== y goto Suite
echo Register an instance of PWA : %v_PWA%

 
TfsAdmin ProjectServer /RegisterPWA /pwa:%v_PWA% /TFSServerURL:%v_TFS%

 
pause
:Suite


 

 

Enregistrement de la relation entre une instance de PWA et une collection de TFS

 
Toute collection de projet dans TFS 2010 contenant un ou plusieurs projets d’équipe lié à un projet d’entreprise dans PWA doit être mappée.

 
Commande

 
TfsAdmin ProjectServer /MapPWAtoCollection /pwa:pwaUrl /collection:tpcUrl
  • pwaUrl : Adresse de l’instance de PWA : http://PS2010/pwa
  • tpcUrl : Adresse de la collection de site : http://PS2010:8080/tfs/DefaultCollection

 Batch

  
@echo off
set v_PWA="http://ps2010/pwa"
set v_Collection="http://ps2010:8080/tfs/DefaultCollection"

 
cd c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE
set /p v_Question= if you want to map this collection project : %v_Collection% (y or n) ?

 
if not %v_Question%== y goto Suite

 
echo Map the PWA instance (%v_PWA%) with a team project collection (%v_Collection%)

 
TfsAdmin ProjectServer /MapPWAtoCollection /pwa:%v_PWA% /collection:%v_Collection%

 
pause

 
:Suite


Mise à jour du fichier de mapping

 
Les champs coté TFS doivent être mappé aux champs cotés Project Server. Attention la mapping est pour une collection de projet donc prévoyez tous les champs de tous les types de projets.

 
Commande

 
TfsAdmin ProjectServer /UploadFieldMappings /collection:tpcUrl /useDefaultFieldMappings
  • tpcUrl : Adresse de la collection de projet : http://PS2010:8080/tfs/DefaultCollection
  • useDafaultFieldMappings : Permet d’utiliser le mapping par défaut, il contient les champs obligatoire.
  • filePath : Permet de spécifier un fichier : c:\mapping.xml

 
Batch

 
@echo off
set v_Collection="http://ps2010:8080/tfs/DefaultCollection"


cd c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE

set /p v_Question= if you want to upload the mapping default : (y or n) ?

 
if not %v_Question%== y goto Suite

 
echo Upload default field mappings

 
TfsAdmin ProjectServer /UploadFieldMappings /collection:%v_Collection% /useDefaultFieldMappings

 
pause
:Suite

 
Associer un Project d’équipa TFS à un projet d’entreprise de PWA

 
Tout projet qui doit être synchronisé à un projet d’entreprise doit être enregistré. Attention vous ne pouvez pas mapper un projet de TFS si sa collection de projet d’appartenance n’est pas mappée.

 
Commande

 
TfsAdmin ProjectServer /MapPlanToTeamProject /collection:tpcUrl /enterpriseproject:PlanName /teamproject:ProjectName /workitemtypes:ListOfTypes

  • tcpUrl : Adresse de la collection de projet : http://PS2010:8080/tfs/defaultCollection
  • enterpriseProject : Nom du projet dans PWA : Agile Plan
  • teamProject : Nom du projet dans TFS : Agile Project Team
  • WorkitemTypes : Liste des type de WI à synchroniser : « User Story,Task »
Batch

 
@echo off

 
set v_Collection="http://ps2010:8080/tfs/DefaultCollection"
set v_WIType="User Story"
set v_EnterpriseProject = "Agile Plan"
set v_TeamProject = "Agile Team Project"

 
cd c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE

 
set /p v_Question= if you want to register an instance of PWA : %v_PWA% (y or n) ?

 
if not %v_Question%== y goto Suite

 
echo Associate an enterprise project plan (%v_EnterpriseProject%) with a team project(%v_TeamProject%), workitem (%v_WIType%)

 
TfsAdmin ProjectServer /MapPlanToTeamProject /collection:%v_Collection% /enterpriseproject:%v_EnterpriseProject% /teamproject:%v_TeamProject% /workitemtypes:%v_WIType%

 
echo Now you must to add team members to the enterprise resource pool !!!!

 
pause

 
:Suite
Désinscription

 
Vous pouvez à tout moment désinscrire une liaison entre projet, entre TFS et PWA et même désinscrire une instance de PWA. Les choses doivent être faite dans l’ordre, bien que la suppression d’une collection de projet et d’une instance de PWA peut désinscrire il faut faire les choses proprement.

 
Supprimer la liaison entre un projet d’équipe et un projet d’entreprise

 
Commande

 
TfsAdmin ProjectServer /UnmapPlanFromTeamProject/collection:tpcUrl /enterpriseproject:EnterpriseProjectName /teamproject:TeamProjectName

  •  tcpUrl : Adresse de la collection de projet : http://PS2010:8080/tfs/defaultCollection
  • enterpriseProject : Nom du projet dans PWA : Agile Plan
  • teamProject : Nom du projet dans TFS : Agile Project Team

 
Supprimer la liaison entre une collection de projet et une instance de PWA

 
Commande

 
TfsAdmin ProjectServer /UnMapPWAFromCollection /pwa:pwaUrl /collection:tpcUrl [/force]


 
Désinscrire une instance de PWA

 
Commande

 
TfsAdmin ProjectServer /UnregisterPWA /pwa:pwaUrl /TFSServerURL:tfsUrl

  •  tcpUrl : Adresse de TFS : http://PS2010:8080/tfs
  • pwaUrl : Adresse de l’instance de PWA : http://PS2010/pwa

 

 

 

mardi 31 mai 2011

[DEV] Création d’un groupe dans Project Server

Dans cet article je vais vous expliquer comment créer simplement un nouveau groupe dans Project Server.

Dans un premier temps nous devons ajouter le web service de la gestion des groupes dans le projet:

http://MONSERVEUR/PWA/_vti_bin/PSI/Security.asmx

Ensuite nous allons initialiser le service et les autorisations, pour ce faire j’utilise une méthode que j’ai nommée “WS_InitiSecurity()”

Cette méthode est la suivante:

private void WS_InitiSecurity()
{
//Récupération de l'url du web service PSI Sécurité
String WS_SECURITY_Adress = Properties.Settings.Default.Url_PWA + "/_vti_bin/PSI/Security.asmx";
CredentialCache myCredentials = CredentialPSI(WS_SECURITY_Adress);
WS_Security = new WS_Security.Security();
WS_Security.CookieContainer = new CookieContainer();
WS_Security.Credentials = myCredentials;
WS_Security.Url = WS_SECURITY_Adress;
}



Maintenant créons notre méthode

public void CreateGroup(string grpName, string grpDesc)
{
...
}



Nous allons créer un DataSet dans le quel nous ajouterons notre groupe,

WS_Security.SecurityGroupsDataSet secuDs = new WS_Security.SecurityGroupsDataSet();
WS_Security.SecurityGroupsDataSet.SecurityGroupsRow groupRow =
secuDs.SecurityGroups.NewSecurityGroupsRow();



Ensuite nous allons donner les paramètres de base, Nom, Description

//Attribution des propriétés
groupRow.WSEC_GRP_DESC = grpDesc;
groupRow.WSEC_GRP_NAME = grpName;
groupRow.WSEC_GRP_UID = Guid.NewGuid();



Et pour finaliser nous allons enregistrer sur le serveur notre nouveau groupe.

//Ajout des paramètres dans le dataset (SecurityGroups)
secuDs.SecurityGroups.AddSecurityGroupsRow(groupRow);

//Création du groupe dans la base cible
WS_Security.CreateGroups(secuDs);



Et voilà, à vous la création de groupe.


Code complet,


 

        public void CreateGroup(string grpName, string grpDesc)
{
WS_InitiSecurity();

// Création du groupe
WS_Security.SecurityGroupsDataSet secuDs = new WS_Security.SecurityGroupsDataSet();
WS_Security.SecurityGroupsDataSet.SecurityGroupsRow groupRow =
secuDs.SecurityGroups.NewSecurityGroupsRow();

//Attribution des propriétés
groupRow.WSEC_GRP_DESC = grpDesc;
groupRow.WSEC_GRP_NAME = grpName;
groupRow.WSEC_GRP_UID = Guid.NewGuid();

//Ajout des paramètres dans le dataset (SecurityGroups)
secuDs.SecurityGroups.AddSecurityGroupsRow(groupRow);

//Création du groupe dans la base cible
WS_Security.CreateGroups(secuDs);
}

lundi 30 mai 2011

[DEV] Affecter un nouveau “Owner” à un projet avec les PSI

Dans cet article je vais vous montrer comment affecter un nouveau propriétaire à un projet. Nous allons donc créer une méthode appelée “AssignOwner”.

Nous devons également référencer le Web Service de PSI que nous avons besoin:

http://MONSERVEUR/SharedServices1/PSI/Project.asmx

Pour permettre de réutiliser ma méthode d’authentification j’ai créé une méthode nommée “WS_InitProject()” qui me permet d’initialiser mon service PSI:

/// <summary>
/// Initialisation du web service Project
/// </summary>
/// <param name="webServiceUrl"></param>
/// <param name="myCredentials"></param>
private void WS_InitProject()
{
//Récupération de l'url du web service PSI Sécurité
String WS_Project_Adress = "http://MONSERVEUR/SharedServices1/PSI/Project.asmx";

CredentialCache myCredentials = CredentialPSI(WS_Project_Adress);
svcProj = new WS_Project.Project();
svcProj.CookieContainer = new CookieContainer();
svcProj.Credentials = myCredentials;
svcProj.Url = WS_Project_Adress;
}



Dans cette méthode j’utilise une méthode nommé “CredentialPSI()” qui me permet de générer le credential du service Web.

private static CredentialCache CredentialPSI(String WS_SECURITY_Adress)
{
//Authentification sur le web service avec le compte
CredentialCache myCredentials = new CredentialCache();
myCredentials.Add(new Uri(WS_SECURITY_Adress), "NTLM", new NetworkCredential("Noham", "pass@word1", "SoDEMO"));
return myCredentials;
}



Maintenant que nous avons les éléments premier il nous reste à créer la méthode principale.

/// <summary>
/// Assignation d'un owner à un projet
/// </summary>
/// <param name="projectID">ID du projet dont on veut assigner un owner</param>
/// <param name="ownerID">ID de l'owner à assigner</param>
public void AssignOwner(Guid projectID, Guid ownerID)
{
}



Maintenant initialisons notre service:

WS_InitProject();

Puis appelons la méthode qui nous permet de renvoyer les informations du projet en passant en paramètre l’ID du projet et nous demandons de prendre le projet en publish.

// Récupère le projet passé en paramètre dans la base publish
dsProj = svcProj.ReadProject(projectID, PurgerCategories.WS_Project.DataStoreEnum.PublishedStore);

Maintenant initialisons nos GUID qui seront utilisés pour la publication des changements,

Guid sessionId = Guid.NewGuid();
Guid jobId = Guid.NewGuid();



En suite nous vérifions que le projet existe, et vérifions qu’il y a bien un projet:

  if (dsProj != null)
{
// Affectation de l'owner
if (dsProj.Project.Count > 0)
{


On extrait le projet,

//On extrait le project
if (CheckOutProject(projectID, sessionId, "Affect Owner"))
{



Ensuite c’est simple on attribut l’ID du nouveau “Owner” et on fait un chek-ou du projet et un publish.

//Affectation valeur
dsProj.Project[0].ProjectOwnerID = ownerID;

bool validateOnly = false;
//On archive le projet avec les dernières modifications
svcProj.QueueUpdateProject(jobId, sessionId, dsProj, validateOnly);

System.Threading.Thread.Sleep(4000);

svcProj.QueueCheckInProject(jobId, projectID, true, sessionId, "Affect Owner - Check-in");
svcProj.QueuePublish(Guid.NewGuid(), projectID, true, Properties.Settings.Default.PurgerCategories_Url_PWA);



Et voilà.


Code complet de la méthode

        /// <summary>
/// Assignation d'un owner à un projet
/// </summary>
/// <param name="projectID">ID du projet dont on veut assigner un owner</param>
/// <param name="ownerID">ID de l'owner à assigner</param>
public void AssignOwner(Guid projectID, Guid ownerID)
{
WS_InitProject();

Guid sessionId = Guid.NewGuid();
Guid jobId = Guid.NewGuid();

// Récupère le projet passé en paramètre dans la base publish
dsProj = svcProj.ReadProject(projectID, PurgerCategories.WS_Project.DataStoreEnum.PublishedStore);

if (dsProj != null)
{
// Affectation de l'owner
if (dsProj.Project.Count > 0)
{
//On extrait le project
if (CheckOutProject(projectID, sessionId, "Affect Owner"))
{
//Affectation valeur
dsProj.Project[0].ProjectOwnerID = ownerID;

bool validateOnly = false;
//On archive le projet avec les dernières modifications
svcProj.QueueUpdateProject(jobId, sessionId, dsProj, validateOnly);

System.Threading.Thread.Sleep(4000);

svcProj.QueueCheckInProject(jobId, projectID, true, sessionId, "Affect Owner - Check-in");
svcProj.QueuePublish(Guid.NewGuid(), projectID, true, Properties.Settings.Default.PurgerCategories_Url_PWA);
}
}
}
}