De Novalink à AGEA

Les scripts qui me font gagner du temps au quotidien

Pendant mes premières expériences professionnelles chez Novalink, j’ai commencé à créer des scripts PowerShell et Bash pour automatiser certaines tâches répétitives. Au début, je les gardais simplement dans un dossier sans vraiment les organiser, sans commentaires, juste comme ça. C’était pratique pour retrouver rapidement une commande que j’avais déjà utilisée plutôt que de la chercher à nouveau sur Internet.

Mais c’est vraiment pendant mon alternance chez AGEA que j’ai pris conscience de quelque chose d’important : je réutilisais régulièrement les mêmes scripts d’une infrastructure à l’autre. Un script créé pour gérer les comptes utilisateurs chez Novalink pouvait parfaitement s’adapter à un besoin similaire chez AGEA avec seulement quelques modifications. Les mêmes problèmes revenaient dans des contextes différents, et je me retrouvais à chercher dans mes anciens scripts pour retrouver une solution que j’avais déjà codée quelques mois plus tôt.

C’est à ce moment-là que j’ai décidé de centraliser et d’organiser tous ces scripts dans un seul document que je pourrais consulter partout, que ce soit à l’école ou au travail. Je les ai rangés par catégories thématiques pour pouvoir retrouver rapidement celui dont j’avais besoin. Cette bibliothèque n’est pas figée, elle évolue constamment. J’y ajoute régulièrement de nouveaux scripts quand je rencontre de nouveaux besoins, et j’en retire d’autres qui ne sont plus pertinents. Je garde seulement ceux qui ont un véritable intérêt, soit pédagogique pour mon propre apprentissage, soit pratique parce qu’ils me font réellement gagner du temps ou résolvent des problèmes récurrents.

L’un des exemples les plus parlants de l’utilité de cette approche est un script tout simple qui force le mode de projection Windows en duplication. Depuis que nous l’avons déployé par GPO chez AGEA, nous avons évité environ 5 à 10 tickets par semaine sur nos cinq sites. Des enseignants qui nous contactaient parce qu’ils avaient un écran noir sur le vidéoprojecteur alors qu’ils n’avaient simplement pas pensé à vérifier le mode de projection. Un script de quelques lignes qui prend deux secondes à s’exécuter au démarrage, et qui nous épargne des dizaines d’interventions inutiles chaque mois. C’est exactement ce genre d’optimisation qui justifie cette démarche de capitalisation.

la paternité des scripts

Je tiens à être transparent sur une chose importante : tous ces scripts ne sont pas entièrement écrits par moi de A à Z. Certains s’appuient sur des exemples trouvés sur Internet, sur des discussions Reddit, sur de la documentation officielle Microsoft, ou sur des adaptations de solutions déjà éprouvées ailleurs. Par exemple, le script de réinitialisation de Windows Update vient d’un site fiable que j’ai trouvé lors d’un dépannage, et le script de suppression des profils utilisateurs anciens s’inspire de l’outil DelProf mais réécrit en PowerShell natif.

Ce qui compte pour moi, c’est que chaque script présent dans cette bibliothèque a été :

  • Compris : je ne garde jamais un script dont je ne comprends pas le fonctionnement
  • Adapté : je l’ajuste au contexte spécifique de l’infrastructure sur laquelle je travaille
  • Testé : je vérifie qu’il fonctionne correctement avant de le déployer en production
  • Intégré : je m’assure qu’il s’intègre de manière cohérente dans l’environnement technique

Cette approche reflète ce qu’est vraiment le travail d’administrateur système dans la réalité. On ne réinvente pas constamment la roue, on s’appuie intelligemment sur ce qui existe déjà, on l’adapte à nos besoins spécifiques, et on le fait évoluer au fil de l’expérience. C’est d’ailleurs aussi dans cette logique que j’utilise parfois des outils d’intelligence artificielle pour m’aider à comprendre des messages d’erreur obscurs qui ne donnent aucun résultat pertinent sur Internet, ou pour identifier rapidement le type d’installeur d’un logiciel en lui envoyant une capture d’écran de l’interface.

Organisation pratique

Je stocke tous ces scripts dans un dossier synchronisé sur mon ordinateur que j’utilise partout, à l’école comme au travail. Certains scripts sont sur une clé USB que je garde toujours sur moi pour les diagnostics réseau sur le terrain. Je n’utilise pas Git ou GitHub pour versionner ces scripts, pas par principe mais simplement parce que je ne maîtrise pas encore vraiment ces outils et que ma méthode actuelle fonctionne bien pour mes besoins.

Les scripts eux-mêmes ne contiennent généralement pas beaucoup de commentaires parce qu’ils ne sont pas particulièrement complexes. Avec juste le titre et une lecture rapide du code, j’arrive à me rappeler comment ils fonctionnent. Si j’ai un doute, quelques essais par tâtonnement suffisent généralement à me remettre dans le bain.


Postes utilisateurs & usage quotidien

Forcer le mode de projection Windows sur Dupliquer (Win + P)

Contexte : Chez AGEA, nous recevions quotidiennement des tickets d’enseignants qui nous contactaient parce qu’ils avaient un écran noir sur le vidéoprojecteur. Dans la majorité des cas, le problème venait simplement du fait qu’ils n’avaient pas allumé le vidéoprojecteur ou qu’ils ne pensaient pas à vérifier le mode de projection Windows.

Solution : J’ai découvert en cherchant « windows + p script » que le raccourci Windows+P ouvre simplement displayswitch.exe, et qu’on peut lui passer des paramètres pour forcer un mode spécifique. Nous avons déployé ce script par GPO au démarrage des postes (et non à la connexion utilisateur, sinon la GPO ne s’applique pas au moment où les utilisateurs en ont besoin).

Impact : Depuis le déploiement, nous évitons environ 5 à 10 tickets par semaine sur nos cinq sites. Ce sont des tickets faciles à traiter, mais qui prenaient du temps inutilement.

CMD ou PowerShell

displayswitch.exe /clone

Nettoyage des fichiers temporaires utilisateur

Contexte : Script de maintenance préventive utilisé sur les ordinateurs qui commencent à être lents. On pourrait en faire une GPO qui s’exécute à chaque démarrage, mais ce ne serait pas optimal de supprimer les fichiers temporaires systématiquement.

Utilisation : Lancé manuellement lors des opérations de maintenance pour libérer de l’espace disque.

powershell

Remove-Item "$env:TEMP\*" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "C:\Windows\Temp\*" -Recurse -Force -ErrorAction SilentlyContinue

Réinitialisation complète de Windows Update

Contexte : Sur certaines machines qui ne souhaitaient pas prendre les mises à jour système, avec des messages d’erreur et une option « Réessayer » qui ne changeait rien. Ce script est assez agressif puisqu’il supprime complètement les dossiers de Windows Update, donc je l’utilise uniquement en dernier recours quand aucune autre solution ne fonctionne.

Origine : Script trouvé sur un site fiable lors d’un dépannage, testé et validé avant utilisation en production.

powershell

net stop wuauserv
net stop bits
net stop cryptsvc

Remove-Item "C:\Windows\SoftwareDistribution" -Recurse -Force
Remove-Item "C:\Windows\System32\catroot2" -Recurse -Force

net start wuauserv
net start bits
net start cryptsvc

Déploiement / MDT / Post-installation

Installation silencieuse de logiciels (gestion multi-switch)

Contexte : Les logiciels utilisent différents types d’installeurs qui ont leurs propres commandes pour l’installation silencieuse. Il existe différentes options comme /S, /s, --silent, -s, et ce n’est pas toujours évident de savoir laquelle utiliser.

Ma méthode : Mon responsable informatique chez AGEA m’a appris qu’on peut utiliser 7-Zip pour ouvrir les .exe (qui sont en fait des fichiers compressés) et voir les options disponibles, mais cette technique ne marche pas pour tous les logiciels. Parfois, j’envoie une capture d’écran de l’interface de l’installeur à ChatGPT pour qu’il m’indique quel type d’installeur c’est et quelles commandes utiliser. Dans mon MDT, j’ai maintenant une liste de tous les logiciels avec leurs options d’installation, ce qui me permet de retrouver rapidement la bonne syntaxe.

CMD ou PowerShell

setup.exe /S
# Autres exemples courants : /s , --silent , -s

Installation conditionnelle d’un logiciel

Contexte : Utilisé dans les GPO pour éviter de réinstaller un logiciel qui est déjà présent sur le poste, ce qui créerait des doublons ou des conflits. Particulièrement utile lors des redéploiements MDT.

Limitation connue : Ce script ne fonctionne pas pour tous les logiciels. Il existe des cas où un logiciel est installé mais n’apparaît pas dans les clés de registre standard, il faut alors adapter la recherche.

Origine : Trouvé sur une discussion Reddit et adapté à mes besoins.

powershell

$App = "7-Zip"
$Installed = Get-ItemProperty `
    HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, `
    HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* `
    -ErrorAction SilentlyContinue |
Where-Object { $_.DisplayName -like "*$App*" }

if (-not $Installed) {
    if (Test-Path "7zip.exe") {
        Start-Process "7zip.exe" -ArgumentList "/S" -Wait
    } else {
        Write-Error "7zip.exe introuvable"
    }
}

Vérification des logiciels obligatoires après MDT

Contexte : Chez AGEA, nous avons des centaines de logiciels par machine, ce qui a considérablement complexifié mon projet MDT. Ce script a été ajouté dans la task sequence du déploiement pour valider automatiquement qu’un poste est prêt avant remise à l’utilisateur.

Fonctionnement : Vérifie que tous les logiciels obligatoires sont bien installés et affiche la liste pour contrôle visuel.

powershell

$RequiredApps = @("Google Chrome","Mozilla Firefox","7-Zip")

Get-ItemProperty `
    HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, `
    HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* `
    -ErrorAction SilentlyContinue |
Where-Object { $RequiredApps -contains $_.DisplayName } |
Select DisplayName

Gestion des machines

Renommage de machine avec redémarrage contrôlé

Contexte : Utilisé lors du déploiement de nouveaux postes pour leur donner un nom conforme à notre nomenclature. Chez AGEA, nous n’avons pas de nomenclature fixe, cela change selon les bâtiments, les sites et les salles, ce qui est d’ailleurs une erreur des services informatiques qui s’est installée au fil du temps.

Utilisation : Lancé manuellement sur chaque nouveau poste après le déploiement MDT.

powershell

Rename-Computer -NewName "PC-SALLE01" -Force -Restart

Déplacement automatique du poste dans la bonne OU

Contexte : Le problème c’est que lors du déploiement d’un poste, j’oublie souvent de le mettre dans la bonne OU Active Directory, ce qui fait qu’il ne reçoit pas les bonnes GPO. Ce script résout ce problème en automatisant le déplacement.

Exécution : Juste après le renommage de la machine, ou à la fin du processus MDT.

powershell

Get-ADComputer $env:COMPUTERNAME |
Move-ADObject -TargetPath "OU=Postes,DC=domaine,DC=local"

Sortie propre d’un poste du domaine

Contexte : Utilisé pour sortir proprement un poste du domaine, soit lors du reconditionnement de postes obsolètes (par exemple des machines qui ne prennent pas Windows 11), soit quand j’ai mal nommé un poste et que je l’ai intégré au domaine, pour éviter les doublons ou les problèmes sur l’Active Directory.

Fréquence : Assez rare, mais ces tâches sont répétitives donc un script permet de gagner du temps.

powershell

Remove-Computer -UnjoinDomaincredential domaine\Admin -PassThru -Restart

Active Directory – utilisateurs (contexte scolaire)

Ces scripts viennent de mon expérience en infogérance d’établissements scolaires chez Novalink.

Création/Mise à jour massive d’utilisateurs via fichier CSV

Contexte : En début d’année scolaire, il y a des centaines de nouveaux élèves à gérer. La méthodologie complète est :

  1. Vérifier si un compte existe déjà (pour les élèves qui continuent dans l’établissement)
  2. Si le compte existe, lui enlever tous ses anciens groupes
  3. Créer le compte s’il n’existe pas
  4. L’ajouter au bon groupe selon sa nouvelle classe

Fichier CSV : Nous avons un logiciel spécialisé pour les écoles qui permet d’exporter l’intégralité des élèves sous différents formats avec les informations souhaitées. Pour ce script, nous utilisons : nom, prénom, classe.

Convention de nommage : Le login suit le format prenom.nom, avec un tiret (-) si le nom ou le prénom sont composés.

Mots de passe : Tous les élèves reçoivent le même mot de passe initial qu’ils doivent obligatoirement changer à la première connexion.

Affectation des groupes : Si l’élève est en classe 3B selon le CSV, il est automatiquement ajouté au groupe Active Directory « 3B ».

powershell

Import-Csv "users.csv" | ForEach-Object {

    $sam = $_.login
    $upn = "$($sam)@domaine.local"

    # Recherche de l'utilisateur
    $user = Get-ADUser -Filter "SamAccountName -eq '$sam'" -ErrorAction SilentlyContinue

    if ($user) {
        Write-Host "Utilisateur $sam existe déjà -> Réactivation"

        # Réactiver le compte
        Enable-ADAccount -Identity $user

        # Réinitialiser le mot de passe
        Set-ADAccountPassword -Identity $user `
            -Reset `
            -NewPassword (ConvertTo-SecureString $_.password -AsPlainText -Force)

        # Forcer le changement de mot de passe à la prochaine connexion
        Set-ADUser -Identity $user -ChangePasswordAtLogon $true
    }
    else {
        Write-Host "Création de l'utilisateur $sam"

        New-ADUser `
        -SamAccountName $sam `
        -Name $_.nom `
        -GivenName $_.prenom `
        -Surname $_.nom `
        -UserPrincipalName $upn `
        -Path "OU=Eleves,DC=domaine,DC=local" `
        -AccountPassword (ConvertTo-SecureString $_.password -AsPlainText -Force) `
        -Enabled $true

        # Forcer le changement de mot de passe à la première connexion
        Set-ADUser -Identity $sam -ChangePasswordAtLogon $true
    }
}

Création automatique des dossiers personnels

Contexte : Préparer l’environnement utilisateur dès la première connexion en créant les dossiers personnels de chaque élève sur le serveur de fichiers.

Exécution : Juste après la création ou la mise à jour des comptes utilisateurs.

powershell

$Users = Get-ADUser -Filter * -SearchBase "OU=Eleves,DC=domaine,DC=local"

foreach ($User in $Users) {
    New-Item "\\srv-fichiers\Users\$($User.SamAccountName)" -ItemType Directory -Force 
    $acl = Get-Acl "\\srv-fichiers\Users\$($User.SamAccountName)"
    # + SetAccessRule ...

}

Désactivation massive des comptes en fin d’année

Contexte : En fin d’année scolaire, nous désactivons TOUS les comptes élèves, même ceux qui vont revenir l’année suivante. Ces comptes sont ensuite réactivés automatiquement au début de l’année suivante quand ils apparaissent dans le nouveau fichier CSV traité par le script de création/mise à jour.

Objectif : Sécurité et nettoyage de l’annuaire Active Directory pendant les vacances d’été.

powershell

Get-ADUser -Filter * -SearchBase "OU=Eleves,DC=domaine,DC=local" |
Disable-ADAccount

Détection des comptes sans groupe

Contexte : Identifier les erreurs de configuration de droits en détectant les comptes utilisateurs qui n’appartiennent à aucun groupe Active Directory.

Utilité : Ces comptes « orphelins » résultent généralement d’un oubli lors de la création ou d’une erreur dans le processus automatisé.

powershell

Get-ADUser -Filter * -Properties MemberOf |
Where-Object { $_.MemberOf.Count -le 1 }  |
Select SamAccountName

Réseau et accès aux ressources

Ces scripts sont généralement sur une clé USB que je garde toujours sur moi pour les diagnostics réseau sur le terrain.

Vérification de l’accès à un serveur

Contexte : Scripts de diagnostic rapide pour tester la connectivité vers les serveurs qui contiennent des services que les utilisateurs pourraient utiliser. Le nom du serveur change selon le contexte (srv-pedago, srv-fichiers, srv-rds, etc.).

Utilisation : Lancé manuellement lors d’un dépannage pour identifier rapidement où se situe le problème de connectivité.

powershell

Test-Connection srv-pedago -Count 2
Test-Connection srv-Administratif -Count 2
Test-Connection srv-dhcp -Count 2

Test d’accès aux partages réseau

Contexte : Vérifier si un utilisateur a bien les droits d’accéder à un répertoire réseau spécifique.

Diagnostic : Si ce script échoue, c’est que l’utilisateur n’a pas les droits pour accéder à ce partage. Il faut alors vérifier les permissions NTFS ou les groupes Active Directory.

powershell

$Shares = @(
"\\srv-fichiers\Commun",
"\\srv-fichiers\Compta",
"\\srv-fichiers\RH",
"\\srv-fichiers\Administration"
)

foreach ($Share in $Shares) {

    $TestFile = Join-Path $Share "test_access_$env:USERNAME.txt"

    try {
        # Test écriture
        "test" | Out-File $TestFile -ErrorAction Stop

        # Test lecture
        Get-Content $TestFile -ErrorAction Stop | Out-Null

        # Nettoyage
        Remove-Item $TestFile -ErrorAction Stop

        Write-Host "$Share : OK lecture + écriture"
    }
    catch {
        Write-Host "$Share : PAS d'accès complet"
    }
}

Vérification des ports nécessaires

Contexte : Identifier rapidement un blocage réseau ou pare-feu en testant si les ports essentiels sont ouverts. Je peux remplacer ces ports par n’importe quel autre selon le service que je veux tester (DNS, HTTP, etc.).

Utilité : Permet de savoir immédiatement si un service est bloqué par le pare-feu de la machine locale ou par notre pare-feu réseau.

powershell

Test-NetConnection srv-rds -Port 3389  # Bureau à distance
Test-NetConnection srv-print -Port 445  # Partages SMB

Maintenance avancée

Suppression des anciens profils utilisateurs (équivalent DelProf)

Contexte : Sur les postes partagés (salles informatiques, serveurs RDS), les profils utilisateurs s’accumulent et finissent par consommer beaucoup d’espace disque. Ce script supprime les profils inutilisés depuis X jours.

Sécurité : Chez nous, les profils sont itinérants (stockés sur le serveur), donc les machines locales ne peuvent pas vraiment perdre les données des utilisateurs même si le profil local est supprimé.

Automatisation : Nous avons une GPO qu’on active ou désactive selon les besoins, qui exécute ce script environ une fois par mois de manière préventive.

Origine : Script inspiré de l’outil DelProf mais réécrit en PowerShell natif pour éviter les dépendances externes.

powershell

$DaysInactive = 30
$LimitDate = (Get-Date).AddDays(-$DaysInactive)

$ExcludedUsers = @("Administrator","Administrateur","svc_admin")

Get-CimInstance Win32_UserProfile |
Where-Object {
    $_.LastUseTime -lt $LimitDate -and
    $_.Special -eq $false -and
    $_.Loaded -eq $false -and
    ($ExcludedUsers -notcontains $_.LocalPath.Split('\')[-1])
} |
ForEach-Object {
    Write-Host "Suppression du profil :" $_.LocalPath
    Remove-CimInstance $_
}

Sécurités intégrées :

  • Ignore les profils système
  • Ignore les profils actuellement chargés
  • Basé sur la date réelle de dernière utilisation

Ce que cette bibliothèque révèle sur ma façon de travailler

Cette collection de scripts n’est pas juste un catalogue technique, c’est le reflet d’une pratique professionnelle qui a évolué au fil de mes expériences. Elle illustre plusieurs aspects de mon approche du métier d’administrateur système.

D’abord, elle montre ma volonté de capitaliser sur l’expérience plutôt que de tout recommencer à zéro à chaque fois. Quand je rencontre un problème que j’ai déjà résolu ailleurs, je ne cherche pas à le résoudre à nouveau de manière différente juste pour le plaisir. Je réutilise ce qui fonctionne déjà, je l’adapte au nouveau contexte, et je gagne du temps que je peux investir sur des problèmes vraiment nouveaux.

Ensuite, elle témoigne d’une recherche constante d’efficacité dans les tâches répétitives. L’administration système pourrait facilement devenir un travail où on passe ses journées à répéter les mêmes manipulations manuellement. Ces scripts me permettent d’automatiser ce qui peut l’être, non pas par obsession de la technique pour la technique, mais parce que cela me libère du temps pour des tâches plus intéressantes et qui apportent plus de valeur.

Elle révèle aussi ma compréhension progressive des patterns qui se répètent d’une infrastructure à l’autre. Même si chaque environnement a ses spécificités, les besoins fondamentaux restent souvent similaires : gérer les comptes utilisateurs, déployer des postes, diagnostiquer des problèmes réseau, maintenir les systèmes. Cette reconnaissance de patterns est fondamentale dans le métier d’ingénieur.

Enfin, cette bibliothèque illustre une approche pragmatique et honnête du travail technique. Je ne prétends pas avoir tout inventé, je m’appuie sur ce qui existe déjà, je l’adapte, je le teste, et je le fais mien. C’est exactement comme ça que fonctionne vraiment le métier dans la réalité, loin de l’image parfois idéalisée de l’ingénieur qui code tout lui-même depuis une page blanche.

Cette collection continuera d’évoluer au fil de mes expériences. Certains scripts disparaîtront parce qu’ils ne seront plus pertinents, d’autres apparaîtront pour répondre à de nouveaux besoins. C’est un outil vivant qui grandit avec moi, et c’est exactement pour ça qu’il a sa place dans ce portfolio.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.