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

dimanche 29 mai 2011

[DEV] Supprimer une ou plusieurs catégories de Project Server avec les PSI

Dans cet article je vais vous montrer comment en développement .net nous pouvons très facilement supprimer une ou plusieurs catégories de PWA en utilisant les PSI de Project Server.
Tout d’abord il vous faut ajouter la référence au service web dans votre projet .Net, dans mon exemple j’ai pris l’adresse suivante : http://MONSERVEUR/PWA/_vti_bin/PSI/Security.asmx
Maintenant nous allons pouvoir créer notre méthode “DeleteCategories”:

/// <summary>
/// Suppression une catégories sur l'instance PWA spécifiée
/// </summary>
/// <param name="name"> Nom des catégories</param>
public void DeleteCategories(string[] NameCategories)
{
}

Maintenant j’ai pour habitude de redonner toujours l’adresse et l’authentification lors de l’appel au PSI, cela permet de modifier facilement si vous le mettez dans l’app.config.

//Récupération de l'url du web service PSI Sécurité
String WS_SECURITY_Adress  = "http://MONSERVEUR/PWA/_vti_bin/PSI/Security.asmx";

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

WS_Security = new Svc_Security.Security();
WS_Security.CookieContainer = new CookieContainer();
WS_Security.Credentials = myCredentials;
WS_Security.Url = WS_SECURITY_Adress;  

Maintenant que nous sommes authentifié sur le bon webservice nous allons appeler la méthode permettant de récupérer les catégories pour récupérer les GUID des catégories souhaitées.

//Récupération de la liste des catégories 
DS_Cat = WS_Security.ReadCategoryList();

Maintenant nous allons utiliser LINQ pour récupérer un Array de l’ensemble des GUID tes catégories que nous souhaitons supprimer.

//Création et remplissage d'une list des GUID de catégories
var list = (from search in DS_Cat.SecurityCategories.AsEnumerable()
where NameCategories.Contains(search["WSEC_CAT_NAME"].ToString()) 
select new Guid(search["WSEC_CAT_UID"].ToString())).ToArray();

Maintenant nous allons appeler la méthode de PSI permettant de supprimer une liste Array de catégories, cette liste ne doit contenir que des GUID.

//Suppression de l'ensemble des catégories contenues dans le tableau
WS_Security.DeleteCategories(list);

Code complet:

/// <summary>
/// Suppression une catégories sur l'instance PWA spécifiée
/// </summary>
/// <param name="name"> Nom des catégories</param>
public void DeleteCategories(string[]  NameCategories)
{
//Récupération de l'url du web service PSI Sécurité
String WS_SECURITY_Adress  = "http://MONSERVEUR/PWA/_vti_bin/PSI/Security.asmx";

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

WS_Security = new Svc_Security.Security();
WS_Security.CookieContainer = new CookieContainer();
WS_Security.Credentials = myCredentials;
WS_Security.Url = WS_SECURITY_Adress;  

//Récupération de la liste des catégories 
DS_Cat = WS_Security.ReadCategoryList();

//Création et remplissage d'une list des GUID de catégories
var list = (from search in DS_Cat.SecurityCategories.AsEnumerable()
where NameCategories.Contains(search["WSEC_CAT_NAME"].ToString()) 
select new Guid(search["WSEC_CAT_UID"].ToString())).ToArray();

//Suppression de l'ensemble des catégories contenues dans le tableau
WS_Security.DeleteCategories(list);

}

mardi 17 mai 2011

Service Pack 1 pour Project 2010 et Project Server 2010

Après plusieurs mois voici le SP1 de Project Server 2010 et MSProject, ce SP1 prend en compte tous les correctifs mais également certaine évolution dont une de taille coté navigation qui est le suport de plusieurs navigateurs.

Plus de possibilité également sur l'édition dans PWA des projets.

Bref je ne vais aps retranscrire les améliorations regarder sur le site officiel.

http://blogs.msdn.com/b/project/archive/2011/05/16/project-2010-sp1.aspx

Bonne mise à jour :)