La gestion des paramètres système à grande échelle est une responsabilité essentielle pour les professionnels de l’informatique et les fournisseurs de services gérés (MSP). macOS, bien que convivial en apparence, peut poser des problèmes de configuration lorsqu’il s’agit d’appliquer des paramètres uniformes à plusieurs utilisateurs ou systèmes. L’un de ces paramètres est la visibilité des extensions de fichiers, qui peut être essentielle pour les diagnostics informatiques, l’intégrité des types de fichiers et la formation des utilisateurs. Cet article explique comment activer ou désactiver les extensions de fichiers sur macOS avec un script Shell pour tous les utilisateurs via l’automatisation de la ligne de commande.
Contexte
Les extensions de fichiers sont essentielles pour distinguer les types de fichiers, en particulier lorsque les icônes des fichiers ou les applications par défaut sont ambiguës. Bien que les utilisateurs puissent basculer ce paramètre manuellement via les préférences du Finder, les environnements d’entreprise exigent l’automatisation, en particulier lorsqu’il s’agit de gérer des centaines de machines. Les MSP et les administrateurs système ont souvent besoin de renforcer la visibilité pour éviter les erreurs des utilisateurs, permettre une gestion efficace des fichiers ou se conformer aux directives de la politique. Le script présenté ici permet d’activer ou de désactiver la fonction « Afficher toutes les extensions de fichiers » pour tous les comptes d’utilisateurs, de manière automatique, fiable et avec une intervention minimale.
Cet outil est particulièrement précieux lorsqu’il est associé à des solutions de gestion à distance telles que NinjaOne, où l’automatisation peut réduire le temps de résolution, renforcer les postures de sécurité et éliminer les incohérences entre les déploiements.
Le script
#!/usr/bin/env bash
# Description: Enable or disable the visibility of File Extensions for all users (must be ran as 'System').
# By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
# Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms.
# Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party.
# Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider.
# Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations.
# Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks.
# Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script.
# EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#
# Release Notes: Initial Release
#
# Usage: [--action <Arg>] [--restartFinder] [--help|-h]
# <> are required
# [] are optional
#
# Example: Set-ExtensionVisibility.sh --action Enable
# Enabling 'Show hidden files and folders' for all users.
#
# Example: Set-ExtensionVisibility.sh --action Enable --restartFinder
# Enabling 'Show hidden files and folders' for all users.
# Restarting Finder.
#
# Preset Parameter: --action "Enable"
# Specify whether you would like to disable or enable the viewing of hidden files or folders. Valid actions are 'Enable' or 'Disable'.
#
# Preset Parameter: --restartFinder
# You may need to restart Finder.app for the script to take effect immediately. Use this switch to do so upon completion.
#
# Preset Parameter: --help
# Displays the help menu.
# Functions
# Print an error message and exit with a specific status code
die() {
local _ret="${2:-1}"
test "${_PRINT_HELP:-no}" = yes && print_help >&2
echo "$1" >&2
exit "${_ret}"
}
# Print the help message
print_help() {
printf '\n\n%s\n\n' 'Usage: [-a|--action <Arg>] [-r|--restartFinder] [-h|--help]'
printf '%s\n' 'Preset Parameter: --action "Enable"'
printf '%s\n' 'Preset Parameter: --action "Disable"'
printf '\t%s\n' "Specify whether you would like to disable or enable the viewing of hidden files or folders. Valid actions are 'Enable' or 'Disable'."
printf '%s\n' 'Preset Parameter: --restartFinder'
printf '\t%s\n' "You may need to restart Finder.app for the script to take effect immediately. Use this switch to do so upon completion."
printf '%s\n' 'Preset Parameter: --help'
printf '\t%s\n' "Displays the help menu."
}
# Parse the command-line arguments
parse_commandline() {
while test $# -gt 0; do
_key="$1"
case "$_key" in
-a | --action)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_action="$2"
shift
;;
--action=*)
_arg_action="${_key##--action=}"
;;
-a*)
_arg_action="${_key##-a}"
;;
--restartFinder | -r)
_arg_restartFinder="true"
;;
--help | -h)
_PRINT_HELP=yes die "" 0
;;
*)
_PRINT_HELP=yes die "[Error] Got an unexpected argument '$1'" 1
;;
esac
shift
done
}
setExtensionVisibility() {
user=$1
if [[ "${_arg_action}" == "Enable" ]]; then
if [[ $(sudo -u "$user" /usr/bin/defaults read NSGlobalDomain AppleShowAllExtensions 2>&1) == "1" ]]; then
# If the visibility of File Extensions is already enabled, display a message indicating that it is already enabled
echo "[Info] 'Show File Extensions' is already enabled for user '$user'."
# If the restartFinder flag is "on", restart Finder as requested and handle any errors
if [[ $_arg_restartFinder == "on" ]]; then
restartFinder "$user"
fi
else
# Enable the visibility of File Extensions for the user
echo "[Info] Enabling 'Show File Extensions' for user '$user'."
if sudo -u "$user" /usr/bin/defaults write NSGlobalDomain AppleShowAllExtensions -bool true 2>&1; then
# If the restartFinder flag is "on", restart Finder as requested and handle any errors
if [[ $_arg_restartFinder == "on" ]]; then
restartFinder "$user"
fi
echo "[Info] Successfully set 'Show File Extensions' to 'Enable' for user '$user'."
else
echo "[Error] Failed to set 'Show File Extensions' to 'Enable' for user '$user'."
fi
fi
else
if [[ $(sudo -u "$user" /usr/bin/defaults read NSGlobalDomain AppleShowAllExtensions 2>&1) == "1" ]]; then
# Disable the visibility of File Extensions for the user
echo "[Info] Disabling 'Show File Extensions' for user '$user'."
if sudo -u "$user" /usr/bin/defaults write NSGlobalDomain AppleShowAllExtensions -bool false 2>&1; then
# If the restartFinder flag is "on", restart Finder as requested and handle any errors
if [[ $_arg_restartFinder == "on" ]]; then
restartFinder "$user"
fi
echo "[Info] Successfully set 'Show File Extensions' to 'Disable' for user '$user'."
else
echo "[Error] Failed to set 'Show File Extensions' to 'Disable' for user '$user'."
fi
else
# If the visibility of File Extensions is already disabled, display a message indicating that it is already disabled
echo "[Info] 'Show File Extensions' is already disabled for user '$user'."
# If the restartFinder flag is "on", restart Finder as requested and handle any errors
if [[ $_arg_restartFinder == "on" ]]; then
restartFinder "$user"
fi
fi
fi
}
restartFinder() {
user=$1
# Restart Finder for the user
echo "[Info] Restarting Finder as requested for user '$user'."
# Check if Finder is running for the user before restarting it
if pgrep -u "$user" Finder 1>/dev/null 2>&1; then
# Finder is running for the user, restart Finder
echo "[Info] Finder is running for user '$user'."
if pkill -u "$user" Finder 2>&1; then
# Finder was successfully restarted
echo "[Info] Restarted Finder for user '$user'."
else
# Finder failed to restart
echo "[Warn] Failed to restart Finder for user '$user'."
fi
else
# Finder is not running for the user
echo "[Info] Finder is not running for user '$user'."
fi
}
parse_commandline "$@"
# If script form variables are used, replace the command-line parameters with their value.
if [[ -n "${action}" ]]; then
_arg_action="$action"
fi
if [[ -n $restartFinder && $restartFinder == "true" ]]; then
_arg_restartFinder="on"
fi
# If $action has a value, trim any leading or trailing whitespace
if [[ -n "${_arg_action}" ]]; then
_arg_action="$(echo -e "${_arg_action}" | xargs)"
fi
# If $action is empty or null after trimming, display an error message indicating that an action must be specified
if [[ -z "${_arg_action}" ]]; then
die "[Error] You must specify an action (Enable or Disable)." 1
fi
# Check if the action is valid
if [[ "${_arg_action}" != "Enable" && "${_arg_action}" != "Disable" ]]; then
die "[Error] Invalid action '${_arg_action}'. Please specify either 'Enable' or 'Disable'." 1
fi
if [[ $EUID -eq 0 ]]; then
# Get all users with UID >= 500
user_list=$(dscl . -list /Users UniqueID | awk '$2 > 499 {print $1}')
# Set the visibility of File Extensions for all users
for user in $user_list; do
setExtensionVisibility "$user"
done
else
die "[Error] This script must be run as system or root." 1
fi
Description détaillée
Le script shell est conçu pour être exécuté en tant que root ou par l’utilisateur system afin de s’assurer qu’il dispose des privilèges nécessaires. Il offre les fonctionnalités suivantes :
- Basculer la visibilité de l’extension de fichier (Activer ou Désactiver)
- Redémarrer Finder optionnellement pour appliquer les changements instantanément
- Prise en charge de tous les utilisateurs locaux (UID ≥ 500)
- Menu d’aide CLI pour faciliter l’utilisation
Analyse des arguments
Le script commence par une fonction qui analyse les arguments de la ligne de commande tels que :
- –action <Enable|Disable> : Nécessaire pour définir l’état de visibilité souhaité.
- –restartFinder : Indicateur facultatif permettant de redémarrer Finder pour que les modifications prennent effet immédiatement.
- –help : Affiche les instructions d’utilisation.
Logique principale
- Validation des arguments
Si –action est manquant ou invalide, le script se termine par une erreur, invitant l’utilisateur à suivre les instructions d’utilisation appropriées. - Énumération des utilisateurs
En utilisant dscl, le script récupère tous les utilisateurs locaux dont l’UID est ≥ 500, ce qui exclut généralement les comptes système. - Configuration par utilisateur
Pour chaque utilisateur :- Il vérifie l’état actuel de AppleShowAllExtensions à l’aide de la commande defaults.
En fonction de –action, cela active ou désactive ce paramètre à l’aide de :
bash
CopyEdit
sudo -u « $user » /usr/bin/defaults write NSGlobalDomain AppleShowAllExtensions -bool true|false
- Si –restartFinder est défini, Finder est redémarré de façon fluide pour permettre à l’utilisateur d’appliquer la modification.
Cas d’utilisation potentiels
Étude de cas : Département informatique de l’université
L’équipe informatique d’une université doit s’assurer que tous les étudiants travaillant dans des laboratoires de programmation peuvent voir les extensions de fichiers afin d’éviter de mal identifier les types de fichiers (par exemple, .js vs .txt). À l’aide de ce script, l’administrateur planifie une tâche via NinjaOne pour qu’elle soit exécutée chaque semaine sur tous les Mac du laboratoire. Le script renforce la visibilité, réduit la confusion des utilisateurs et évite les tickets d’assistance courants liés à la mauvaise gestion des fichiers.
Comparaisons
Configuration manuelle
Les utilisateurs peuvent modifier manuellement ce paramètre via Finder > Préférences > Avancé > « Afficher toutes les extensions de nom de fichier » Cette approche n’est pas extensible et ne peut garantir la cohérence entre plusieurs comptes ou appareils.
Profils de configuration (MDM)
Le cadre MDM d’Apple permet de personnaliser le Finder, mais la visibilité des extensions de fichiers n’est pas universellement exposée en tant que charge utile configurable dans toutes les versions. De plus, les scripts shell offrent une certaine flexibilité sans nécessiter une infrastructure MDM complète.
Scripts de connexion personnalisés
Les scripts de connexion créés par l’administrateur peuvent modifier les préférences par utilisateur, mais ils nécessitent une exécution basée sur la session. Ce script fonctionne indépendamment de l’état de connexion, ce qui offre une plus grande souplesse pour l’exécution hors ligne ou en fenêtre de maintenance.
Implications
Sécurité et cohérence opérationnelle
- Prévention de l’usurpation de nom de fichier: Les extensions cachées peuvent dissimuler des types de fichiers dangereux. Le renforcement de la visibilité permet d’éviter cela.
- Formez les utilisateurs : Des environnements cohérents facilitent l’intégration et l’assistance.
- Conformité de la politique: Les entreprises qui appliquent des règles strictes en matière de traitement des données bénéficient d’une présentation normalisée des fichiers.
Recommandations
- Exécutez toujours le script en tant que root.
- Utilisez –restartFinder pour un effet immédiat pendant les sessions gérées.
- Combinez avec les outils de planification ou de remédiation de NinjaOne pour une exécution constante.
- Enregistrez la sortie à des fins d’audit ou de dépannage.
- Testez sur un sous-ensemble de machines avant le déploiement complet pour vérifier le comportement des utilisateurs.
Conclusion
Les scripts Shell restent un outil puissant pour l’administration de macOS, en particulier pour la gestion des préférences des utilisateurs à grande échelle. Ce script est une solution pratique pour les professionnels de l’informatique qui ont besoin d’activer ou de désactiver la visibilité des extensions de fichiers rapidement et de manière cohérente pour plusieurs utilisateurs et appareils.
Avec NinjaOne, cette capacité est accrue. Les administrateurs peuvent déployer le script à distance, surveiller le succès de l’exécution et automatiser son utilisation en fonction des événements de la stratégie. Que vous gériez une école, une flotte d’entreprise ou un environnement mixte, cet outil, associé à NinjaOne, vous permet de maintenir une expérience macOS sûre et prévisible.