Cómo utilizar PowerShell para automatizar las instalaciones de Office 365

En el vertiginoso y exigente mundo de las TI, cualquier herramienta que ahorre tiempo y simplifique las tareas vale su peso en oro. Hoy vamos a explorar cómo se pueden utilizar los scripts de PowerShell para automatizar las instalaciones de Office 365, una operación crítica que puede ahorrarte incontables horas a largo plazo. De hecho, con un script bien escrito, puedes gestionar instalaciones en toda una red desde tu escritorio. Este post está dirigido a profesionales de TI y proveedores de servicios gestionados (MSP) que deseen agilizar sus implantaciones de Office 365 utilizando la potencia de PowerShell.

¿Por qué automatizar las instalaciones de Office 365 con PowerShell?

PowerShell es un lenguaje avanzado de scripting y shell desarrollado por Microsoft. Forma parte integral del ecosistema de Windows desde Windows 7, y su potencia y flexibilidad lo han convertido en una herramienta vital para muchos profesionales de TI y MSP. Automatizar las instalaciones de Office 365 mediante PowerShell puede reducir drásticamente el tiempo y el esfuerzo necesarios para implementar Office 365 en varios equipos. 

Además, los scripts PowerShell pueden personalizarse para que se adapten a tus necesidades. Por ejemplo, el script se puede configurar para instalar componentes específicos de Office 365, aplicar determinadas configuraciones e incluso limpiar después de la instalación. Este nivel de personalización permite a los profesionales de TI y a los MSP garantizar que Office 365 se implementa de forma coherente en todos los equipos, en consonancia con las políticas y estándares de TI de la empresa. 

Profundicemos: el script PowerShell para automatizar las instalaciones de Office 365

Echemos un vistazo más de cerca a un script PowerShell de ejemplo para automatizar las instalaciones de Office 365. Este script está diseñado para instalar Office 365 utilizando un archivo de configuración personalizado o uno predeterminado. En caso de que falle la instalación, el script da un mensaje de error, lo que facilita la resolución de problemas.

Lo que hace que este script sea especialmente útil es su capacidad para descargar y utilizar la Herramienta de implantación de Office desde los servidores de Microsoft. Esta función garantiza que siempre se utilice la última versión de Office 365 para la instalación. Además, el script comprueba si el paquete Office 365 se ha instalado correctamente, lo que supone una garantía adicional.

Tras una instalación correcta, el script activa un reinicio del sistema. Esto es especialmente útil, ya que algunos componentes de Office 365 requieren un reinicio del sistema para funcionar correctamente. El script también está equipado con un mecanismo de limpieza que puede activarse para eliminar los archivos de instalación una vez instalado Office 365.

Script PowerShell de instalación de Microsoft Office 365

#Requires -Version 5.1

<# .SYNOPSIS Installs Office 365 from a config file or creates a generic config file and installs. .DESCRIPTION Installs Office 365 from a config file or creates a generic config file and installs. .EXAMPLE No parameters need if you want to use the default config file OR change the $OfficeXML variable to use your XML config file's content. .EXAMPLE -ConfigurationXMLFile https://replace.me/configuration.xml Install Office 365 and use a local config file. You can use https://config.office.com/deploymentsettings to help build the config file. .OUTPUTS None .NOTES This will reboot after a successful install. Minimum OS Architecture Supported: Windows 10, Windows Server 2016 Release Notes: Renamed script and added Script Variable support, made restarts optional, changed default download path to %TEMP%\Office365Install, switched to downloading an xml instead of using a local path. #>

[CmdletBinding()]
param(
    # Use a existing config file
    [Parameter()]
    [String]$ConfigurationXMLFile,
    # Path where we will store our install files and our XML file
    [Parameter()]
    [String]$OfficeInstallDownloadPath = "$env:TEMP\Office365Install",
    [Parameter()]
    [Switch]$Restart = [System.Convert]::ToBoolean($env:restartComputer)
)

begin {
    if ($env:linkToConfigurationXml -and $env:linkToConfigurationXml -notlike "null") { $ConfigurationXMLFile = $env:linkToConfigurationXml }

    $CleanUpInstallFiles = $True

    # In case 'https://' is omitted from the URL.
    if ($ConfigurationXMLFile -and $ConfigurationXMLFile -notmatch "^http(s)?://") {
        Write-Warning "http(s):// is required to download the file. Adding https:// to your input...."
        $ConfigurationXMLFile = "https://$ConfigurationXMLFile"
        Write-Warning "New Url $ConfigurationXMLFile."
    }

    # Set TLS Version
    $SupportedTLSversions = [enum]::GetValues('Net.SecurityProtocolType')
    if ( ($SupportedTLSversions -contains 'Tls13') -and ($SupportedTLSversions -contains 'Tls12') ) {
        [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol::Tls13 -bor [System.Net.SecurityProtocolType]::Tls12
    }
    elseif ( $SupportedTLSversions -contains 'Tls12' ) {
        [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
    }
    else {
        # Not everything requires TLS 1.2, but we'll try anyway.
        Write-Warning "TLS 1.2 and or TLS 1.3 are not supported on this system. This script may fail!"
        if ($PSVersionTable.PSVersion.Major -lt 3) {
            Write-Warning "PowerShell 2 / .NET 2.0 doesn't support TLS 1.2."
        }
    }

    function Set-XMLFile {
        # XML data that will be used for the download/install
        # Example config below generated from https://config.office.com/
        # To use your own config, just replace  to  with your xml config file content.
        # Notes:
        #  "@ can not have any character after it
        #  @" can not have any spaces or character before it.
        $OfficeXML = [XML]@"

  
  
    
      
      
      
      
      
      
    
  
  
  
  
  
  
  
  
    
    
    
    
  
  
   
  

"@
        #Save the XML file
        $OfficeXML.Save("$OfficeInstallDownloadPath\OfficeInstall.xml")
      
    }
    function Get-ODTURL {
    
        [String]$MSWebPage = Invoke-RestMethod 'https://www.microsoft.com/en-us/download/confirmation.aspx?id=49117'
    
        $MSWebPage | ForEach-Object {
            if ($_ -match 'url=(https://.*officedeploymenttool.*\.exe)') {
                $matches[1]
            }
        }
    
    }
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        if ($p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
        { Write-Output $true }
        else
        { Write-Output $false }
    }

    # Utility function for downloading files.
    function Invoke-Download {
        param(
            [Parameter()]
            [String]$URL,
            [Parameter()]
            [String]$Path,
            [Parameter()]
            [int]$Attempts = 3,
            [Parameter()]
            [Switch]$SkipSleep
        )
        Write-Host "URL given, Downloading the file..."

        $i = 1
        While ($i -le $Attempts) {
            # Some cloud services have rate-limiting
            if (-not ($SkipSleep)) {
                $SleepTime = Get-Random -Minimum 3 -Maximum 15
                Write-Host "Waiting for $SleepTime seconds."
                Start-Sleep -Seconds $SleepTime
            }
        
            if ($i -ne 1) { Write-Host "" }
            Write-Host "Download Attempt $i"

            try {
                # Invoke-WebRequest is preferred because it supports links that redirect, e.g., https://t.ly
                if ($PSVersionTable.PSVersion.Major -lt 4) {
                    # Downloads the file
                    $WebClient = New-Object System.Net.WebClient
                    $WebClient.DownloadFile($URL, $Path)
                }
                else {
                    # Standard options
                    $WebRequestArgs = @{
                        Uri                = $URL
                        OutFile            = $Path
                        MaximumRedirection = 10
                        UseBasicParsing    = $true
                    }

                    # Downloads the file
                    Invoke-WebRequest @WebRequestArgs
                }

                $File = Test-Path -Path $Path -ErrorAction SilentlyContinue
            }
            catch {
                Write-Warning "An error has occurred while downloading!"
                Write-Warning $_.Exception.Message

                if (Test-Path -Path $Path -ErrorAction SilentlyContinue) {
                    Remove-Item $Path -Force -Confirm:$false -ErrorAction SilentlyContinue
                }

                $File = $False
            }

            if ($File) {
                $i = $Attempts
            }
            else {
                Write-Warning "File failed to download."
                Write-Host ""
            }

            $i++
        }

        if (-not (Test-Path $Path)) {
            Write-Error -Message "Failed to download file!" -Category InvalidResult -Exception (New-Object System.Deployment.Application.DeploymentDownloadException)
            exit 1
        }
    }

    # Check's the two Uninstall registry keys to see if the app is installed. Needs the name as it would appear in Control Panel.
    function Find-UninstallKey {
        [CmdletBinding()]
        param (
            [Parameter(ValueFromPipeline)]
            [String]$DisplayName,
            [Parameter()]
            [Switch]$UninstallString
        )
        process {
            $UninstallList = New-Object System.Collections.Generic.List[Object]

            $Result = Get-ChildItem HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Get-ItemProperty | 
                Where-Object { $_.DisplayName -like "*$DisplayName*" }

            if ($Result) { $UninstallList.Add($Result) }

            $Result = Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Get-ItemProperty | 
                Where-Object { $_.DisplayName -like "*$DisplayName*" }

            if ($Result) { $UninstallList.Add($Result) }

            # Programs don't always have an uninstall string listed here so to account for that I made this optional.
            if ($UninstallString) {
                # 64 Bit
                $UninstallList | Select-Object -ExpandProperty UninstallString -ErrorAction Ignore
            }
            else {
                $UninstallList
            }
        }
    }
}
process {
    $VerbosePreference = 'Continue'
    $ErrorActionPreference = 'Stop'

    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges." -Category PermissionDenied -Exception (New-Object System.Security.SecurityException)
        exit 1
    }

    if (-not (Test-Path $OfficeInstallDownloadPath )) {
        New-Item -Path $OfficeInstallDownloadPath -ItemType Directory | Out-Null
    }

    if (-not ($ConfigurationXMLFile)) {
        Set-XMLFile
    }
    else {
        Invoke-Download -URL $ConfigurationXMLFile -Path "$OfficeInstallDownloadPath\OfficeInstall.xml"
    }

    $ConfigurationXMLFile = "$OfficeInstallDownloadPath\OfficeInstall.xml"
    $ODTInstallLink = Get-ODTURL

    #Download the Office Deployment Tool
    Write-Host 'Downloading the Office Deployment Tool...'
    Invoke-Download -URL $ODTInstallLink -Path "$OfficeInstallDownloadPath\ODTSetup.exe"

    #Run the Office Deployment Tool setup
    try {
        Write-Host 'Running the Office Deployment Tool...'
        Start-Process "$OfficeInstallDownloadPath\ODTSetup.exe" -ArgumentList "/quiet /extract:$OfficeInstallDownloadPath" -Wait -NoNewWindow
    }
    catch {
        Write-Warning 'Error running the Office Deployment Tool. The error is below:'
        Write-Warning $_
        exit 1
    }

    #Run the O365 install
    try {
        Write-Host 'Downloading and installing Microsoft 365'
        $Install = Start-Process "$OfficeInstallDownloadPath\Setup.exe" -ArgumentList "/configure $ConfigurationXMLFile" -Wait -PassThru -NoNewWindow

        if ($Install.ExitCode -ne 0) {
            Write-Error -Message "Exit Code does not indicate success!" -Category InvalidResult -Exception (New-Object System.Deployment.Application.DeploymentException)
            exit 1
        }
    }
    Catch {
        Write-Warning 'Error running the Office install. The error is below:'
        Write-Warning $_
    }

    $OfficeInstalled = Find-UninstallKey -DisplayName "Microsoft 365"

    if ($CleanUpInstallFiles) {
        Write-Host "Cleaning up install files..."
        Remove-Item -Path $OfficeInstallDownloadPath -Force -Recurse
    }

    if ($OfficeInstalled) {
        Write-Host "$($OfficeInstalled.DisplayName) installed successfully!"
        if ($Restart) { Start-Process shutdown.exe -ArgumentList "-r -t 60" -Wait -NoNewWindow }
        exit 0
    }
    else {
        Write-Error -Message 'Microsoft 365 was not detected after the install ran!' -Category InvalidResult -Exception (New-Object System.Deployment.Application.DeploymentException)
        exit 1
    }
}
end {}

 

Accede a más de 700 scripts en el Dojo de NinjaOne

Obtén acceso

Ejemplos de uso del script

Escenario 1: despliegue a gran escala

Supongamos que eres administrador de TI en una empresa que está a punto de incorporar a cien nuevos empleados. Instalar manualmente Office 365 en cada ordenador sería una tarea cuando menos intimidante. En su lugar, puedes utilizar este script de PowerShell para automatizar el proceso. Utilizando NinjaOne para ejecutar el script de forma remota en cada dispositivo, puedes estandarizar la instalación de Office 365 en toda la red. Este enfoque simplificado no sólo ahorra un tiempo valioso, sino que también garantiza la uniformidad, una característica esencial para gestionar eficazmente una gran infraestructura de TI.

Descubre cómo NinjaOne puede mejorar la eficiencia de tu infraestructura de TI.  

Enlace: https://www.ninjaone.com/es/eficiencia/

Escenario 2: personal remoto 

Con el auge del trabajo a distancia, muchas empresas tienen empleados que trabajan desde distintos lugares con sus propios dispositivos. Garantizar que cada trabajador remoto tenga una versión de Office 365 correctamente instalada y configurada enpuede ser todo un reto. Sin embargo, si distribuyes este script PowerShell a tu personal remoto, pueden realizar la instalación ellos mismos. El script garantiza que Office 365 se instale correctamente y se configure según los estándares de tu organización.

Escenario 3: gestión de clientes MSP

Como proveedor de servicios gestionados (MSP), es posible que gestiones las TI de varias pequeñas empresas, cada una con sus propias necesidades y configuraciones específicas. Con este script PowerShell, puedes crear varios archivos de configuración XML adaptados a las necesidades de cada cliente. Cuandollegueel momento de instalar o actualizar Office 365 para un cliente, basta con ejecutar el script con el archivo deconfiguración adecuado. Esto garantiza una configuración de Office personalizada y coherente para cada uno de tus clientes. 

Escenario 4: actualizaciones periódicas  

Microsoft actualiza Office 365 con regularidad, y mantener las instalaciones de tu organizaciónal díapuede ser una tarea que lleve mucho tiempo. Con este script, puedes programar actualizaciones automáticas para que se ejecuten en el momento adecuado, garantizando una interrupción mínima del flujo de trabajo de tu equipo. El script utiliza la herramienta de implementación de Office para descargar e instalar la última versión de Office, lo que garantiza que tu equipo siempre tenga acceso a las últimas funciones y actualizaciones de seguridad. 

En cada uno de estos escenarios, este script de PowerShell puede simplificar significativamente el proceso de instalación y administración de Office 365. Al automatizar estas tareas, puedes ahorrar tiempo, reducir el riesgo de errores y garantizar una experiencia de Office coherente y fiable para tus usuarios. 

Uso del script en tu flujo de trabajo

La integración de este script de PowerShell en tu flujo de trabajo puede simplificar el proceso de implementación de Office 365. En lugar de descargar y ejecutar manualmente la herramienta de implantación de Office en cada equipo, el script puede ejecutarse de forma remota desde una ubicación central, lo cual reduce las posibilidades de error humano y garantiza una configuración estándar en todas las instalaciones.

Además, al personalizar el archivo de configuración XML, puedes adaptar la instalación de Office 365 a las necesidades de tu organización. Esto incluye especificar la versión de Office, el canal de actualización e incluso los componentes individuales de Office que se van a instalar.

Reflexiones finales

La automatización es el mejor amigo de un profesional de TI, y PowerShell ofrece una potente forma de automatizar las instalaciones de Office 365. Este práctico script no sólo agiliza el proceso de despliegue, sino que también ofrece opciones de personalización y funciones de limpieza.

Al integrar este script en tu flujo de trabajo, puedes reducir significativamente el tiempo y el esfuerzo necesarios para gestionar las instalaciones de Office 365 en toda tu red. Así pues, aprovecha el poder de PowerShell y haz implantar Office sea un juego de niños.

NinjaOne puede simplificar tus operaciones mediante la automatización de tareas repetitivas y largas. Su interfaz de fácil manejo permite a los técnicos de todos los niveles aplicar fácilmente la automatización en los endpoints, incluidos scripts personalizados de una amplia biblioteca, lo que hace que la corrección sea sencilla e intuitiva. Como señaló Chris Hesler de Crossroads Church’s, «NinjaOne nos ha ayudado a reducir las horas de trabajo. Ahora somos capaces de aportar más automatización con la biblioteca de scripts y resolver los problemas recurrentes». Descubre el poder transformador de automatizar tus operaciones de TI con NinjaOne, una herramienta diseñada para ser flexible e intuitiva. 

Categorías:

Quizá también te interese…

×

¡Vean a NinjaOne en acción!

Al enviar este formulario, acepto la política de privacidad de NinjaOne.

Términos y condiciones de NinjaOne

Al hacer clic en el botón “Acepto” que aparece a continuación, estás aceptando los siguientes términos legales, así como nuestras Condiciones de uso:

  • Derechos de propiedad: NinjaOne posee y seguirá poseyendo todos los derechos, títulos e intereses sobre el script (incluidos los derechos de autor). NinjaOne concede al usuario una licencia limitada para utilizar el script de acuerdo con estos términos legales.
  • Limitación de uso: solo podrás utilizar el script para tus legítimos fines personales o comerciales internos, y no podrás compartirlo con terceros.
  • Prohibición de republicación: bajo ninguna circunstancia está permitido volver a publicar el script en ninguna biblioteca de scripts que pertenezca o esté bajo el control de cualquier otro proveedor de software.
  • Exclusión de garantía: el script se proporciona “tal cual” y “según disponibilidad”, sin garantía de ningún tipo. NinjaOne no promete ni garantiza que el script esté libre de defectos o que satisfaga las necesidades o expectativas específicas del usuario.
  • Asunción de riesgos: el uso que el usuario haga del script corre por su cuenta y riesgo. El usuario reconoce que existen ciertos riesgos inherentes al uso del script, y entiende y asume cada uno de esos riesgos.
  • Renuncia y exención: el usuario no hará responsable a NinjaOne de cualquier consecuencia adversa o no deseada que resulte del uso del script y renuncia a cualquier derecho o recurso legal o equitativo que pueda tener contra NinjaOne en relación con su uso del script.
  • CLUF: si el usuario es cliente de NinjaOne, su uso del script está sujeto al Contrato de Licencia para el Usuario Final (CLUF).