PowerShell
Fonctionnalités avancées
2e édition
Éditions Eni
Avant-propos
1. À propos de PowerShell17
2. À propos du livre17
Introduction
1. Pourquoi automatiser ?21
2. Infrastructure as Code et cloud22
3. L'entrée dans l'open source22
4. Le poids d'une communauté23
5. À propos de l'auteur23
Chapitre 1
PowerShell et la gestion des versions
1. Introduction25
1.1 Les versions en détail26
1.2 GitHub27
1.3 .NET Core27
2. Installation de PowerShell Core28
2.1 Téléchargement des sources depuis GitHub28
2.2 Installation sous Windows29
2.3 Installation sous Linux31
3. Gestion des mises à jour32
3.1 Sous Windows33
3.2 Sous Linux33
4. Les nouveautés, dépréciation et limitations de PowerShell 733
4.1 Nouveautés33
4.2 Dépréciation37
4.3 Limitations37
5. Développer en PowerShell avec Visual Studio Code38
5.1 Installation de Visual Studio Code38
5.2 L'interface de Visual Studio Code39
5.3 Extension PowerShell40
5.4 Complément d'extension41
5.5 Le débogueur42
5.6 Utilisation de Git47
6. Scripter en fonction de l'environnement49
7. Fonctionnalités expérimentales50
Chapitre 2
Fonctions avancées
1. Introduction53
2. Structure54
2.1 Param54
2.1.1 Attribut Parameter55
2.1.2 Attributs59
2.1.3 Attributs de validation60
2.2 CmdletBinding()73
2.3 Type de sortie (OutputType)82
2.4 Begin/Process/End/Clean83
3. Mise en situation84
3.1 Jeux de paramètres84
3.2 Pipeline87
3.2.1 Déterminer les commandes qui acceptent le pipeline87
3.2.2 Quand une commande n'accepte pas le pipeline91
3.2.3 L'implémentation du pipeline92
3.2.4 ValueFromPipeline93
3.2.5 ValueFromPipelineByPropertyName97
4. Paramètre Dynamique99
4.1 Déclaration100
4.2 Nouvelle collection d'attributs100
4.3 Définition et publication du paramètre dynamique101
4.4 En résumé102
4.5 Aller plus loin103
4.5.1 Logique d'affichage103
4.5.2 Ajout d'attribut de validation104
4.6 Limitations et cas d'utilisation106
5. ArgumentCompleter et Dynamic ValidateSet106
5.1 ArgumentCompletions106
5.2 ArgumentCompleter107
5.2.1 Structure107
5.2.2 Ajout de la saisie utilisateur110
5.2.3 Utilisation de PSBoundParameter111
5.2.4 Utiliser une fonction114
5.3 Dynamic ValidateSet117
6. Register-ArgumentCompleter117
7. Splatting120
Chapitre 3
Création de modules
1. Introduction123
2. Module dynamique124
3. Module binaire127
4. Module script128
4.1 Conversion d'un script en module130
4.2 Convention de nommage130
4.3 Internationalisation et partage du module132
4.3.1 Structure et nommage des dossiers132
4.3.2 Format des données et contenu des fichiers133
4.3.3 La commande Import-LocalizedData134
4.3.4 Gestion de l'erreur en cas de fichier absent136
4.3.5 Section Data136
5. Manifeste de module137
5.1 Création du manifeste138
5.2 Gestion des versions145
5.3 Gestion des versions du framework .NET147
5.4 Gestion du contenu additionnel148
5.5 Test de conformité d'un manifeste148
6. Exportation des membres d'un module150
6.1 La commande Export-ModuleMember150
6.2 Comportement particulier151
7. Structure multifichier154
8. Passer au Build avec Sampler156
8.1 Création d'un module simple156
8.2 Ajout d'une fonction158
8.3 Build du module159
8.4 Pour la suite150
Chapitre 4
Gestion des modules et des packages
1. Introduction161
2. Module PackageManagement163
2.1 Ajout du premier fournisseur164
2.2 Recherche d'un package165
2.3 Installation d'un package168
2.3.1 Depuis Chocolatey168
2.3.2 Depuis un MSI ou en MSU169
2.4 Listing des packages installés169
2.5 Mise à jour d'un package170
2.6 Suppression d'un package170
3. Module PowerShellGet171
3.1 Mise à jour de PowerShellGet pour le support du TLS171
3.2 Recherche d'une ressource172
3.2.1 Versioning.173
3.2.2 Contenu d'une ressource174
3.3 Installation d'une ressource176
3.4 Mise à jour d'une ressource177
3.5 Suppression d'une ressource177
4. Création d'un dépôt178
4.1 Via un simple partage réseau178
4.1.1 PackageManagement179
4.1.2 PowerShellGet180
4.1.3 Organisation du partage183
4.2 Via un site web183
4.2.1 Installation183
4.2.2 Création utilisateur189
4.2.3 Création du premier feed (dépôt)192
4.2.4 Enregistrement en tant que source et publication d'un module194
Chapitre 5
Objets personnalisés et types standards
1. Introduction197
2. Objets personnalisés198
2.1 Création d'un objet personnalisé198
2.2 Ajout d'un membre199
2.2.1 Ajout d'une propriété200
2.2.2 Ajout d'une méthode200
2.3 Création d'une collection d'objets201
2.4 Transformation d'un objet existant en objet personnalisé202
3. Types standards204
3.1 Ajout de membre via un fichier .types.ps1xml205
3.1.1 Fichier .types.ps1xml206
3.1.2 Ajout d'une propriété207
3.1.3 Ajout d'une méthode209
3.2 Ajout de membre seulement avec Update-TypeData210
3.2.1 Ajout d'une propriété211
3.2.2 Ajout d'une méthode211
3.3 Pour aller plus loin211
4. Formatage213
4.1 Fichiers de formatage par défaut214
4.2 Objet personnalisé216
4.2.1 Personnalisation du type216
4.2.2 Application d'un fichier de formatage218
4.3 Type standard220
4.3.1 Modification du fichier de formatage par défaut222
4.3.2 Application du fichier de formatage226
Chapitre 6
Classes
1. Introduction229
2. Création d'une classe230
2.1 Mot-clé Class230
2.2 Propriété231
2.3 Méthode232
2.4 Constructeur233
2.5 Visibilité235
3. Surcharge de méthode (overload)236
4. Statique238
5. Portée des variables241
5.1 Propriété242
5.2 Méthode244
5.2.1 Globale244
5.2.2 Script245
6. Héritage247
7. Création enum249
7.1 Mot-clé enum249
7.2 Manipulation des valeurs250
8. Formatage251
9. Intégration dans un module251
10. Mot-clé Using252
11. Utilisation des classes sur la validation de paramètre253
11.1 ValidateSet Dynamique253
11.2 ArgumentCompleter255
Chapitre 7
Jobs et parallélisation
1. Introduction259
2. Travaux en arrière-plan locaux (Backgroundjob)260
2.1 Création d'un premier job261
2.2 Récupération du résultat d'un job264
2.3 Arrêt d'un job265
2.4 Suppression d'un job267
2.5 Erreurs et jobs268
3. Travaux en arrière-plan basés sur les threads (Threadjob)271
3.1 Utilisation des ThreadJob271
3.2 Comparatif de performance avec les Backgroundjob273
4. Travaux en arrière-plan distants (Remotejob)274
4.1 Lancement d'un job distant274
4.2 Multiples destinations275
4.3 Attendre la fin de l'exécution des jobs276
5. Travaux planifiés (PSScheduledJob)277
5.1 Création d'un travail planifié278
5.2 Mise en place d'un déclencheur (trigger)280
5.3 Modification des options281
6. Workflows (PSWorkflowJob)282
7. ForEach-Object283
8. PowerShell API283
Chapitre 8
Workflows
1. Introduction287
1.1 Qu'est-ce qu'un workflow ?288
1.2 Comment fonctionne-t-il ?288
2. Création d'un workflow289
2.1 Mot-clé workflow289
2.2 Gestion des paramètres290
2.2.1 Paramètres communs290
2.2.2 Bloc param291
2.2.3 Paramètres propres aux workflows292
2.3 Exécution à travers une session distante295
2.4 Exécution en tant que job296
3. Restrictions297
3.1 Restrictions de commande297
3.2 Restrictions sur les objets299
3.3 Restrictions de langage299
3.4 Mot-clé InlineScript301
3.4.1 Syntaxe301
3.4.2 Portée des variables303
4. Exécution en parallèle304
4.1 Bloc parallel304
4.2 Bloc sequence306
4.3 Mot-clé Foreach.309
5. Points de synchronisation310
6. Suspension d'un workflow313
7. Relance d'un workflow (suite à une suspension ou à un crash)315
8. Observation du contenu d'un workflow316
9. Intégration dans un module317
10. Workflow : pour qui ? pour quoi ?318
Chapitre 9
Desired State Configuration (DSC)
1. Introduction319
2. Versions et plateformes supportées par DSC320
3. Vue d'ensemble de la solution321
3.1 Terminologie321
3.2 Considérations générales322
3.3 Deux modes : PUSH et PULL322
3.3.1 PUSH322
3.3.2 PULL323
3.4 Configuration323
3.5 Présentation des ressources DSC325
3.6 Gestionnaire de configuration local (LCM)326
4. Ressources DSC326
4.1 Lister des ressources présentes327
4.2 Ressources intégrées328
4.2.1 Utilisation générale d'une ressource328
4.2.2 Cas particulier avec la ressource Script330
4.3 Extension des possibilités avec la DSC Community332
4.3.1 Suivi des nouveautés332
4.3.2 Interrogation de la PowerShell Gallery333
4.3.3 Installation depuis la PowerShell Gallery334
4.3.4 Politique de nommage des ressources DSC335
4.3.5 Ressources personnalisées336
4.3.6 Utilisation des ressources336
5. Création d'une première configuration336
5.1 Création rapide avec ISE336
5.2 Application d'une configuration339
5.3 Utilisation de paramètres340
5.4 Importation d'une ressource341
5.5 Données de configuration (Configuration Data)342
5.5.1 Définition d'une configuration environnementale342
5.5.2 Variables spéciales $ConfigurationJData, $AllNodes, $Nodes344
5.5.3 Prise en compte de la configuration environnementale347
5.5.4 Résumé347
6. Configuration du LCM349
6.1 Configuration courante349
6.2 Configuration du LCM350
6.3 Application d'une métaconfiguration356
7. Fichiers MOF357
7.1 Fichier MOF de configuration358
7.2 Fichier MOF de métaconfiguration359
8. Sécurité et contexte d'exécution (credentials)360
9. Sécurisation des credentials dans une configuration361
9.1 Prérequis361
9.2 Étapes de réalisation362
9.3 Données de configuration (Configuration Data)362
9.4 Configuration363
9.4.1 Écriture des configurations363
9.4.2 Génération des fichiers MOF364
9.4.3 Configuration du LCM366
9.4.4 Application de la configuration366
9.5 Obtenir l'empreinte d'un certificat de chiffrement366
10. Configuration d'un PULL Server367
10.1 Évolution du PULL Server367
10.2 PULL Server sous partage SMB367
10.3 PULL Server Web368
10.3.1 Prérequis368
10.3.2 Écriture de la configuration du PULL Server368
10.3.3 Deux modes de configuration pour le LCM372
10.3.4 Configuration du LCM en fonction de l'ID373
10.3.5 Configuration du LCM en fonction du nom376
10.3.6 Forcer une mise à jour de configuration378
10.4 Déploiement des ressources378
11. Test de conformité d'un noud380
12. Application de la dernière bonne configuration connue380
13. Principe avancé381
13.1 Ressource composite381
13.2 Configuration partielle383
13.2.1 Conception des configurations partielles384
13.2.2 configuration du LCM386
13.2.3 PUSH d'une configuration partielle387
13.2.4 PULL d'une configuration partielle388
13.2.5 Allier PUSH et PULL391
14. Écriture d'une ressource personnalisée392
14.1 Ressource personnalisée avec un fichier MOF392
14.1.1 Constitution d'une ressource basée sur un schéma MOF392
14.1.2 Aide à la création de ressources (xDSCResourceDesigner)393
14.1.3 Génération de la structure du module394
14.1.4 Écriture du fichier PSM1396
14.1.5 Déploiement de la ressource399
14.1.6 Vérification de la prise en compte de la ressource400
14.2 Ressource personnalisée avec les classes PowerShell400
14.2.1 Constitution d'une ressource basée sur une classe PowerShell400
14.2.2 PowerShell ISE à là rescousse401
14.2.3 Rédaction du fichier PSM1401
14.2.4 Génération et modification du manifeste404
14.2.5 Déploiement de la ressource404
14.3 Utilisation de la ressource personnalisée dans une configuration405
15. DSC sous Linux405
15.1 Prérequis405
15.1.1 Installation du package OMI406
15.1.2 Installation du package DSC406
15.2 Ressources DSC pour Linux406
15.3 Mise en place d'une session CIM407
15.4 Création de la configuration408
15.5 Application de la configuration408
15.6 Récupération de la configuration du LCM409
16. Maintenance et dépannage410
16.1 Forcer la réapplication d'une configuration410
16.2 État d'une configuration DSC410
16.3 Remise d'un système à son état d'origine411
16.4 Activation du mode Verbose412
Chapitre 10
Gestion avancée des fichiers
1. Introduction413
2. Gestion de l'archivage414
2.1 Compress-Archive414
2.2 Expand-Archive415
2.3 Avant PowerShell 5.1416
2.3.1 Compression d'un dossier416
2.3.2 Décompression d'une archive417
3. Lien symbolique417
3.1 Fichiers417
3.2 Dossiers418
4. Fichier temporaire421
5. Édition de fichiers distants422
6. Copie de fichiers à travers une session PowerShell427
7. Conversion d'un fichier plat en objet429
7.1 Mode basique429
7.2 Mode avancé431
Chapitre 11
Communication avec d'autres applications
1. Introduction437
2. Les technologies COM437
3. Manipulation des objets COM438
3.1 Recherche d'objets438
3.2 Création/instanciation d'un objet439
3.3 Utilisation d'une application COM441
3.3.1 Internet Explorer442
3.3.2 Microsoft Excel 2016445
3.3.3 Windows Script Host (WSH)449
Chapitre 12
Gestion à distance avancée
1. Introduction453
2. JEA (Just Enough Administration)453
2.1 Pourquoi JEA ?454
2.2 Prérequis454
2.3 Rappel455
2.3.1 Une session, c'est quoi ?455
2.3.2 Configuration d'une session (PowerShell 4.0 et versions antérieures)457
2.3.3 Ce qui change avec PowerShell 5.0461
2.4 Capacité de rôle462
2.4.1 Préparation462
2.4.2 Fichier de capacité de rôle463
2.4.3 Intégration dans un module466
2.4.4 Fusion des capacités de rôle468
2.5 Sessions470
2.5.1 Fichier de configuration de session470
2.5.2 Enregistrement d'une session475
2.5.3 Modification d'une session477
2.5.4 Utilisation des sessions478
2.6 Audit479
2.6.1 Conformité des configurations de session479
2.6.2 Transcription481
2.7 Configuration via DSC483
3. PowerShell Web Access485
3.1 Prérequis485
3.2 Installation486
3.3 Configuration488
3.3.1 Installation de l'application web488
3.3.2 Règles d'accès490
3.4 Utilisations491
3.5 Déconnexion d'une session494
3.6 Cas d'usage499
3.7 Limitations et futur de la fonctionnalité499
4. Session distante avec SSH500
4.1 Installation sous Windows500
4.2 Installation sous Linux502
4.3 Établissement de la connexion502
Chapitre 13
Création d'interfaces graphiques
1. Introduction505
1.1 Pourquoi une interface graphique ?505
1.2 Vers quoi se tourner ?506
2. Windows Forms507
2.1 Présentation des Windows Forms507
2.2 Réalisation d'une première Form508
2.3 Ajout d'une action à une Form511
2.3.1 Événements511
2.3.2 Menus513
2.4 Exemple de contrôle516
2.5 Création de graphiques avec MS Chart Controls521
3. Windows Presentation Foundation525
3.1 Création d'une interface sur Visual Studio526
3.2 Gestion des contrôles et de leurs événements530
3.3 Création de graphiques évolués avec LiveCharts534
3.4 Changement de thème avec MahApps539
4. Mise à jour d'une GUI via des runspaces545
Chapitre 14
Collecte de données de performances
1. Pourquoi et comment collecter des données de performances ?551
2. Windows Performance Logs and Alerts (PLA)552
3. Jeu de commandes PowerShell553
3.1 Listing des catégories de compteurs de performances553
3.2 Détermination du bon compteur555
3.3 Accès aux données de compteurs560
3.3.1 Contrôle du nombre de jeux de données et de la fréquence561
3.3.2 Collecte des données sur des ordinateurs distants563
3.4 Utilisation des jobs pour les tâches longues565
3.5 Sauvegarde des données de performances sur disque565
3.5.1 Exportation des données de performances au format binaire (BLG)566
3.5.2 Exportation des données de performances au format Excel (CSV)568
3.6 Manipulation d'un fichier d'export de données de performances569
4. Collecte de données à l'échelle de l'entreprise576
4.1 Création du fichier de configuration XML578
4.2 Création et déploiement d'un ensemble de collecteurs de données.585
4.2.1 Réalisation via logman585
4.2.2 Réalisation via l'objet COM PLA586
4.3 Gestion des ensembles de collecteurs de données587
4.3.1 Interrogation des ensembles de collecteurs de données existants587
4.3.2 Démarrage d'un ensemble de collecteurs de données589
4.3.3 Arrêt d'un ensemble de collecteurs de données589
4.3.4 Suppression d'un ensemble de collecteurs de données590
Chapitre 15
Manipulation d'annuaires
1. Introduction591
2. Module Active Directory592
2.1 Prérequis592
2.2 Recherche d'objets593
2.2.1 Recherche basée sur l'identité593
2.2.2 Filtre générique594
2.2.3 Filtre LDAP596
2.3 Gestion des unités d'organisation599
2.3.1 Création d'une unité d'organisation599
2.3.2 Modification d'une unité d'organisation600
2.3.3 Suppression d'une unité d'organisation600
2.4 Gestion des utilisateurs600
2.4.1 Affichage de la liste des utilisateurs et de leurs propriétés601
2.4.2 Création d'un utilisateur603
2.4.3 Modification du mot de passe et activation d'un objet utilisateur existant604
2.4.4 Modification d'un attribut605
2.4.5 Suppression d'un utilisateur607
2.5 Gestion des groupes607
2.5.1 Affichage de la liste des groupes608
2.5.2 Création d'un groupe610
2.5.3 Gestion des membres611
2.5.4 Suppression d'un groupe614
2.6 Utilisation du provider Active Directory614
2.6.1 Exploration du provider615
2.6.2 Déplacement d'objets617
2.6.3 Modification d'objets618
2.6.4 Utilisation des commandes Active Directory618
2.6.5 Création d'un PSDrive vers un autre domaine618
3. ADSI619
3.1 Présentation d'ADSI619
3.2 Confusion avec Active Directory619
3.3 Encore utile aujourd'hui ?619
3.4 Interaction avec une base locale SAM620
3.4.1 Généralités621
3.4.2 Groupes locaux622
3.4.3 Utilisateurs locaux624
3.5 Active Directory Domain Services624
3.5.1 Connexion à l'annuaire624
3.5.2 Connexion à un domaine avec un utilisateur différent625
3.5.3 Recherche d'objets627
4. ADSIPS633
Index635