Ce support sur les fondamentaux de Windows PowerShell (toutes versions) et de PowerShell Core (versions multiplateforme et Open Source) a été écrit par les fondateurs de la communauté PowerShell francophone (www.powershell-scripting.com). Il s'adresse aux professionnels de l'informatique désireux de s'initier aux techniques du scripting. Ce livre propose une approche progressive et didactique afin que les vrais débutants, c'est-à-dire ceux n'ayant...
Ce support sur les fondamentaux de Windows PowerShell (toutes versions) et de PowerShell Core (versions multiplateforme et Open Source) a été écrit par les fondateurs de la communauté PowerShell francophone (www.powershell-scripting.com). Il s'adresse aux professionnels de l'informatique désireux de s'initier aux techniques du scripting. Ce livre propose une approche progressive et didactique afin que les vrais débutants, c'est-à-dire ceux n'ayant jamais pratiqué PowerShell, puissent démarrer un apprentissage en douceur et acquérir de solides bases qui leur permettront de devenir autonomes. Les "faux débutants" y trouveront également leur compte car ils pourront parfaire leurs connaissances à travers les nombreuses bonnes pratiques que les auteurs ont pris soin de distiller au fil des chapitres.
Ce livre traite des bases du langage et n'est donc pas dépendant d'une version particulière de PowerShell. Lorsqu'il existe des différences d'implémentation, celles-ci sont mises en lumière et explicitées afin que les scripts puissent être portables et retro-compatibles si nécessaire.
À travers les neuf premiers chapitres, le lecteur découvrira les notions essentielles pour bien démarrer telles que : la manipulation des objets, les types de variables, les opérateurs, les tableaux, les boucles et structures conditionnelles, les fonctions, les profils, etc. Ensuite, le chapitre sur les snapins, les modules et l’accès à la PowerShell Gallery expliquera comment enrichir PowerShell avec des commandes supplémentaires. Un chapitre conséquent traite de la gestion des erreurs et du débogage. Celui-ci donnera au lecteur les bonnes techniques ainsi que les trucs et astuces à connaître pour apporter de la robustesse à ses scripts. La sécurité étant une préoccupation permanente, elle est détaillée dans un chapitre dédié. Le chapitre sur le framework .NET et .NET Core montrera que les capacités de PowerShell sont pratiquement illimitées. Un important chapitre est consacré aux technologies dites de remoting qui autorisent l'exécution de commandes et de scripts PowerShell à distance : celui-ci précisera comment bien aborder ces technologies notamment sur l'aspect du paramétrage (tant sur WinRM que sur SSH) et sur les pièges à éviter (rebond, etc.).
Enfin, les derniers chapitres permettront au lecteur de mettre en œuvre PowerShell dans le monde de l'entreprise à l'aide de nombreux cas concrets d'utilisation, et de découvrir l'écosystème PowerShell à travers la présentation d'outils tiers et d'acteurs importants du marché.
Des éléments complémentaires sont en téléchargement sur le site www.editions-eni.fr et sur le site de la communauté PowerShell francophone : PowerShell-Scripting.com.
Les chapitres du livre :
Avant-propos – Introduction – À la découverte de PowerShell – Manipulation des objets – Variables et types de données – Opérateurs – Tableaux – Boucles et conditions – Fonctions et scripts – Gestion des fichiers et des dates – Profils PowerShell – Snapins, modules et PowerShell Gallery – Gestion des erreurs et débogage – Sécurité – Framework .NET et .NET Core – CMI / WMI - Exécution à distance – Études de cas – Ressources complémentaires – Conclusion – Annexes
2.2 Différences de comportement entre versions de PowerShell
2.2.1 Collections d’objets
2.2.2 Expansion automatique des propriétés des éléments d’une collection
2.2.3 Where-Object et Foreach-Object simplifiés
2.3 Sélection/récupération des résultats
2.3.1 Récupération des n premiers objets
2.3.2 Récupération des n derniers objets
2.3.3 Récupération des objets uniques
2.3.4 Récupération d’une propriété particulière
2.3.5 Sélection d’objets d'un tableau basée sur leur valeur d'index
2.3.6 Examen de tous les objets d’une collection
2.3.7 Regroupement d’objets
2.3.8 Tri des objets
2.3.9 Comptage/mesure des objets
2.3.10 Comparaison d’objets
2.4 Filtrer les objets
3. Formatage des objets pour l'affichage
3.1 Format-List
3.1.1 Affichage sélectif des propriétés d'un objet
3.1.2 Affichage de toutes les propriétés disponibles d'un objet
3.2 Format-Table
3.2.1 Taille automatique d'un tableau
4. Création d'objets personnalisés
4.1 Transformation d’un objet existant
4.2 Création d’un objet à partir de rien
4.3 Ajout de membres
4.3.1 Ajout d’une propriété
4.3.2 Ajout d’une méthode
4.4 Création d’une collection d’objets personnalisés
Variables et types de données
1. Les variables
1.1 Création et affectation
1.2 Déterminer le type d’une variable
1.3 Accéder au contenu d’une variable
2. Les constantes
3. Types de données
4. Affectation manuelle de types et transtypage
4.1 Conversion d’un nombre décimal en hexadécimal
4.2 Conversion d’un nombre décimal en octal (base 8)
4.3 Conversion d’un nombre décimal en binaire (base 2)
5. Rendre obligatoires la déclaration et l’initialisation des variables
6. Variables prédéfinies
6.1 Variables automatiques
6.2 Variables de préférence
7. Portée des variables
7.1 Portée globale (global:)
7.2 Portée locale (local:)
7.3 Portée script (script:)
7.4 Portée privée (private:)
7.5 Portée using (using:)
7.6 Portée workflow (workflow:)
8. Quantificateurs d’octets
Opérateurs
1. Introduction
1.1 Opérateurs arithmétiques
2. Opérateurs de comparaison
2.1 Comparaison sur des scalaires
2.2 Comparaison sur des tableaux
3. Opérateurs de comparaison générique
4. Opérateur de comparaison des expressions régulières
4.1 Opérations sur les scalaires
4.2 Opérations sur les tableaux
5. Opérateur de plage
6. Opérateurs d’appartenance
7. Opérateur de remplacement
7.1 Remplacements à l’aide d’une expression régulière
7.2 Remplacements appliqués sur un tableau
8. Opérateurs de type
9. Opérateurs logiques
10. Opérateurs binaires
11. Opérateurs d’affectation
12. Opérateurs de redirection
13. Opérateurs de fractionnement et de concaténation
14. Opérateur de format -f
14.1 Notions de base
14.2 Aller plus loin avec les formateurs de chaîne
15. Récapitulatif sur les opérateurs
Tableaux
1. Introduction
2. Tableaux à une dimension
2.1 Initialiser un tableau vide
2.2 Initialiser un tableau avec des valeurs
2.3 Lire un tableau à une dimension
2.4 Concaténer deux tableaux
2.5 Ajouter un élément à un tableau
2.6 Modifier la valeur d’un élément
2.7 Supprimer un élément
2.8 Déterminer le nombre d’éléments d’un tableau
2.9 Convertir en chaîne le contenu d’un tableau
3. Tableaux à plusieurs dimensions
4. Tableaux associatifs
4.1 Tableaux associatifs standards
4.1.1 Déclarer un tableau associatif vide
4.1.2 Initialiser un tableau associatif avec des données
4.1.3 Ajout de données à un tableau associatif
4.1.4 Parcours d’un tableau associatif
4.2 Tableaux associatifs ordonnés
Boucles et conditions
1. Les boucles
1.1 Boucle While
1.2 Boucle Do-While
1.3 Boucle Do-Until
1.4 Boucle For
1.5 Boucle Foreach
1.5.1 Première technique
1.5.2 Seconde technique
2. Structure conditionnelle If, Else, ElseIf
3. Switch
3.1 Structure simple
3.2 Structure à base de sous-expressions
3.3 Structure à base d’expressions régulières
Fonctions et scripts
1. Fonctions
1.1 Anatomie d’une fonction
1.2 Utilisation des arguments
1.3 Utilisation des paramètres
1.4 Retour de valeurs
1.4.1 Retourner une valeur scalaire
1.4.2 Retourner un objet
1.5 Introduction aux « fonctions avancées »
1.5.1 Différences entre les fonctions classiques et les fonctions avancées
1.5.2 Attributs de validation des paramètres
2. Scripts
2.1 Constitution d’un script
2.2 Commentaires
2.3 Exécution d’un script
2.4 La directive #Requires
2.5 Prise de conscience de l’environnement d’exécution (contexte)
2.6 Internationalisation
3. DotSourcing
4. Aide intégrée aux scripts et fonctions
Gestion des fichiers et des dates
1. La gestion de fichiers
1.1 Formats d’encodage des fichiers texte
1.2 Différences Windows PowerShell 5.x / PowerShell Core
1.3 Bonnes pratiques
1.4 Écriture de données dans un fichier
1.4.1 Fichiers texte avec Out-File
1.4.2 Redirection du flux standard
1.4.3 Création de fichiers binaires avec Set-Content
1.5 Lecture de données avec Get-Content
1.6 Recherche de contenu dans un fichier avec Select-String
1.7 Gestion des fichiers CSV
1.7.1 Import/export de données
1.7.2 Conversion de données au format CSV
1.7.3 Conversion de données à partir du format CSV
1.8 Gestion des fichiers XML
1.8.1 Chargement d’un fichier XML
1.8.2 Gestion du contenu
1.8.3 Export d’objets au format XML
1.8.4 Sérialisation/désérialisation avec les commandes *-CliXML
1.9 Import/export de données au format JSON
1.9.1 Export de données
1.9.2 Import de données
1.10 Export de données en tant que page HTML
1.11 Export de données avec Out-GridView
2. Dates
2.1 Manipulation des objets DateTime
2.2 Formatage des dates
2.2.1 Formats standards
2.2.2 Formats personnalisés
2.3 Manipulation des dates
2.3.1 Créer une date
2.3.2 Modifier une date
2.3.3 Comparer des dates
2.3.4 Calculer un intervalle entre deux dates
2.3.5 Conversion d’une date exprimée en ticks
Profils PowerShell
1. Introduction
2. Profils disponibles
3. Ordre d'application des profils
4. Création d’un profil
5. Personnalisation de l'environnement
5.1 Modification du prompt
5.1.1 Un prompt haut en couleur
5.1.2 Un prompt toujours à l'heure
5.2 Modification de la taille de la fenêtre
5.3 Modification des couleurs
5.4 Modification du titre de la fenêtre
5.5 Exemple de profil complet
6. Exécuter PowerShell sans profil
Snap-ins, modules et PowerShell Gallery
1. Introduction
2. Les snap-ins
2.1 Lister les snap-ins installés
2.2 Importer un snap-in
2.3 Lister les commandes d'un snap-in
2.4 Décharger un snap-in
3. Les modules
3.1 Installer un module
3.2 Lister les modules
3.3 Charger/importer un module
3.4 Préfixer les commandes d'un module
3.5 Lister les commandes d'un module
3.6 Tracer l’utilisation des modules
3.7 Décharger un module
4. PowerShell Gallery
4.1 Qu’est-ce que c’est ?
4.2 Quid de la sécurité ?
4.3 Comment accéder à la galerie ?
4.3.1 Le site www.powershellgallery.com
4.3.2 Le module PowerShellGet
4.4 Rechercher un module
4.5 Sauvegarder un module
4.6 Installer un module
4.7 Désinstaller un module
4.8 Récupérer la liste des modules installés
4.9 Mettre à jour un module
4.10 Publier un module
4.10.1 Obtention de la clé d’API
4.10.2 Création du manifeste de module
4.10.3 Publication du module dans la galerie
Gestion des erreurs et débogage
1. Introduction à la gestion des erreurs et au débogage
2. La gestion des erreurs
3. Les erreurs non critiques
3.1 Variable de préférence : $ErrorActionPreference
3.2 Paramètre -ErrorAction et les paramètres communs
3.3 Consignation des erreurs
3.4 Le type ErrorRecord
3.5 Redirection de l'affichage des messages d'erreur
3.5.1 Redirection dans un fichier texte
3.5.2 Redirection dans une variable
3.5.3 Redirection des erreurs vers $null
3.6 Interception des erreurs non critiques
3.6.1 Cas général
3.6.2 Cas des exécutables externes
4. Les erreurs critiques
4.1 Interception des erreurs critiques avec Try-Catch-Finally
4.2 Déterminer le type des erreurs critiques
4.3 Générer des exceptions personnalisées
5. Le débogage
5.1 Affichage d’informations durant l’exécution
5.1.1 Affichage de messages en mode verbose
5.1.2 Affichage de messages en mode debug
5.1.3 Affichage de messages en mode warning
5.1.4 Affichage de messages d’informations
5.2 Forcer la définition des variables
5.3 Exécution pas à pas
5.3.1 Dans la console PowerShell classique
5.3.2 Dans la console PowerShell ISE
5.4 Mode trace de Set-PSDebug
5.5 Trace-Command
Sécurité
1. La sécurité : pour qui ? Pourquoi ?
2. Les risques liés au scripting
3. Optimiser la sécurité PowerShell
3.1 La sécurité PowerShell par défaut
3.2 Les stratégies d'exécution
3.2.1 Les différentes stratégies d'exécution
3.2.2 Les étendues des stratégies d'exécution
3.2.3 Identifier la stratégie d'exécution courante
3.2.4 Appliquer une stratégie d'exécution
3.3 Scripts provenant d'Internet
3.4 Les Alternate Data Streams (ADS)
3.4.1 Les origines
3.4.2 Créer et lire les ADS
3.4.3 Observer et comprendre les ADS de vos fichiers .ps1
3.4.4 Modifier le ZoneId ou comment transformer un script distant en un script local
3.5 Chaînes sécurisées
3.5.1 Sécuriser une chaîne
3.5.2 Lire une chaîne sécurisée
3.6 Chiffrement
3.6.1 Chiffrer une chaîne
3.6.2 Déchiffrer une chaîne
3.7 Gestion des credentials
3.8 Demander la saisie d’un mot de passe de façon sécurisée
3.8.1 Utilisation de la commande Read-Host
3.8.2 Utilisation de la commande Get-Credential
4. Signature des scripts
4.1 Les signatures numériques
4.2 Les certificats
4.2.1 Acheter un certificat
4.2.2 Créer un certificat autosigné
4.3 Signer votre premier script
4.4 Exécuter des scripts signés
5. Gérer les stratégies d'exécution de PowerShell via les stratégies de groupe
Framework .NET et .NET Core
1. Introduction à .NET
2. Le framework .NET
3. .NET Core
4. PowerShell Core vs Windows PowerShell, à quel saint se vouer ?
5. Utiliser des objets .NET avec PowerShell
5.1 Créer une instance de classe (Objet)
5.2 Les assemblies
5.3 Charger une assembly
5.4 Lister les types contenus dans les assemblies
6. Tirer parti de la puissance de .NET
6.1 Wake-on-LAN
6.2 Compresser/décompresser un dossier
6.3 Créer une bulle d’informations contextuelle (Balloon Tip)
CIM / WMI
1. Introduction
2. Des standards, encore des standards, mais pour quoi faire ?
2.1 Qu'est-ce que WMI ?
2.2 Qu’est-ce que CIM ?
2.3 CIM vs WMI
2.4 Et concrètement, cela donne quoi ?
2.4.1 Configuration de serveurs DELL via iDRAC
2.4.2 Gestion de systèmes d’exploitation Linux depuis Windows
2.4.3 Gestion de Windows Server 2012/R2 depuis Linux
2.5 Difficultés à surmonter
3. Architecture générale et terminologie
4. Commandes de la famille CIM
4.1 Jeu de commandes
4.2 Découverte des classes
4.2.1 Lister toutes les classes
4.2.2 Rechercher des classes contenant un mot particulier
4.3 Découverte des membres d’une classe
4.3.1 Lister les membres d’une classe
4.3.2 Rechercher des membres d’une classe
4.4 Récupération d’une ou plusieurs instances
4.5 Récupération d’une ou plusieurs instances avec filtre WQL/CQL
4.6 Invocation d’une méthode
5. Commandes de la famille WMI
5.1 Recherche de classes et de membres
5.2 Récupération d’une ou plusieurs instances
6. Établissement de sessions avec des machines distantes
6.1 Commande New-CimSession
6.2 Commande New-CimSessionOption
6.3 Commande Get-CimSession
6.4 Commande Remove-CimSession
7. Monitoring de ressources avec la gestion des événements
7.1 Surveiller la création d'un processus local
7.2 Surveiller la création d'un processus à distance
7.3 Surveiller l’espace disque d'un serveur distant
7.4 Monitorer la suppression de fichiers
7.5 Quelques explications complémentaires
8. Gestion basée sur les URI
8.1 Anatomie d’un URI
8.2 Jeux de commandes PowerShell
8.2.1 Jeu de commandes de la famille WSMan
8.2.2 Jeu de commandes de la famille CIM
8.3 Test de la bonne configuration d’un système
8.4 Envoi de requêtes CIM/WMI via un URI
8.4.1 Lister les services d'une machine distante
8.4.2 Déterminer la date d'installation d'une machine distante
9. Boîte à outils graphiques pour l’exploration de la base CIM/WMI
9.1 Testeur WMI (Wbemtest.exe)
9.2 CIM Studio
9.3 SAPIEN WMI Explorer 2015
Exécution à distance
1. Introduction
2. Communications à distance du Framework .NET
2.1 Prérequis
2.2 Déterminer les commandes à distance du Framework .NET
2.3 Jeu de commandes
2.4 Envoi de commandes à distance
3. Communications à distance Windows PowerShell (WinRM)
3.1 Authentification et chiffrement des communications
3.1.1 Dans un domaine Active Directory
3.1.2 Hors domaine Active Directory
3.1.3 Modification du type d’authentification WinRM
3.2 Prérequis
3.3 WinRM en environnement Active Directory
3.3.1 Configuration manuelle
3.3.2 Activation du service WinRM
3.4 Configuration du service WinRM par GPO
3.5 WinRM en environnement hors domaine
3.5.1 Configuration de la liste des machines de confiance (trusted hosts list)
3.5.2 Désactivation de l’UAC
3.5.3 Communiquer en HTTPS
3.6 Problématique du "double saut" (notion de rebond)
3.6.1 CredSSP
3.6.2 Double authentification
3.6.3 Point de terminaison délégué (mode RunAs)
3.6.4 Délégation Kerberos contrainte basée sur une ressource
3.7 Gestion des configurations des sessions
3.7.1 Généralités
3.7.2 Configurations de session par défaut
3.7.3 Modification des permissions
3.7.4 Création d’une configuration de session personnalisée
3.7.5 Création d’une configuration de session déléguée (RunAs)
3.8 Sessions à distance
3.9 Exécution de commandes à distance
3.10 Sessions WinRM en mode déconnecté
3.11 Exécution de scripts à distance
3.12 Copie de fichiers à travers une session de communication
3.13 Ouverture d'une session interactive PowerShell à distance
3.13.1 Enter-PSSession
3.13.2 Powershell ISE (Integrated Scripting Environment)
3.14 Importation de commandes à distance
4. Communications à distance sur SSH (PowerShell Core uniquement)
4.1 Installation d’OpenSSH sur Windows
4.2 Installation d’OpenSSH sur Linux
4.3 Exécution de commandes et scripts à distance
4.3.1 Établissement d’une session de communication
4.3.2 Envoi de commandes à distance
4.3.3 Exécution d’un script à distance
4.4 Ouverture d’une session interactive à distance
4.5 Copie de fichiers à travers une session de communication
5. Conclusion
Études de cas
1. Trouver les comptes d'ordinateurs périmés dans AD DS
1.1 Problématique
1.2 Difficultés à surmonter
1.3 Solution
2. Lister les comptes d'utilisateurs inactifs dans AD DS
2.1 Problématique
2.2 Solution : faire du ménage !
3. Changer le mot de passe Administrateur local à distance
3.1 Problématique
3.2 Difficultés à surmonter
3.3 Solution 1 : DCOM/RPC
3.4 Solution 2 : WSMan/WinRM
4. Surveiller l'arrivée d'un événement dans le journal
4.1 Problématique
4.2 Solution
5. Créer des comptes utilisateurs par lots
5.1 Problématique
5.2 Solution
6. Vérifier la version logicielle d'une application à distance
6.1 Problématique
6.2 Solution
7. Mettre à jour la configuration réseau d'un ensemble de machines
7.1 Problématique
7.2 Solution
7.3 Test de la solution
8. Trouver les certificats expirés
8.1 Problématique
8.2 Solution 1 : Job PowerShell planifié local
8.3 Solution 2 : Interrogation depuis un point central
9. Déléguer la gestion d’un serveur (quelques commandes seulement)
9.1 Problématique
9.2 Solution
Ressources complémentaires
1. Ressources web
1.1 Sites Internet francophones
1.1.1 PowerShell-Scripting.com : la communauté PowerShell francophone
1.1.2 French PowerShell User Group
1.2 Sites Internet anglophones
1.2.1 PowerShell Team Blog
1.2.2 Dépôt GitHub PowerShell
1.2.3 PowerShell Magazine
2. Outils tiers
2.1 PowerShell Plus
2.2 PowerShell Studio 2017
2.3 PowerGadget
2.4 PowerShell Universal Dashboard
Annexes
1. Syntaxe des expressions régulières
2. Liste des verbes approuvés (Get-Verb)
3. Liste des sources de trace (Get-TraceSource)
Index
Arnaud PETITJEAN
Arnaud PETITJEAN est Ingénieur Système DevOps spécialiste en infrastructures Microsoft au sein d'une grande entreprise française de recherche. Pour son expertise et ses nombreuses contributions communautaires, Microsoft lui délivre le titre de MVP (Most Valuable Professional) Cloud and Datacenter Management depuis l'année 2007. Il est à ce titre en relation directe avec l'équipe PowerShell chez Microsoft Corp à Redmond.
Robin Lemesle est Ingénieur Système, expert en Virtualisation et Scripting sur les environnements Windows Server, au sein de la Française des Jeux. Sa solide expérience en administration système s'allie à ses qualités pédagogiques pour proposer aux lecteurs une approche à la fois accessible et complète.