Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Le blog de Patrick [MVP Office 365]

Partage d'informations sur yOS (Yammer, Office 365, SharePoint), Azure et +...

Actualités









  • Mon blog en ANGLAIS - English blog :

    Versions :
    14.0.4730.1010 SharePoint 2010 RC
    14.0.4762.1000 SharePoint 2010 RTM
    14.0.6029.1000 SharePoint 2010 SP1
    ​14.0.7015.1000 SharePoint 2010 SP2

    15.0.4128.1014 SharePoint 2013 Preview
    15.0.4420.1017 SharePoint 2013 RTM
    15.0.4569.1509 SharePoint 2013 SP1

    Les derniers CU pour SharePoint 2010...
    Les N° de version pour SharePoint 2013...


[ #SharePoint 2013 ] Inventaire d’une ferme avec PowerShell et Visio (1/4) : PowerShell

1er article d’une série de 4 sur l’inventaire d’une ferme SharePoint

 

Je me suis penché sur ce sujet pour préparer la session des TechDays 2014 sur la Migration vers SharePoint 2013 , que je co-animerai avec Benoît Jester :

Retours d'expériences et Meilleures pratiques pour la Migration vers SharePoint 2013

Titre sessionEn effet, il existe un certain nombre d’outils dédiés soit à la documentation d’une ferme SharePoint, soit à la migration qui proposent naturellement cet inventaire. Mais il est intéressant de se poser la question de ce que l’on peut faire nativement avec l’environnement SharePoint.

Tout d’abord, il convient de rappeler que l’administration centrale ne fournit aucun outil de reporting ou de documentation de la ferme. Les menus “Gérer les applications Web” et “Afficher toutes les collections de sites” ont certes le mérite d’exister mais nécessitent un marathonien du clic pour être utilisés sur une ferme de production ! ;-)

image

accessibles directement via :

powershell_2Donc très vite PowerShell apparait être la bonne solution pour nous fournir un reporting complet d’une ferme.

Le point de départ de ma réflexion a été le très bon article de Benjamin Niaulin  (@bniaulin)

image

Benjamin y fournit une commande élégante qui permet de lister l’ensemble des sites et sous-sites d’une collections de sites :

image

Add-PSSnapin Microsoft.SharePoint.PowerShell
# Commande à partir de "Build an inventory before a SharePoint Migration and put it in Visio"
# http://en.share-gate.com/blog/how-to-build-an-inventory-before-sharepoint-migration
$url = "http://intranet.contoso.com"
Get-SPWebApplication $url | `
    Get-SPSite -Limit All | `
        Get-SPWeb -Limit All | `
            Select Title, URL, ID, ParentWebID, WebTemplate, Created | `
                Export-CSV C:\temp\sharepointinventory.csv -NoTypeInformation

Cependant cette commande présente pour mes besoins quelques manques que j’ai essayé de combler :

  1. Tout d’abord elle ne couvre qu’une seule Web Application; là où je souhaiterais avoir un inventaire de toutes les Web Apps de la ferme
  2. Ensuite le mode de formatage de la sortie via un select est peu pratique car la syntaxe pour ajouter un champs calculé au select est peu pratique.

J’en profite ici pour faire une petite étude des commandes permettant de faire cet inventaire car elles présentent quelques subtilités dont il faut se méfier. ;-)

  • Le résultat de la commande Get-SPWebApplication ne contient pas par défaut l’administration centrale. Il faudra utiliser le paramètre :

-IncludeCentralAdministration

image

  • Le résultat de la commande Get-SPSite est limité par défaut à 20 sites. Pour aller plus loin il faudra utiliser le paramètre –Limit All

image 

  • La commande Get-SPSite avec un paramètre d’url renvoie la collection de sites ayant cette URL comme base; là où un pipe Get-SPWebApplication  | Get-SPSite renvoie l’ensemble des collections de sites de l’application Web

image

  • La commande Get-SPWeb lancée sans paramètre renvoie une erreur. Lancée en sortie d’un pipe de  Get-SPSite, elle ne renvoie qu’un objet (le site de 1er niveau de la collection de site) alors qu’un pipe Get-SPWebApplication  | Get-SPSite | Get-SPWeb renvoie bien l’ensemble des sites de toutes les collections de sites de l’application Web choisie. Enfin en supprimant le paramètre $url de la commande Get-SPWebApplication , on arrive bien à lister l’ensemble de sites (simple et collections de sites) d’une ferme.

image

On notera cependant que ce dernier pipe de commandes ne renvoie pas de ligne pour les web-applications, ni pour la ferme.

Toutes ces limitations et exceptions font que j’ai, pour ma part préféré, implémenté le parcours de la hiérarchie des objets de la ferme, via trois boucles imbriquées :

foreach ($w in Get-SPWebApplication) {
    write-host "WA     " $w.url ($w.sites).count
 
    if (($w.sites).count -gt 0) {
        foreach ($sc in $w.sites) {
           write-host "  CS       " $sc.url ($sc.AllWebs).count
            
           foreach ($si in $sc.AllWebs) {
                 write-host "    SI        " $si.url
}   }   }  }

Le résultat est le suivant :

 image

Ces trois boucles imbriquées permettent d’exécuter des traitements et des affichages spécifiques à chaque étape. En particulier on peut rajouter une ligne pour chaque WebApplication. On pourra facilement afficher les informations souhaitées à chaque niveau ici :

  • le type de l’objet : WA pour WebApplication, SC pour Sites Collection et SI pour Site
  • L’url du site
  • Le nombre de descendants directs dans la hiérarchie

Pour sélectionner les propriétés pertinentes à chaque niveau de la hiérarchie on utilisera :

image 

# Pour afficher les propriétés de chaque objet
 
get-spfarm | get-member -membertype property
get-spfarm | select *
$w  | get-member -membertype property
$w  | select *
$sc | get-member -membertype property
$sc | select *
$si | get-member -membertype property
$si | select *

Hiérarchie

Pour notre inventaire nous allons sélectionner les champs suivants :

image

Pour afficher une hiérarchie il est nécessaire de disposer d’un champs qui pour chaque élément pointe sur le site ou l’objet parent dans la hiérarchie.

Au niveau des sites, ce champs existe c’est ParentWebId mais il est à 00000000-0000-0000-0000-000000000000 pour le site de 1er niveau d’une collection de sites. Par ailleurs il n’existe pas d’équivalent pour les WebApplication.

Nous avons donc étendu cette hiérarchie en partant la ferme qui est le sommet de la hiérarchie et en assignant arbitrairement un identifiant aux Web Applications qui permet de les raccrocher à un objet père : la ferme.

Nous récupérons aussi pour chaque niveau le type de template de sites. Pour les WebApp et la ferme, ce champs est remplie avec les mots-clés FARM et WEBAPP.

Donc notre script PowerShell complet se présente de la façon suivante :

image

###########################################################################
# Populate CSV file
$file = "C:\Temp\sharepointfullinventory.csv"
$waid = 0
$nam = (get-spfarm).name
$furl = (Get-SPWebApplication -IncludeCentralAdministration | where { ($_.Displayname -eq "SharePoint Central Administration v4") }).URL
"FA;$nam;$furl;$wid;;FARM;;" | out-file $file
foreach ($w in Get-SPWebApplication) {
    $waid = $waid +1
    $n = $w.Name
    $u = $w.url
    "WA;$n;$u;$waid;0;WEBAPP;"+($w.sites).count | out-file $file -Append
    $isWA=1
    if (($w.sites).count -gt 0) {
        foreach ($sc in $w.sites) {
            $isSC = 1
            $nb = ($sc.AllWebs).count
             
            foreach ($si in $sc.AllWebs) {
                $n = $Si.title
                $u = $si.url
                $wid = $si.id
                if ($si.ParentWebId -eq "00000000-0000-0000-0000-000000000000") `
                    { $parid = $waid } else  { $parid = $si.ParentWebId }
                $tem = $si.WebTemplate
                $cre = $si.Created
                if ($issc -eq 1) {
                    "SC;$n;$u;$wid;$parid;$tem;$nb;$cre" | out-file $file -Append
                    $isSC = 0 }
                else {
                    $nb = ($si.Webs).count
                    "SI;$n;$u;$wid;$parid;$tem;$nb;$cre" | out-file $file -Append
                }
            }
        }
    }
 }

Le résultat produit un fichier .csv dont voici les premières lignes :

image

Après conversion du texte en colonnes et un tout petit peu de formatage, on obtient le fichier .xlsx suivant :

image

Ce fichier va nous servir d’entrée pour réaliser un organigramme Visio. Cela sera décrit dans le billet suivant.

NB : le fichier .ps1 du script PowerShell et les fichiers .csv et .xlsx de l’inventaire sont téléchargeables ici en pièces jointes de ce message.

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 :

Commentaires

Pas de commentaires

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