Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Julien Chable

He blogs, you blog, I blog ...

Archives

Créer un Cmdlet personnalisé pour SharePoint 2010

L’administration de SharePoint n’a jamais été aussi aisée et productive que depuis l’apparition des centaines de cmdlets pour PowerShell. Les amateurs de stsadm et des scripts en mode DOS ne pourront que confirmer cela (enfin j’espère !?). Vous ne vous trouver pas encore assez performant dans l’administration de votre ferme, même avec PowerShell ? Vous ne trouver pas la commande qui vous ferait être encore plus productif ? Votre produit de gestion de sauvegarde de ferme préféré n’a pas cmdlet et vous ne pouvez pas vous en passer ?! C’est par ici …

La première question à se poser est : quand créer des cmdlets ? Une cmdlet permet à un administrateur de la ferme de gérer et d’administrer la ou les fermes SharePoint rapidement depuis une console PowerShell (potentiellement distante). Si vous avez des tâches spécifiques, que vous exécutez par lot et cela de façon fréquente, vous avez un contexte propice à cette création. Sinon ne perdez pas votre temps à créer des cmdlets qui finiront au placard rapidement, essayez plutôt de poussez les possibilités de PowerShell et de passer par des fonctions pour vous en sortir. D’autant que le travail de développement n’est pas à la portée de n’importe quelle personne d’IT.

Il y a bien d’autres situations avec SharePoint 2010 nécessitant la création de nouveaux cmdlets : nouvelles capacités de gestion (site, liste, autorisations, etc), création d’un nouveau service, interopérabilité avec des outils tierces (exemple Backup Exec, etc), etc.

Les bases

Avec SharePoint, vous avez plusieurs choix lors de la conception de votre cmdlet puisque la plateforme propose plusieurs classes déjà spécialisées en fonction de votre intention :

Pour vous aiguiller, l’un des critères à prendre en compte est l’utilisation de la persistance entre vos cmdlets : est-ce que la cmdlet retourne un objet qui sera stocké dans une variable ? Si c’est le cas, utilisez les classes dérivées de SPCmdletBase, soit :

  • SPGetCmdletBase
  • SPNewCmdletBase
  • SPRemoveCmdletBase
  • SPSetCmdletBase

Si votre cmdlet ne retourne pas d’objet spécifique, mais n’effectue que des actions (par exemple : mise à jour d’autorisations, affichage d’un état en sortie texte non structuré, etc), l’utilisation de la classe SPCmdlet sera plus indiqué.

Si vous souhaitez utiliser le système de pipeline de PowerShell pour enchainer votre commande, la classe tout indiquée à cela sera SPCmdletPipeBind. Nous allons d’ailleurs y avoir recours dans notre exemple.

Dans cette partie, nous allons créer un exemple simple, une cmdlet permettant de lister le contenu d’une liste. Nous avons fait le choix d’utiliser la classe de base SPGetCmdletBase qui sera utilisé conjointement avec SPCmdletPipeBind pour récupérer le paramètre de l’adresse de la liste :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management.Automation;
using Microsoft.SharePoint.PowerShell;
using Microsoft.SharePoint;

namespace Demo.SharePoint.PowerShell
{
    [
Cmdlet(VerbsCommon.Get, "SPList", SupportsShouldProcess = false), SPCmdlet(RequireLocalFarmExist = true)]
   
public sealed class GetSPListCmdlet : SPGetCmdletBase<SPList>
    {
        [
Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0)]
       
public SPListPipeBind PipeBind { get; set; }

        [
Parameter(ValueFromPipeline = false)]
       
public string QueryFields { get; set; }

        [
Parameter(ValueFromPipeline = false, ValueFromRemainingArguments = false)]
       
public SwitchParameter ShowFields { get; set; }

       
protected override IEnumerable<SPList> RetrieveDataObjects()
        {
           
List<SPList> splists = new List<SPList>();

           
SPList list = PipeBind.Read();
           
if (list != null)
            {
                AssignmentCollection.Add(list.ParentWeb);
                AssignmentCollection.Add(list.ParentWeb.Site);
                splists.Add(list);
            }

           
// Paramètre champ
           
if (ShowFields)
            {
               
foreach (SPField field in list.Items.Fields)
                   
Console.WriteLine(field.Title + " - " + field.InternalName);
               
return null;
            }
           
else if (!String.IsNullOrEmpty(QueryFields)) // Export en CSV
            {
               
StringBuilder sb = new StringBuilder();
               
// Colonnes
               
Console.WriteLine(QueryFields);
               
// Valeurs
               
SPListItemCollection collListItems = list.GetItems(QueryFields.Split(';'));
               
foreach (SPListItem listItem in collListItems)
                {
                   
foreach (string field in QueryFields.Split(';'))
                        sb.Append(listItem[field].ToString()).Append(
";");
                   
Console.WriteLine(sb.ToString());
                    sb =
new StringBuilder();
                }
               
return null;
            }
           
else
               
return splists;
        }
    }

   
public sealed class SPListPipeBind : SPCmdletPipeBind<SPList>
    {
       
public string ListURI { get; private set; }

       
public SPListPipeBind(SPList spList) : base(spList) { }

       
public SPListPipeBind(string listURI) { this.ListURI = listURI; }

       
protected override void Discover(SPList instance)
        {
           
this.ListURI = instance.ParentWeb.Site.MakeFullUrl(instance.RootFolder.ServerRelativeUrl);
        }

       
public override SPList Read()
        {
           
SPSite site = new SPSite(this.ListURI);
           
SPWeb web = site.OpenWeb();
           
return web.GetList(this.ListURI);
        }
    }
}

Le déploiement

Concernant le déploiement, rien de sorcier avec les extensions SharePoint de Visual Studio 2010 :

  1. Créez un nouveau projet vide (sélectionner CSharp > SharePoint > 2010 puis entrez le nom de votre projet)
  2. Créez une solution en tant que Solution se déployant dans la ferme.
  3. Ajoutez les références vers Microsoft.SharePoint.PowerShell  et System.Management.Automation (dans le répertoire “c:\windows\assembly\GAC_MSIL\<nom de l’assembly>”)
  4. Supprimez la classe déjà créé par le projet et créez en une nouvelle avec le nom de votre classe, ici GetSPListCmdlet.
  5. Copiez le code ci-dessus dans le nouveau fichier de classe,
  6. Pour déployer la cmdlet automatiquement avec la console de gestion PowerShell SharePoint, nous allons créer un fichier XML nommé ‘Demo.SharePoint.powerShell.xml’ (<nom de l’assembly>.xml)
  7. Copiez le contenu du fichier XML (cf plus bas)
  8. Mapper le répertoire (<14 hive>/CONFIG/PowerShell/Registration) dans votre projet (clic droit sur le projet > Add > SharePoint mapped folder) et placez y le fichier XML précédemment créé.
<?xml version="1.0" encoding="utf-8" ?>
<ps:Config xmlns:ps="urn:Microsoft.SharePoint.PowerShell"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:Microsoft.SharePoint.PowerShell SPCmdletSchema.xsd" >
  <ps:Assembly Name="$SharePoint.Project.AssemblyFullName$">
    <ps:Cmdlet>
      <ps:VerbName>Get-SPList</ps:VerbName>
      <ps:ClassName>Demo.SharePoint.PowerShell.GetSPListCmdlet</ps:ClassName>
      <ps:HelpFile>Demo.SharePoint.PowerShell.dll-help.xml</ps:HelpFile>
    </ps:Cmdlet>
  </ps:Assembly>
</ps:Config>

Remarque : pour créer le fichier d’aide, utilisez les liens suivants pour comprendre la structure du fichier XML à créer http://msdn.microsoft.com/en-us/library/aa965353%28VS.85%29.aspx et http://blogs.msdn.com/b/powershell/archive/2006/09/14/draft-creating-cmdlet-help.aspx. Le projet joint contient le fichier d’aide associé à notre exemple.

L’exécution

Une fois le projet créé et compilé, déployez le projet (clic droit sur le projet > Deploy) et lancez une commande PowerShell (il vous faudra ouvrir une nouvelle console après chaque déploiement) et testez les commandes suivantes :

> $list = Get-SPList http://<chemin vers votre liste>
> $list.ShowUser = $false
> $list.Update()

=> Récupération de l’objet SPList de la liste spécifiée et modification de la propriété ShowUser

> Get-SPList http://<chemin vers votre liste> –ShowFields

=> Affiche toutes les propriétés (nom et nom interne) de la liste

> Get-SPList http://<chemin vers votre liste> -QueryFields "Title;Author"

=> Affiche le contenu des propriétés spécifiées pour tous les éléments de la liste

Les sources sont disponibles ici.

A bientôt et meilleurs voeux pour cette nouvelle année

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: lundi 3 janvier 2011 05:14 par neodante
Classé sous : ,

Commentaires

Pierrick CATRO-BROUILLET a dit :

Voilà un tuto qu'il est bon ! Merci !

Toutefois, j'ai pour ma part tendance à rester sur du PowerShell pur (car, après tout, on peut tout faire en PS) ce qui a l'avantage que mes scripts tournent partout.

Mais bon à savoir quand même :)

# janvier 3, 2011 21:20
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01