Générateur de commandes PowerShell pour SharePoint et Office 365

Générateur de commandes PowerShell pour SharePoint et Office 365

Microsoft propose un générateur de commandes PowerShell pour SharePoint et Office 365, disponible en ligne.

Vous sélectionnez votre produit : SharePoint Online, SharePoint Foundation 2013, SharePoint Server 2013, SharePoint Foundation 2010, SharePoint Server 2010, ou Office 365.

Ensuite, avec la souris vous déposez le verbe puis le nom de l’objet que vous voulez manipuler: les paramètres obligatoires apparaissent, ainsi que les paramètres optionnels.

La commande PowerShell est construite dynamiquement au fur et à mesure du remplissage des paramètres. Vous pouvez la copier grâce au gros bouton Copy to Clipboard : très simple et très pratique.

Exemple de construction dynamique d'une commande PowerShell pour SharePoint et Office 365

Vous avez aussi un mode rapide qui permet de sélectionner des actions communes comme la création d’un site web SharePoint en Powershell.

Commande rapide pour générer une commande PowerShell de création d'un site SharePoint

Windows PowerShell Command Builder for SharePoint 2013 Products and Office 365

 

PowerShell: Commandes pour manipuler les formats de fichiers

Les formats de fichiers produits par les commandes PowerShell sont parfois déroutants.

Pourtant les exemples trouvés sur le web sont souvent simplistes car ils ne reflètent pas toujours la complexité de la réalité.

En effet, les « vrais » fichiers recèlent des pièges liés aux données elles-mêmes: présence de virgule ou de point-virgule dans les données au format CSV, etc.

Cet article est l’occasion de passer en revue les principales particularités des formats de fichier et les commandes associées.

Out-File

Pour obtenir la liste des services qui s’exécutent sur votre ordinateur dans un fichier texte, vous allez utiliser la commande Out-File.

Ouvrez une invite de commande PowerShell en tant qu’Administrateur et tapez:

Get-WmiObject win32_service | Out-File .services.txt

Ouvrez le fichier services.txt avec Notepad++:

ExitCode : 0
Name : AdobeARMservice
ProcessId : 1780
StartMode : Auto
State : Running
Status : OK

ExitCode : 0
Name : AdobeFlashPlayerUpdateSvc
ProcessId : 0
StartMode : Manual
State : Stopped
Status : OK

Dans ce cas, vous ne récupérez qu’une partie des informations d’un service, la disposition est sous forme de fiche et le fichier est encodé en UCS-2 Little Endian.

Encodage UTF-8

Pour avoir un encodage UTF-8, tapez:

Get-WmiObject win32_service | Out-File .services.txt -Encoding « UTF8 »

Par défaut, Get-WmiObject win32_service produit un résultat sous forme de liste. Pour avoir une disposition tabulaire, vous essayez:

Get-WmiObject win32_service | Format-Table | Out-File .services.txt -Encoding « UTF8 »

Le résultat:

ExitCode Name ProcessId StartMode State Status
——– —- ——— ——— —– ——
0 AdobeARMservice 1780 Auto Running OK
0 AdobeFlashPlayer… 0 Manual Stopped OK

Le « Name » est partiel. La mise en forme est peu pratique pour un traitement automatisé.

Commande Get-Service

Le résultat ne vous convenant toujours pas, vous changez de commande pour obtenir la liste des services. Au lieu d’utiliser Get-WmiObject win32_service, vous essayez la commande Get-Service qui par défaut produit un résultat sous forme de tableau:

Get-Service | Out-File .services.txt -Encoding « UTF8 »

Le résultat est encore différent:

Status Name DisplayName
—— —- ———–
Running AdobeARMservice Adobe Acrobat Update Service
Stopped AdobeFlashPlaye… Adobe Flash Player Update Service

En fait, la colonne Name (ainsi que DisplayName) est tronquée.

Export-Csv

Au lieu d’utiliser Out-File, vous allez utiliser Export-Csv. Tapez la commande suivante:

Get-WmiObject win32_service | Export-Csv .services.csv -Encoding « UTF8 »

Ouvrez le fichier services.csv avec Notepad++ et vous voyez apparaître beaucoup plus d’informations sous forme quasi-tabulaire:

#TYPE System.Management.ManagementObject#rootcimv2Win32_Service
« PSComputerName », »__GENUS », »__CLASS », »__SUPERCLASS », »__DYNASTY », »__RELPATH »,…
« MONORDINA », »2″, »Win32_Service », »Win32_BaseService », »CIM_ManagedSystemElement », »Win32_Service.Name= » »AdobeARMservice » » »,…
« MONORDINA », »2″, »Win32_Service », »Win32_BaseService », »CIM_ManagedSystemElement », »Win32_Service.Name= » »AdobeFlashPlayerUpdateSvc » » »,…

Pour éliminer la première ligne (« #TYPE System.Management.ManagementObject#rootcimv2Win32_Service »), il suffit de rajouter le paramètre -NoTypeInformation à la ligne de commande:

Get-WmiObject win32_service | Export-Csv .services.csv -Encoding « UTF8 » -NoTypeInformation

Ouvrez le fichier services.csv avec Microsoft Office Excel. Lors de son ouverture, Excel a détecté la présence du séparateur « ; » dans certaines lignes et il a séparé les données concernées dans la seconde colonne (« B »). Par exemple la description du « Service de cache de police Windows » contient un « ; »: « […] Il peut être désactivé ; il en résulte cependant une dégradation des performances des applications. »

Délimiteur spécifique

La présence inopportune du séparateur « ; » va rendre plus complexe le traitement des données lors de l’utilisation d’un Split(). Aussi, pour contourner ce problème, vous décidez de changer de délimiteur en choisissant un caractère plus rare comme ¤.

La commande devient:

Get-WmiObject win32_service | Export-Csv .services.csv -Delimiter « ¤ » -Encoding « UTF8 » -NoTypeInformation

Lorsque vous ouvrez le fichier services.csv avec Microsoft Office Excel, celui-ci n’arrive pas à séparer les colonnes automatiquement: l’assistant d’importation de texte se lance.

Assistant d'importation de texte d'Excel

Vous pouvez réduire le nombre de colonnes avec l’utilisation de la commande Select-Object. Par exemple, si vous ne voulez que le nom et la description (« Caption ») de chaque service, vous tapez la commande suivante:

Get-WmiObject win32_service | Select-Object Name, Caption | Export-Csv .services.csv -Delimiter « ¤ » -Encoding « UTF8 » -NoTypeInformation

Le fichier résultat est plus sobre:

« Name »¤ »Caption »
« AdobeARMservice »¤ »Adobe Acrobat Update Service »
« AdobeFlashPlayerUpdateSvc »¤ »Adobe Flash Player Update Service »

Import-Csv

Pour retraiter le fichier résultat, utilisez la commande PowerShell Import-CSV suivante:

Import-Csv .services.csv -Delimiter « ¤ »

Commande PowerShell Import-Csv

Pour traiter une seule colonne, vous utilisez la fonction Split() ou la variable automatique $_.

La commande suivante fournit la description de tous les services dont le nom débute avec la lettre « A »:

Import-Csv .services.csv -Delimiter « ¤ » | ForEach-Object {if($_.Name.StartsWith(« A »)){write-host $_.Caption}}

Si votre fichier services.csv ne possédait pas d’entête, la commande précédente échouerait. Pour y remédier, il suffit d’indiquer un entête dans la commande Import-Csv avec le paramètre Header:

Import-Csv .services.csv -Header (« Name », »Caption ») -Delimiter « ¤ » | ForEach-Object {if($_.Name.StartsWith(« A »)){write-host $_.Caption}}

Le résultat donne quelque chose comme:
Adobe Acrobat Update Service
Adobe Flash Player Update Service

Supprimer les double guillemets

Lorsque vous utilisez Export-CSV, cette commande ajoute automatiquement des guillemets autour de chaque donnée retournée. Pour enlever tous les guillemets des fichiers CSV à l’aide de PowerShell, l’article de Hey, Scripting Guy! donne une solution qui combine l’utilisation des commandes Export-Csv et Out-File. Toutefois, cette solution n’est pas pleinement satisfaisant car elle remplace aussi les guillemets qui seraient à l’intérieur d’une donnée !

(Get-Content .services.csv) -replace ‘ »‘, «  » | Out-File .services.csv -Encoding « UTF8 » -Force

Faites attention à l’affichage ambigüe des guillemets et des quotes dans WordPress. L’opérateur -replace a comme premier argument ‘ »‘, soit: une quote, un guillemet, une quote.
Le second argument est «  », soit: un guillemet, un guillemet.

La paramètre -Force permet d’écraser un fichier en lecture seule.

Une solution moins radicale consiste à utiliser une expression régulière avec la fonction replace pour supprimer uniquement les guillemets en début et en fin de chaîne de chaque donnée: ‘^ »(.*) »$’, ‘$1’. Le replacement doit se faire sur chaque donnée, et non pas ligne par ligne.

Tableaux / Arrays

Face à la diversité des choix, vous pouvez être tenté de manipuler toutes les données à l’aide de tableaux (« Arrays ») plutôt que de les stocker temporairement dans un fichier.

Si le volume de données manipulées n’est pas disproportionné, ce choix est souvent judicieux car la manipulation en mémoire reste souvent plus rapide que l’écriture sur un disque dur.

Toutefois, pour des raisons de conservations d’historique ou de traçabilité, vous devrez peut-être enregistrer les données manipulées dans un fichier.

Dans ce cas, n’utilisez pas l’opérateur -replace sur les objets. En effet, les commandes suivantes risquent de produire un résultat différent de vos attentes:

# Génére un fichier CSV à partir de la liste des services de l’ordinateur
Get-WmiObject win32_service | Select-Object Name, Caption | Export-Csv .services.csv -Delimiter « ¤ » -Encoding « UTF8 » -NoTypeInformation

# Alimente le tableau $Array à partir du fichier CSV
$Array = Import-Csv .services.csv -Delimiter « ¤ »

# Cherche à remplacer des caractères dans $Array puis génère un fichier TXT pour récupérer le résultat
$Array -replace « Adobe », »ADOBE » | Out-File .services-2.txt

# Cherche à remplacer des caractères dans $Array puis génère un second fichier CSV pour récupérer le résultat
$Array -replace « Adobe », »ADOBE » | Export-Csv .services-2.csv -Delimiter « ¤ » -NoTypeInformation

Le contenu de services-2.txt:

@{Name=ADOBEARMservice; Caption=ADOBE Acrobat Update Service}
@{Name=ADOBEFlashPlayerUpdateSvc; Caption=ADOBE Flash Player Update Service}

Le contenu de services-2.csv:

« Length »
« 61 »
« 76 »

L’opérateur -replace a converti l’objet tableau $Array en une seule chaine de caractères (string).

le fichier résultat services-2.txt contient les chaînes de caractères.

Le fichier résultat services-2.csv contient la longueur des chaînes de caractères. La chaîne « @{Name=ADOBEARMservice; Caption=ADOBE Acrobat Update Service} » fait exactement 61 caractères et la chaîne « @{Name=ADOBEFlashPlayerUpdateSvc; Caption=ADOBE Flash Player Update Service} » fait exactement 76 caractères.

Diviser un fichier vCard en de multiples fichiers séparés avec Powershell

Les contacts de Gmail peuvent être exportés dans un fichier au format vCard pour une importation dans le carnet d’adresses Apple ou une autre application comme Outlook.

Le fichier produit s’intitule contacts.vcf. Il contient toutes vos adresses dans un seul fichier. Les adresses étant au format vCard, elles sont stockées dans le fichier sous la forme:
BEGIN:VCARD
VERSION:3.0
FN:Jean Dujardin
N:Dujardin;Jean;;;
EMAIL;TYPE=INTERNET:jean.dujardin@gmail.com
NOTE:Intelligence économique
END:VCARD

Chaque adresse est donc encadrée dans un bloc BEGIN:VCARD – END:VCARD.

Lorsque j’ai voulu importer ce fichier dans Microsoft Outlook 2013, celui-ci n’a lu que la première adresse. Pour contourner cette difficulté, j’ai trouvé sur le web un script en Windows PowerShell qui permet de lire un gros fichier pour générer des petits fichiers unitaires.

Le script de Paul Westlake a justement été écrit pour diviser un fichier vCard en de multiples fichiers séparés. Comme il correspondait parfaitement à mon besoin, je l’ai uniquement francisé.

Le script n’étant pas signé, pensez à modifier la préférence utilisateur de la stratégie d’exécution Windows PowerShell avec la commande Set-ExecutionPolicy.

Code actuel:
SplitVCF_V2_0_0.zip

Ancien code:
SplitVCF_V1_0_0.zip

PowerShell et XML

Généralement les tutoriaux sur PowerShell débutent par présenter les types de données, les boucles, etc. C’est certainement une bonne méthode.

Dans ce cours dirigé, qui s’étale sur plusieurs articles, vous apprendrez plutôt à lire un fichier XML avec un script PowerShell. Le même script servira pour alimenter une liste personnalisée dans SharePoint.

Support du format XML par PowerShell

PowerShell supporte directement le XML. A partir d’un exemple simple inspiré du http://refcardz.dzone.com, vous allez découvrir à quel point le traitement est facilité.

Dans une invite Powershell, créez une variable typée XML, intitulée $monXML:

# Crée un objet XML
$monXML =[xml] « <Acheteur nom=’pom pom pom pom’><Quantité>9</Quantité><Fruit>POMMES</Fruit></Acheteur> »

La lecture d’une valeur d’un noeud se fait en indiquant le chemin complet jusqu’au noeud visé.

Le chemin complet se construit en concaténant les noeuds intermédiaires et en utilisant le point (« . ») comme séparateur.

Par exemple, pour obtenir la quantité, il suffit d’indiquer le chemin complet jusqu’au noeud Quantité.

# Donne la valeur du noeud Quantité
write-host -foregroundcolor yellow $monXML.Acheteur.Quantité

Résultat : 9

Pour obtenir le fruit, il suffit d’indiquer le chemin complet du noeud:

# Donne la valeur du noeud Fruit
write-host -foregroundcolor yellow $monXML.Acheteur.Fruit

Résultat : POMMES

Vous pourriez écrire encore plus simplement:

# Donne la valeur du noeud Quantité
$monXML.Acheteur.Quantité

et

# Donne la valeur du noeud Fruit
$monXML.Acheteur.Fruit

powershell-xml-simple

SharePoint: Métadonnées gérées

Lors de la mise en place de SharePoint, la planification de la taxonomie est une étape cruciale.

Une fois que le référentiel de données est défini, créé et alimenté, il reste à définir les méthodes d’accès à ces données qui doivent être simples et conviviales.

La réponse de Microsoft consiste à s’appuyer sur l’application de services des métadonnées gérées de SharePoint.

C’est un service qui permet aux organisations de définir leurs structures de métadonnées et celles qui sont disponibles dans SharePoint. Les utilisateurs peuvent naviguer rapidement dans l’arborescence pour attribuer des métadonnées pertinentes associées au contenu. Le service de métadonnées peut être utilisé pour fournir des métadonnées dans plusieurs fermes de l’organisation.

Toutefois, le référentiel de données a été créé dans les organisations, bien avant l’arrivée de SharePoint et l’application de services des Métadonnées gérées. Aussi, une proposition simple d’alimentation automatisée des métadonnées gérées est vue à la fin de l’article.

Saisies assistées

L’utilisation du magasin de métadonnées gérées permet de faire des saisies assistées. Par exemple, si vous avez défini la taxonomie suivante dans les métadonnées gérées:

Arborescence de la taxonomie des métadonnées gérées

Une liste Equipements est créée avec les 3 colonnes suivantes :

  • Lots: champ Titre renommé
  • Electro-Ménager: colonne de type Métadonnées gérées qui pointe sur l’ensemble de termes ‘Blanc’
  • Meubles: colonne de type Métadonnées gérées qui pointe sur l’ensemble de termes ‘Brun’

Lorsque l’utilisateur débute une saisie dans le champ Electro-Ménager, les valeurs correspondantes s’affiche.

Saisie assistée avec les métadonnées gérées

Il est aussi possible d’avoir la liste de toutes les valeurs en cliquant sur l’icône en forme de double étiquettes:

Liste de toutes les valeurs d'un ensemble de termes

Provisionnement des Métadonnées gérées

La création de l’application de services des métadonnées gérées peut se faire à l’aide de l’interface graphique utilisateur ou via PowerShell. L’utilisation de PowerShell est incontestablement plus souple, plus rapide et plus puissante. Tuoutefois, pour des raisons purement pédagogiques, vous le ferez avec l’interface graphique.

Allez dans l’administration centrale de SharePoint 2010: Central Administration > Manage service applications > New  (dans le ruban) puis renseignez les champs:

Création de l'application de services des métadonnées gérées

Une fois que l’application de service est créée, il est possible d’accéder aux autres paramètres.

Pour provisionner l’application de services des métadonnées gérées, cliquez simplement dessus: la création de la taxonomie est simple et intuitive grâce à l’utilisation du clic droit.

Par contre, n’oubliez pas d’indiquer que votre compte est administrateur du magasin de termes, sinon vous ne pourrez rien faire. Pensez aussi éventuellement à indiquer la langue par défaut.

Provisionnement du magasin de termes des métadonnées gérées

Les langues s’ajoutent grâce aux pack de langues SharePoint.

Concentrateur de type de contenu

Lors de la création, l’assistant demande de renseigner la zone intitulée Content Type hub.

Le Content Type Hub permet de partager les types de contenu avec les autres collections de sites de la ferme ou d’autres fermes.

Autrement dit, vous définissez une seule fois vos types de contenu sur une collection de sites quelconque (par exemple, http://formation).

Allez dans les paramètres de la collection de sites qui servira à publier les types de contenu. Dans ses paramètres, cliquez sur Fonctionnalités de la collection de sites et recherchez la fonctionnalité intitulée Concentrateur de syndication de type de contenu. Activez cette fonctionnalité:

Fonctionnalité Concentrateur de syndication de type de contenu

Ensuite, vous choisissez les types de contenu que vous souhaitez publier sur d’autres collections de sites.

Par exemple, si vous voulez partager le type de contenu Paris Core Columns, allez dans ses paramètres et cliquez sur Gérer la publication de ce type de contenu:

Paramètres d'un type de contenu

Ensuite, cliquez sur le bouton OK pour valider la publication.

Publication d'un type de contenu

Si vous apportez des modifications à ce type de contenu (ajout d’une colonne, etc), pensez à le republier manuellement.

Afin d’actualiser les sites qui sont abonnés à ce type de contenu, vous devez le demander explicitement. Pour cela, allez dans les paramètres d’administration de la collection de sites qui héberge les types de contenu à publier:

Journaux

Cliquez sur le lien Publication de type de contenu et cochez la case Actualiser tous les types de contenu publiés lors de la prochaine mise à jour.

Publication de type de contenu

Sous la section Concentrateurs s’affiche la liste de tous les types de contenu qui doivent être publiés: Paris Core Columns, Nantes Core Columns, etc.

Erreurs liées aux métadonnées gérées

Si la publication ne s’effectue pas correctement, vérifiez le journal des erreurs de publication de type de contenu.

Vous pouvez aussi vérifier un autre journal: le Journal des erreurs des applications de services de type de contenu. Ce journal se trouve dans les paramètres d’administration de la collection de sites qui héberge les types de contenu à publier.

JournauxIl donne des détails sur des dysfonctionnements éventuels des applications de service des métadonnées gérées.

Un problème souvent rencontré concerne la création d’un type de contenu, ou d’une colonne de site, dans une collection de site cible et qui porte le même nom qu’un type de contenu (ou une colonne de site) publié.

Compte-tenu de la diversité des causes possibles, un autre article viendra compléter celui-ci pour exposer des cas d’erreurs liées aux métadonnées gérées.

Import dans le magasin de données

Lorsqu’il existe déjà un référentiel « maison » de données, il faut imaginer une solution pour alimenter le magasin des métadonnées de SharePoint.

Il est possible d’alimenter le magasin de données à l’aide d’un fichier au format CSV. Un exemple de fichier est donné par SharePoint dans les propriétés (« page d’accueil ») de l’application de service des métadonnées gérées.

Toutefois, cela n’est possible que ponctuellement et ce n’est pas envisageable dans une véritable organisation.

Une autre solution consiste à développer avec Visual Studio un job SharePoint pour le faire systématiquement. Un développeur expérimenté peut le faire en 4/5 jours selon la complexité de la tâche.

Une dernière solution privilégie la simplicité avec PowerShell.

Le référentiel de données existant produit des fichiers au format texte et encodés en UTF-8. Ces fichiers contiennent toutes les valeurs de listes en respectant le formalisme attendu par SharePoint.

Ensuite, grâce au travail de Vlad Catrinescu, un petit script PowerShell et une tâche planifiée permet d’automatiser l’import.

Le fichier ZIP est fourni avec un exemple complet pour importer des données (fictives).

Metadata.zip

SharePoint 2010: Script PowerShell – Créer une liste / Ajouter une colonne dans une liste personnalisée / Ajouter une colonne dans la vue

Parmi toutes les possibilités offertes par SharePoint 2010, sa gestion avec PowerShell est probablement une des plus puissantes, notamment pour les administrateurs.

Un bon exemple d’application est celui de pouvoir créer de nouvelles listes sur les sites par un script PowerShell.

Lors de la création d’une nouvelle liste, vous devez d’abord indiquer à SharePoint le modèle à utiliser. Pour lister tous les modèles, cliquez sur Start > All programs > Microsoft SharePoint 2010 Products > Microsoft SharePoint 2010 Products (Run as administrator):

$Web=Get-SPWeb http://demo
$Web.ListTemplates | Select Name, Description

Vous obtenez le nom et le début de la description de tous les modèles disponibles dans votre collection de sites. Choisissez le modèle que vous vous voulez et créez la liste avec la méthode Add().

$Template=$Web.ListTemplates[« Custom List »]
$Web.Lists.Add(« Commandes », »Liste des commandes »,$Template)

En cas de succès, SharePoint renvoie l’identifiant interne unique de la liste sur 32 caractères, le GUID.

Une fois la liste créée, il est pratiquement indispensable de rajouter des colonnes. Vous indiquez à SharePoint la liste sur laquelle vous travaillez, puis indiquez le type de la colonne et son nom, toujours avec la méthode Add().

$List=$web.Lists.TryGetList(« Commandes »)
$varFieldTypeTexte=[Microsoft.SharePoint.SPFieldType]::Text
$List.Fields.Add(« FruitID »,$varFieldTypeTexte,$false)

La colonne a bien été ajoutée, mais vous ne la voyez pas ! Pour la voir, vous allez dans les paramètres de la liste, et sous Colonnes, vous retrouvez bien:

FruitID Une seule ligne de texte

L’ajout de colonnes ne modifie (heureusement !) pas par défaut les affichages. C’est à vous de le faire. Il vous reste donc à modifier l’affichage par défaut

$View=$web.GetViewFromUrl(« http://demo/Lists/Commandes/AllItems.aspx »)
$Field=$List.Fields[« FruitID »]
$View.ViewFields.Add($Field)
$View.Update()

Voilà pour les principes. Vous trouverez ci-dessous un script PowerShell complet à télécharger.

Ce script créé une liste intitulée « Commandes » avec 4 colonnes (« FruitID », « FruitNom », « DateAchat », « Quantite »).

L’affichage par défaut (« AllItems.aspx ») de la liste est modifié pour faire apparaître les 4 colonnes.

SPListeCreer_V1_0_0.zip

Assembly du PowerShell SharePoint et développement .Net

Les premières lignes des scripts PowerShell relatifs à SharePoint débutent par une ligne ou deux qui ressemblent plus ou moins à :

Add-PSSnapin « Microsoft.SharePoint.PowerShell »

ou bien à:

[Reflection.Assembly]::LoadWithPartialName(« Microsoft.SharePoint »)

Ces deux instructions chargent les fonctions de l’assembly du PowerShell SharePoint.

Si vous êtes un développeur .Net, vous savez déjà ce qu’est un assembly. Pour un administrateur récemment converti au PowerShell, c’est certainement moins évident.

L’objet de cet article est de présenter très succinctement le rôle et l’intérêt d’un assembly pour un public de débutant en matière de développement .Net.

Principes généraux de l’assembly

Physiquement, un assembly est un fichier .DLL ou .EXE. L’idée derrière l’assembly est de mettre à disposition un code partageable entre différentes applications. C’est le même principe que pour les anciens fichiers DLL des systèmes d’exploitations Windows qui n’utilisent pas le Framework .Net.

Toutefois, la comparaison s’arrête là car les différences sont nombreuses.

En effet, les assemblies présentent de nombreux avantages supplémentaires notamment en matière de sécurité, fiabilité et robustesse. Des fonctionnalités supplémentaires, comme par exemple le déploiement côte-à-côte (vu plus bas), permettent aussi de pallier aux faiblesses des anciennes DLL.

Dans la plupart des cas, l’assembly est physiquement dans le Global Assembly Cache (GAC). Le rôle du GAC est de partager les assemblies entre les applications. Une assembly qui n’est pas présente dans le GAC peut fonctionner parfaitement pour une application donnée.

Si le développeur veut partager son travail, son assembly devra être dans le GAC afin de communiquer avec des applications d’autres domaines, d’autres processus ou d’autres ordinateurs.

Cette communication est faite sous le contrôle du Common Language Runtime .NET (CLR).

Nativement, l’explorateur Windows ne permet pas d’afficher les dossiers du GAC comme d’habitude. Pour avoir un affichage classique du contenu du GAC, ouvrez une invite de commande en tant qu’administrateur et tapez:

regsvr32 /u C:WINDOWSMicrosoft.NETFrameworkv2.0.50727shfusion.dll

Si shfusion.dll se trouve dans le dossier v2.0.50727 qui correspond à la version du socle .Net : c’est probablement le cas.

Une fois la commande exécutée avec succès, vous pouvez explorer les dossiers du GAC avec l’explorateur Windows classique. Les dossiers principaux du GAC sont:

  • C:Windowsassembly
  • C:WindowsMicrosoft.NET

Pour revenir ensuite à un affichage natif, tapez dans une invite de commande:

regsvr32 C:WINDOWSMicrosoft.NETFrameworkv2.0.50727shfusion.dll

Pour connaître la liste précise des assemblies chargées au moment de l’exécution d’une commande PowerShell, ouvrez une invite de commande PowerShell en tant qu’Administrateur puis tapez la commande:

[appdomain]::currentdomain.getassemblies()

Fonctionnement de l’assembly

Un fichier d’assembly englobe des ressources. En particluier, le manifeste et le code Microsoft Intermediate Language (MSIL).

Le manifeste est un fichier qui décrit l’assembly à travers des métadonnées comme par exemple le nom de l’assembly, sa version, sa culture, les autorisations de sécurité sous lesquelles l’assembly doit s’exécuter ou la liste des assemblies dépendants.

La culture concerne les usages en termes de formatage de dates, de monnaies, etc (http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx).

Un programme peut utiliser une version d’un assembly tandis qu’un autre programme peut s’appuyer sur une version différente du même assembly sur le même ordinateur. C’est le déploiement côte à côte.

Le code MSIL n’est pas directement exécutable par un système d’exploitation comme Windows 2008 R2. Il doit être compilé en code natif pour être compris par le système d’exploitation.

Cette compilation peut être faite au fur et à mesure de l’appel des méthodes grâce à un compilateur Jusi-In-Time (JIT) fourni par le Common Language Runtime .NET (CLR).

Le code natif peut aussi être généré par anticipation en une fois afin d’améliorer les performances de l’application.

Exemple d’un code source en C#

hello-world-c#

Le résultat en MSIL (extrait):

hello-world-il

Il est difficile de faire un tri dans toutes les ressources proposées sur le socle .Net tant elles sont nombreuses et bien faites.

Vous trouverez, dans les pointeurs ci-dessous, des informations pour démarrer en douceur un développement .Net mais sur des bases solides:

Pour mettre en pratique, vous pouvez aussi suivre notre tutoriel qui explique, pas à pas, comment créer un WebPart Hello World avec Visual Studio 2010.

PowerShell et SharePoint

A force de jouer avec les cmdlets Windows PowerShell de SharePoint, nous y avons pris goût 🙂

Avant de les utiliser, allez dans Tous les programmes > Microsoft SharePoint 2010 Products > SharePoint 2010 Management Shell (à exécuter en tant qu’administrateur).

Vous pourriez aussi lancer la commande PowerShell de Windows et tapez Add-PSSnapin Microsoft.SharePoint.PowerShell pour récupérer les cmdlets SharePoint.

Dans le modèle Objet de SharePoint, faites attention car SPSite est une collection de sites, tandis que SPWeb représente un site (ou un sous-site).

La première cmdlet à connaître est celle qui donne l’aide sur l’aide: Get-Help Get-Help. Les fichiers d’aide sont au format XML. Ils se trouvent dans le dossier C:/Program Files/Common Files/Microsoft Shared/Web Server Extensions/14/CONFIG/POWERSHELL/Help/fr-fr pour la version française.

D’autres exemples de cmdlet utiles:

  • Liste de toutes les cmdlets de SharePoint: Get-Command -PSSnapin Microsoft.SharePoint.PowerShell. Pour connaître leur nombre: @(Get-Command -PSSnapin Microsoft.SharePoint.PowerShell).count.
  • Liste de toutes les méthodes et propriétés d’un objet du Modèle Objet de SharePoint (par exemple Get-SPSite): Get-SPSite | Get-Member. La même commande pour Get-SPWeb: Get-SPSite | Get-SPWeb | Get-Member.
  • Affiche toute l’aide d’une commande (par exemple Get-SPSite): Get-Help Get-SPSite -Full. Pour avoir uniquement les exemples: Get-Help Get-SPSite -Examples
  • Liste des services SharePoint avec leurs états: Get-SPServiceInstance
  • Liste des bases de données: Get-SPDatabase
  • Liste de toutes les collections de sites et de leurs bases de données respectives: Get-SPSite -Limit All | select url, contentdatabase. Si vous omettez -Limit All, la requête ne renvoie que les 200 premiers objets.
  • Volume de stockage d’une collection de sites: Get-SPSite | select url, @{Expression={$_.Usage.Storage}}
  • Liste des sites basés sur un certain modèle de site (par exemple un site d’équipe): Get-SPSite -Limit All | Get-SPWeb -Filter {$_.Template -eq « STS#00 »}
  • Liste des modèles de sites de la ferme: Get-SPWebTemplate

Il existe bien d’autres cmdlets intéressantes.

Les cmdlets sont susceptibles d’utiliser une très grande quantité de mémoire. Aussi, afin d’éviter une fuite mémoire, vous pouvez utiliser les cmdlets Start-SPAssignment et Stop-SPAssignment. Ces cmdlets implémentent l’interface IDisposable afin de libérer la mémoire qui n’est plus utile. Voici deux exemples tirés de l’aide de la commande Get-SPSite qui utilisent la méthode d’affectation de collection :

Start-SPAssignment -Global
$s = Get-SPSite
$s.url
Stop-SPAssignment -Global

L’exemple ci-dessous utilise une méthode moins consommatrice de mémoire que la précédente grâce à des variables nommées :

$o = Start-SPAssignment
$s = $o | Get-SPSite
$s.url
Stop-SPAssignment $o

Lorsqu’on débute en PowerShell, et même après, le paramètre -WhatIf est précieux car il simule l’exécution de la cmdlet. Par exemple, la commande Get-SPSite | Remove-SPSite -WhatIf vous retournera WhatIf : Opération « Remove-SPSite » en cours sur la cible « http://mw41 », sans supprimer la collection de site. La difficulté est de savoir où positionner le paramètre -WhatIf quand les commandes sont imbriquées.

Vous trouverez ci-dessous, un programme en téléchargement libre qui:

  • Stocke les paramétres de configurations des fichiers journaux SharePoint dans un premier fichier texte,
  • Modifie la durée de conservation des journaux, ainsi que d’autres paramétres,
  • Stocke à nouveau les paramétres de configurations des fichiers journaux dans un nouveau fichier texte,
  • Compare avec une commande PowerShell les deux fichiers.

SPDiagnosticConfigParams_V1_0_0.zip