Pour les professionnels de l’informatique et les fournisseurs de services gérés (MSP), il est essentiel de garantir un déploiement cohérent, automatisé et sans erreur des logiciels, en particulier lorsqu’ils gèrent des flottes d’appareils macOS. Microsoft Office 365 reste une suite de productivité fondamentale pour les entreprises et les PME. L’installation manuelle sur plusieurs machines peut toutefois s’avérer inefficace et sujette à des oublis. Une solution efficace consiste à apprendre à installer Office 365 sur macOS avec un script shell. Cet article de blog se penche sur un script shell qui permet justement cela, en rationalisant l’installation et en proposant des options comme le redémarrage forcé pour un contrôle total du déploiement.
Contexte
L’automatisation des déploiements de logiciels est une bonne pratique pour les équipes informatiques qui gèrent de nombreux terminaux. Alors que des outils comme Microsoft Endpoint Manager et Jamf offrent une gestion complète des appareils, les administrateurs ont parfois besoin de solutions légères, basées sur des scripts, en particulier dans les environnements exploitant les capacités d’automatisation de NinjaOne. Ce script simplifie le processus d’installation d’Office 365 sur macOS avec une interaction humaine minimale et fournit une logique pour la validation de l’installation, le nettoyage et le redémarrage optionnel.
Pour les MSP travaillant avec des environnements clients variés ou les départements informatiques internes à la recherche d’options de déploiement rapide, ce script offre une alternative fiable et évolutive.
Le script
#!/usr/bin/env bash # Description: Install Office 365 on MacOS with default install settings. # 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 print_help() { printf '\n### Below are all the (case sensitive) valid parameters for this script! ###\n' printf '\nPreset Parameter: --forcereboot \n' printf '\t%s\n' "--forcereboot: Reboot the device after the installation is complete." } # Determines whether or not help text is necessary and routes the output to stderr die() { local _ret="${2:-1}" echo "$1" >&2 test "${_PRINT_HELP:-no}" = yes && print_help >&2 exit "${_ret}" } # THE DEFAULTS INITIALIZATION - OPTIONALS _arg_forceReboot="off" _reboot_time="1" # Minutes _reboot_message_giveup=$((_reboot_time * 60 / 2)) # Seconds _reboot_message="A shutdown operation has been mandated by your IT staff and will occur in $((_reboot_time * 60)) seconds." _install_url="https://go.microsoft.com/fwlink/p/?linkid=2009112" _temp_file="/tmp/office.pkg" # Grabbing the parameters and parsing through them. parse_commandline() { while test $# -gt 0; do _key="$1" case "$_key" in --forcereboot) _arg_forceReboot="on" ;; --*) _PRINT_HELP=yes die "[Error] Got an unexpected argument '$1'" 1 ;; *) _PRINT_HELP=yes die "[Error] Got an unexpected argument '$1'" 1 ;; esac shift done } cleanup() { # Clean up the Office 365 installer # Check if the file exists if [[ -f "${_temp_file}" ]]; then if rm -f "${_temp_file}"; then echo "[Info] Cleaned up the Office 365 installer" else echo "[Error] Failed to clean up the Office 365 installer" exit 1 fi else echo "[Info] Office 365 installer not found, nothing to clean up." fi } check_installed() { # Check if Office 365 is already installed if [[ -d "/Applications/Microsoft Word.app" ]] || [[ -d "/Applications/Microsoft Excel.app" ]] || [[ -d "/Applications/Microsoft PowerPoint.app" ]] || [[ -d "/Applications/Microsoft Outlook.app" ]]; then echo "[Error] Office 365 Suite or one of its components is already installed" echo "[Info] To remove the existing installation, please follow Microsoft's instructions found here:" echo "https://support.microsoft.com/en-us/office/troubleshoot-office-for-mac-issues-by-completely-uninstalling-before-you-reinstall-ec3aa66e-6a76-451f-9d35-cba2e14e94c0" exit 1 fi } # Check if we are running as system/root if [[ $EUID -ne 0 ]]; then echo "[Error] This script must be run as System from Ninja or root in the terminal" 1>&2 exit 1 fi # shellcheck disable=SC2154 if [[ "${forceReboot}" == "true" ]]; then _arg_forceReboot="on" fi parse_commandline "$@" # Check if Office 365 is already installed check_installed # Install Office 365 echo "[Info] Downloading Office 365 installer" # Download the Office 365 Suite if curl -L -o "${_temp_file}" "${_install_url}"; then echo "[Info] Office 365 installer downloaded successfully" else echo "[Error] Failed to download the Office 365 installer" exit 1 fi # Install the Office 365 Suite _results=$(installer -pkg "${_temp_file}" -target / -dumplog 2>&1) # shellcheck disable=SC2181 if [[ $? -eq 0 ]]; then echo "[Info] Office 365 Suite installed successfully" else echo "[Error] Failed to install the Office 365 Suite" _errors=$(echo "${_results}" | grep "Error") # Parse errors if (("$(echo "$_errors" | tail -2 | wc -l)" > 0)); then # Check type of error if echo "$_errors" | tail -2 | head -n 1 | grep -q "not enough space"; then # Disk space error echo "[Error] Not enough space to install Office 365 Suite" # Print the raw error message related to disk space and how much space is needed echo "$_errors" | tail -2 | head -n 1 | cut -d ":" -f 5 | cut -d "=" -f 5 | cut -d "," -f 1 else # Other errors echo "[Error] Installer Errors:" echo "$_errors" fi fi cleanup exit 1 fi cleanup if [[ $_arg_forceReboot = "on" ]]; then echo "[Info] Sending message to user that a reboot has been initiated" osascript -e "display alert \"Reboot Initiated\" message \"${_reboot_message}\" with icon caution giving up after ${_reboot_message_giveup}" /dev/null 2>&1 echo "[Info] Rebooting the device" shutdown -r "+${_reboot_time}" 2>&1 fi
Description détaillée
Voici une présentation complète du fonctionnement de ce script.
1. Analyse des arguments et fonction d’aide
Le script commence par définir une fonction print_help qui documente les paramètres pris en charge. Actuellement, un seul argument optionnel est disponible : –forcereboot. Cela déclenche un redémarrage du système après l’installation.
bash
CopyEdit
–forcereboot : Redémarrer l’appareil une fois l’installation terminée.
2. Initialisation des valeurs par défaut et des variables
Le script initialise des variables essentielles, notamment :
- _install_url : URL du programme d’installation d’Office 365 de Microsoft
- _temp_file : Chemin où le .pkg sera stocké
- _arg_forceReboot: Drapeau pour la logique de redémarrage
- _reboot_time et _reboot_message : Utilisé si le redémarrage est déclenché
3. Analyse de la ligne de commande
En utilisant parse_commandline, le script lit et valide les arguments d’entrée. Toute entrée non reconnue provoque une erreur et affiche le message d’aide.
4. Contrôles de l’environnement
Il vérifie que le script est exécuté en tant que super-utilisateur ou par le biais d’un contexte système, ce qui est essentiel pour l’installation de logiciels à l’échelle du système.
5. Contrôle préalable à l’installation
Avant de télécharger le programme d’installation, il vérifie si Office est déjà installé en détectant l’une de ces applications :
- Microsoft Word
- Microsoft Excel
- Microsoft PowerPoint
- Microsoft Outlook
S’il en trouve, il interrompt le processus afin d’éviter toute corruption ou tout conflit.
6. Téléchargement et installation
En utilisant curl, il télécharge l’installateur .pkg dans /tmp. En cas de succès, il procède à l’installation à l’aide de la commande installercommand.
7. Gestion des erreurs
Si l’installation échoue, le script capture et analyse le journal des erreurs. Il vérifie les problèmes connus tels que « pas assez d’espace » et imprime des messages lisibles par l’homme.
8. Nettoyage
Qu’il réussisse ou non, il supprime le programme d’installation téléchargé de /tmp pour garder le système de fichiers propre.
9. Redémarrage facultatif
Si –forcereboot est fourni, il utilise osascript pour notifier l’utilisateur connecté et planifie un redémarrage via l’arrêt.
Cas d’utilisation potentiels
Cas de figure : Onboarding des nouveaux appareils macOS
Un MSP acquiert un nouveau client avec 50 appareils MacBook nécessitant Office 365. Au lieu de télécharger et d’installer manuellement Office, le technicien informatique déploie ce script via le module de script de NinjaOne. Le script vérifie la présence d’instances préinstallées, télécharge le dernier programme d’installation, installe Office et, si le paramètre –forcereboot est défini, s’assure que le système redémarre pour finaliser les configurations. Ce qui prendrait des heures manuellement est désormais automatisé et réalisé en quelques minutes.
Comparaisons
Comparé à d’autres approches, ce script présente plusieurs avantages :
Méthode | Avantages | Inconvénients |
Installation manuelle | Simple pour un seul appareil | Chronophage et sujette aux erreurs |
Microsoft Endpoint Manager | Fonctionnalités de niveau entreprise | Nécessite la licence et l’installation d’Intune |
Jamf Pro | Intégration poussée de macOS | Coût et complexité |
Ce script Shell | Léger, compatible avec NinjaOne, évolutif | Moins de personnalisation basée sur l’interface graphique |
Ce script shell est idéal pour les équipes informatiques qui ont besoin d’automatisation sans disposer d’une infrastructure de gestion des appareils à grande échelle.
FAQ
Q : Ce script peut-il être utilisé sans NinjaOne ?
Oui, tant qu’il est exécuté en tant que root sur macOS. NinjaOne simplifie le déploiement à grande échelle.
Q : Que se passe-t-il si Office est partiellement installé ?
Le script recherche les applications clés d’Office et s’arrête s’il en trouve. Dans ce cas, un nettoyage manuel peut s’avérer nécessaire.
Q : Cela fonctionne-t-il sur les Mac Intel et Apple Silicon ?
Oui, le programme d’installation de Microsoft est universel. Ce script ne fait pas explicitement la différence, mais l’installateur s’en charge.
Q : Puis-je personnaliser les applications Office installées ?
Ce script utilise le programme d’installation par défaut, qui installe la suite complète. Pour les configurations personnalisées, un autre .pkg ou script de post-installation sera nécessaire.
Implications
Le déploiement de logiciels par le biais de scripts comporte à la fois des avantages et des risques. D’un point de vue positif, elle garantit la cohérence, réduit les erreurs humaines et permet de gagner du temps. Cependant, l’exécution en tant que super-utilisateur présente également des risques potentiels, en particulier si les scripts sont modifiés ou malveillants. Il est essentiel de garantir une validation, une journalisation et un contrôle de l’étendue appropriés. L’automatisation de l’installation d’Office 365 s’aligne sur les principes de sécurité informatique en réduisant les interventions manuelles et en standardisant la configuration des terminaux.
Recommandations
- Tester d’abord: Validez toujours le script sur une machine de test avant de le déployer en production.
- Utilisez les champs personnalisés de NinjaOne: Contrôlez dynamiquement le comportement de redémarrage ou suivre l’état de l’installation sur l’ensemble des appareils.
- Surveiller les journaux: Intégrez des mécanismes de journalisation si l’on souhaite développer davantage ce script.
- Mise à jour périodique: Vérifiez les modifications apportées à l’URL de téléchargement ou au comportement d’installation de Microsoft.
Conclusion
Pour les professionnels de l’informatique qui gèrent des appareils macOS, l’automatisation de l’installation de logiciels de base tels qu’Office 365 est une grande victoire. Ce script shell fournit une solution intelligente et efficace adaptée aux environnements utilisant NinjaOne. En combinant les scripts macOS natifs avec les capacités d’automatisation de NinjaOne, les équipes informatiques peuvent réaliser des déploiements rapides et évolutifs avec un minimum de friction. Qu’il s’agisse de l’intégration d’un nouveau client ou du renouvellement d’un parc existant, cette approche vous permet de maintenir la cohérence, de réduire les frais généraux et de vous concentrer sur les initiatives informatiques stratégiques.