TP N°6 : Construire le module NordikaTools de A à Z

Sophie clôt cette section modules avec un ticket différent des précédents : “Cette fois, pas de nouveau service à vérifier. Je veux que tu rassembles proprement tout ce qu’on a codé depuis la section 5 dans un vrai module, que n’importe quel collègue pourra installer sur son poste.”

Objectif

Construire un module NordikaTools complet et fonctionnel : fichier .psm1 avec au moins deux fonctions, manifeste .psd1 généré et complété, et vérification que le module se charge correctement.

Ce TP utilise Get-Service et New-LocalUser plutôt que le module ActiveDirectory, pour rester réalisable même sans domaine AD à disposition. La logique reste strictement identique si vous remplacez New-LocalUser par New-ADUser sur un poste connecté à un domaine.

Consignes

Étape 1 — Créez le dossier attendu par PowerShell pour un module maison, nommé exactement NordikaTools.
Indice : revoyez la leçon 6.3, l’emplacement doit correspondre à l’un des chemins listés par $env:PSModulePath (vu en 6.1).

Étape 2 — Dans un fichier NordikaTools.psm1, recréez la fonction Test-ServiceCritique de la leçon 5.4, et ajoutez une nouvelle fonction New-CompteLocalSecurise qui crée un compte local (4.4) avec un mot de passe généré en SecureString, en utilisant try/catch (5.5) pour gérer le cas d’un compte déjà existant.

Étape 3 — Générez un manifeste .psd1 avec New-ModuleManifest, en précisant ModuleVersion, Author et Description.

Étape 4 — Modifiez manuellement le manifeste généré pour restreindre FunctionsToExport aux deux seules fonctions écrites à l’étape 2.

Étape 5 — Fermez et rouvrez votre console PowerShell, puis vérifiez que le module se charge automatiquement dès l’appel d’une de ses fonctions, sans Import-Module explicite.

Étape 6 (bonus) — Ajoutez une troisième fonction Get-VersionNordikaTools qui affiche simplement la version du module (ModuleVersion) définie dans le manifeste, en la récupérant dynamiquement avec Get-Module.

Voir la solutionMasquer la solution

Étape 1 :

$cheminModule = "$HOME\Documents\WindowsPowerShell\Modules\NordikaTools"
New-Item -Path $cheminModule -ItemType Directory -Force

Étape 2 — NordikaTools.psm1 :

function Test-ServiceCritique {
    param ([string]$NomService)

    $service = Get-Service -Name $NomService -ErrorAction SilentlyContinue
    if ($service.Status -eq "Running") {
        Write-Output "$NomService : OK"
    } else {
        Write-Warning "$NomService est arrêté"
    }
}

function New-CompteLocalSecurise {
    param (
        [Parameter(Mandatory = $true)]
        [string]$NomUtilisateur
    )

    $motDePasse = ConvertTo-SecureString "TempNordika$(Get-Random -Maximum 9999)!" -AsPlainText -Force

    try {
        New-LocalUser -Name $NomUtilisateur -Password $motDePasse -ErrorAction Stop
        Write-Output "Compte $NomUtilisateur créé avec succès"
    } catch {
        Write-Warning "Échec de création pour $NomUtilisateur : $($_.Exception.Message)"
    }
}

Étape 3 :

New-ModuleManifest -Path "$cheminModule\NordikaTools.psd1" `
                    -RootModule "NordikaTools.psm1" `
                    -ModuleVersion "1.0.0" `
                    -Author "Service IT Nordika" `
                    -Description "Fonctions internes de supervision et de gestion de comptes Nordika"

Étape 4 — dans le fichier .psd1 généré, repérez et modifiez la ligne :

FunctionsToExport = @('Test-ServiceCritique', 'New-CompteLocalSecurise')

Étape 5 :

Test-ServiceCritique -NomService "Spooler"

Si le module est correctement placé et nommé, cette commande fonctionne immédiatement dans une nouvelle console, sans Import-Module NordikaTools préalable — c’est l’auto-loading vu en 6.1.

Étape 6 (bonus) :

function Get-VersionNordikaTools {
    (Get-Module -Name NordikaTools).Version
}

Point de vigilance fréquent : si l’étape 5 ne fonctionne pas, la cause est presque toujours la même — un nom de dossier qui ne correspond pas exactement au nom du fichier .psm1 (sensible à la casse sur certains systèmes), ou un emplacement en dehors de $env:PSModulePath. Revérifiez ces deux points avant toute autre hypothèse.