Bibliothèque de scripts PowerShell utilisés en production sur la plateforme NinjaOne RMM pour l'administration à distance d'un parc de postes Windows.
NinjaOne est une plateforme RMM (Remote Monitoring & Management) qui permet, depuis une console web centralisée, d'inventorier, superviser et exécuter des scripts sur des endpoints Windows / macOS / Linux. Les scripts contenus dans ce dépôt sont conçus pour être déployés via Administration → Library → Automation → Scripts, puis exécutés manuellement ou via une policy sur les postes ciblés.
Chaque script est écrit en PowerShell 5.1+ (compatible Windows 10 / 11 et Windows Server 2016+). Sauf mention contraire, ils sont pensés pour tourner sous le contexte SYSTEM — c'est le mode d'exécution par défaut de NinjaOne pour les scripts administratifs.
.
├── Dropbox/
│ ├── block.ps1 # Blocage complet de Dropbox (firewall + autostart)
│ └── unblock.ps1 # Rollback des règles firewall Dropbox
├── Firefox/
│ ├── SaveFavorisFirefox.ps1 # Sauvegarde des favoris Firefox par utilisateur
│ └── LastFireFirefoxversiontoFirefoxESR.ps1 # Migration Firefox stable → ESR
├── FirefoxESR # Doublon (sans extension) du script de migration ESR
├── Windows/
│ └── lockscreen_img # Déploiement d'un fond d'écran de verrouillage entreprise
└── questionnaireAPIReturnResponse # Notification interactive utilisateur avec retour vers une API
Note : plusieurs fichiers sont enregistrés sans extension .ps1 (héritage du
copier-coller depuis la console NinjaOne, qui ne demande pas d'extension).
Le contenu reste du PowerShell valide.
But : bloquer entièrement Dropbox sur un poste dans le cadre d'une migration vers SharePoint. Cible : postes Windows (workstations). Contexte d'exécution : SYSTEM. Paramètres : aucun. Effets :
- Détecte tous les binaires
Dropbox.exe(installations per-user dansC:\Users\*\AppData\Local\Dropbox, installations machine-wide dansProgram Files, et processus actifs à chemin non standard). - Crée une règle Windows Defender Firewall sortante
Blockpar binaire détecté (nom de règle :BLOCK - Dropbox (Migration SP)). - Termine le processus
Dropboxs'il est actif. - Supprime l'entrée
DropboxdeHKCU\Software\Microsoft\Windows\CurrentVersion\Runpour tous les profils utilisateur (y compris les profils déconnectés, via chargement temporaire de leur rucheNTUSER.DAT). - Retourne un code de sortie non nul en cas d'erreur (compatible avec la gestion des statuts dans NinjaOne).
But : rollback du script précédent. Cible : postes Windows. Contexte d'exécution : SYSTEM. Paramètres : aucun. Effets :
- Supprime les règles firewall créées par
block.ps1. - N'inscrit pas le démarrage automatique de Dropbox — le client Dropbox le recrée seul au prochain lancement manuel par l'utilisateur.
But : sauvegarde manuelle et détaillée des favoris Firefox de tous les utilisateurs présents sur un poste, avec production d'un rapport lisible et d'un guide de restauration. Cible : postes Windows multi-utilisateurs. Contexte d'exécution : SYSTEM (nécessaire pour lire les profils de tous les utilisateurs). Paramètres : aucun. Effets :
- Parcourt
C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles. - Copie
places.sqlite,favicons.sqlite,prefs.jset lesbookmarkbackups/*.jsonlz4de chaque profil vers un dossier horodaté sur le bureau du premier utilisateur trouvé (fallback :C:\Temp). - Classe automatiquement chaque profil par statut (
ACTIF/UTILISE/VIDE) selon la taille deplaces.sqlite. - Génère
INFOS_PROFIL.txtpar profil etGUIDE_RESTAURATION.txtglobal. - Ouvre le dossier dans l'Explorateur à la fin.
Remarque : le script contient un Read-Host en fin d'exécution — il attend
une pression sur Entrée avant de rendre la main. Utile en exécution
interactive locale, à surveiller si on l'appelle depuis un pipeline
totalement non-interactif.
But : résoudre le conflit qui apparaît quand on remplace une installation Firefox stable (ex. 140.x) par Firefox ESR (ex. 128.x) — Firefox refuse alors de démarrer avec un profil créé par une version plus récente (« Vous avez démarré une ancienne version de Firefox »). Cible : postes Windows sur lesquels on migre de Firefox stable vers Firefox ESR. Contexte d'exécution : SYSTEM. Paramètres : aucun. Effets :
- Détecte la version installée de Firefox.
- Termine tous les processus
firefox.exeen cours. - Pour chaque profil de chaque utilisateur :
- Sauvegarde
places.sqlite,prefs.jset le dossierbookmarkbackupsversC:\Temp\Firefox_ESR_Migration_<timestamp>. - Supprime les fichiers de verrouillage / compatibilité :
compatibility.ini,parent.lock,.parentlock,lock. - Réinitialise
times.json(timestamp de création du profil). - Nettoie dans
prefs.jsles préférences qui bloquent le downgrade (toolkit.startup.max_resumed_crashes,browser.startup.page_first_run,app.update.auto).
- Sauvegarde
- Purge du registre les clés
HKLM\SOFTWARE\Mozilla\Firefox\*etHKCU\SOFTWARE\Mozilla\Firefox\*dont le nom correspond à une version 140-199 (regex1[4-9][0-9]\.). - Produit un rapport
RAPPORT_MIGRATION_ESR.txtet un fichierCOMMENT_RESTAURER.txtpar profil qui contenait des favoris.
Attention : ce script modifie irréversiblement prefs.js et le registre
Firefox. Une sauvegarde complète est effectuée en amont, mais toute
exécution sur un poste doit être précédée d'un test.
Copie identique du script Firefox/LastFireFirefoxversiontoFirefoxESR.ps1,
conservée sans extension à la racine pour import direct dans NinjaOne. Les
deux fichiers ont exactement le même contenu.
But : imposer sur tous les postes un fond d'écran de verrouillage
entreprise unifié, en désactivant Windows Spotlight.
Cible : postes Windows 10 / 11 (Pro, Enterprise ou Éducation — la
politique PersonalizationCSP n'est pas honorée par les éditions Home).
Contexte d'exécution : Administrateur (#Requires -RunAsAdministrator).
Paramètres :
-ImageUrl <string>: URL HTTP(S) publique de l'image à télécharger. Valeur par défaut du dépôt :https://url/tools/screen.png(placeholder à remplacer avant déploiement réel).-LogPath <string>: dossier où déposer le transcript. Défaut :$env:TEMP. Effets :- Télécharge l'image et la place dans
C:\Windows\System32\LockScreen.jpg. - Écrit sous
HKLM\SOFTWARE\Policies\Microsoft\Windows\CloudContentles DWORD :DisableWindowsSpotlightFeatures,DisableWindowsSpotlightOnActionCenter,DisableWindowsSpotlightOnSettings,DisableWindowsSpotlightWindowsWelcomeExperience,DisableSoftLanding. - Configure sous
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PersonalizationCSP:LockScreenImageStatus=1,LockScreenImagePath,LockScreenImageUrl. - Pour chaque utilisateur (charge la ruche
NTUSER.DATsi le profil n'est pas chargé) : écrit dansContentDeliveryManagerles DWORDRotatingLockScreenEnabled=0,RotatingLockScreenOverlayEnabled=0, etc. - Exécute
gpupdate /forceet redémarre les servicesThemesetUxSms.
But : afficher une popup de notification native (WinForms) sur la session
de tous les utilisateurs connectés, avec possibilité d'y joindre un
formulaire de réponse renvoyé à une API HTTP interne.
Cible : postes Windows avec au moins une session utilisateur active.
Contexte d'exécution : SYSTEM (le script bascule ensuite vers le
contexte utilisateur via une tâche planifiée avec LogonType Interactive).
Paramètres (passés par NinjaOne au format {key:value,...}) :
title: titre de la notification.message: corps du message.token: jeton opaque renvoyé à l'API avec la réponse (identifie le ticket).showForm:truepour afficher un champ de saisie et un bouton d'envoi,falsepour une simple notification. Effets :- Nettoie les anciennes tâches planifiées orphelines (
ClientNotif*) plus vieilles que 10 minutes, ainsi que les scriptsnotify_*.ps1etnotify_*.vbsde plus d'une heure dansC:\ClientIT\Notifications. - Récupère la liste des utilisateurs connectés via
quser. - Pour chaque utilisateur, dépose un script
.ps1(l'UI WinForms complète) et un lanceur.vbs(pour supprimer la fenêtre PowerShell), puis crée une tâche planifiée qui exécutewscript.exesous l'identité de l'utilisateur — c'est la méthode standard pour afficher une UI depuis un script SYSTEM. - Si
showForm=true: la réponse est envoyée enPOST application/x-www-form-urlencodedvers<ApiBaseUrl>?token=<token>avecresponse=<texte>dans le corps. L'URL est configurable dans le script. - Nettoie les tâches planifiées et fichiers temporaires 15 secondes après le lancement.
Remarque : la configuration en tête de script (ScriptFolder, TaskPrefix,
ApiBaseUrl) contient des références à un contexte de déploiement client
(chemins et libellés génériques Client*). Ces valeurs sont à adapter à votre
environnement avant réutilisation.
- Console NinjaOne → Administration → Library → Automation.
- Add → Script → langage : PowerShell.
- Copier le contenu du fichier
.ps1souhaité dans l'éditeur. - Sélectionner le Run As approprié (SYSTEM pour la majorité, ou Current logged on user selon le cas).
- Pour les scripts qui acceptent des arguments (ex.
questionnaireAPIReturnResponse), activer Preset Parameters et passer les valeurs au format attendu par le script. - Assigner le script à une policy ou déclencher un Run script ponctuel sur un ou plusieurs devices.
- Aucun credential, aucun token, aucune clé d'API n'est stocké en clair dans les scripts de ce dépôt.
- Les URL apparaissant dans le code (
https://url/...) sont des placeholders génériques à remplacer avant tout déploiement. - Les scripts qui manipulent des ruches utilisateurs (
NTUSER.DAT) utilisent systématiquementreg load/reg unloadavec un alias dédié et forcent[GC]::Collect()avant unload pour éviter les handles résiduels. - Les règles firewall créées portent un nom explicite et unique, ce qui
permet un rollback fiable (
Remove-NetFirewallRule -DisplayName ...). - Les scripts qui modifient des fichiers utilisateurs (Firefox) réalisent systématiquement une sauvegarde préalable horodatée avant toute modification.
- Les codes de sortie (
exit 0/exit 1) sont utilisés là où c'est pertinent pour remonter le statut à NinjaOne.
- PowerShell 5.1 ou supérieur (fourni par défaut sur Windows 10 / 11 et Windows Server 2016+).
- Modules
NetSecurity(pour les scripts firewall) etScheduledTasks(pour la création de tâches planifiées) — fournis par Windows. - Droits SYSTEM ou Administrateur selon les scripts (voir chaque fiche ci-dessus).
Distribué sous licence MIT — voir le fichier LICENSE.
Jérôme Fafchamps — @replicatorbe