Saltar al contenido
Inicio / Intune / Microsoft Intune: Configurar Plantillas Corporativas para Office en Versiones No Enterprise

Microsoft Intune: Configurar Plantillas Corporativas para Office en Versiones No Enterprise

Es muy posible/probable que os soliciten la configuración de plantillas de Word, Excel o PowerPoint para vuestros usuarios, algo que sabéis que súper sencillo de configurar con GPO o Intune. Hasta aquí nada nuevo, el problema llega cuando vuestros usuarios tienen por ejemplo un plan de Microsoft 365 Business Premium y os dais cuenta que esa licencia que está muy bien para muchísimas empresa, no es ninguna de las que está soportada para aplicarle directivas grupo. Las que soportan la configuración mediante directivas de grupo con la siguientes versiones:

  • Microsoft 365 Apps for enterprise
  • Office LTSC 2021
  • Office 2019
  • Office 2016

La licencia de Business Premium tiene Microsoft 365 Apps for Business como versión de las aplicaciones de Office, la cual, no tiene soporte para configuración mediante directivas de grupo. Aquí os dejo un enlace donde podéis verlo con más nivel de detalle: Office applications service description. Para los que queráis un resumen rápido, la Business Premium solo permite aplicar directivas de grupo para de forma limitada para 11 Limited to policies for web apps and privacy policies for client apps y 12 Limited to policies for web apps.

Antes de comenzar con lo que nos interesa voy a comentaros que, si configuráis un perfil de configuración de Intune donde defináis las rutas (locales o de red) de vuestras plantillas de Office (Word, Excel, PowerPoint), las claves de registro correspondientes se actualizarán (HKEY_CURRENT_USER\Software\Policies\Microsoft\office\16.0\common\general\usertemplates, ) pero vuestro Office no les hará caso alguno sino es alguna de las versiones que os he comentado al principio.

Pues ahora sí, lo primero mostrarnos de forma gráfica el proceso que llevaremos a cabo mediante Intune y el despliegue de aplicaciones para realizar todo el proceso:

A continuación os muestro los objetivos que yo tenía para este proceso:

  1. Copiar las plantillas de Word a todos los usuarios de la organización, todos los equipos están unidos a AzureAD y no se tiene servidor de ficheros ni VPN
  2. La copia debe ser de forma segura, siempre autenticada y con tráfico TLS
  3. Comprobar que los usuarios tienen todas las plantillas de una forma que nos garantice que hemos copiado las plantillas
  4. Establecer las claves de registro necesarias para que sus versiones de Office tengan configuradas las rutas hacia las plantillas previamente copiadas
  5. Tener un directorio con todas las plantillas actualizadas sin que IT tenga intervenir de forma manual en cada ocasión que se tengan que actualizar las plantillas
  6. Comprobar que todos los usuarios que ya tenían las plantillas que tengan bien la clave de registro que configure el Word para establecer la ruta de las plantillas

Ahora punto por punto os explico como lo he solventado, pero además, esto podéis utilizarlo para otros procesos de copiado de ficheros, etc…:

  1. Utilizaré un script de PowerShell que se descargará el AzCopy para descargarse las plantillas que están en una cuenta de almacenamiento
  2. La conexión con la cuenta de almacenamiento será vía HTTPS, acceso autenticado mediante SASToken el cual está limitado en tiempo y acceso (lectura y listado)
  3. Otro script comparará los HASH de cada fichero descargado con los que hay en la cuenta de almacenamiento para asegurarse que se han copiado correctamente, además de si existe alguna nueva plantilla que la vuelva a descargar
  4. Con el primer script de PowerShell que descargaré las plantillas de Word de la cuenta de almacenamiento  ya establecemos la clave de registro (HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Word\options\PersonalTemplates) que configura la ruta de las plantilla personales en Word.
  5. Con la cuenta de almacenamiento en Azure, se puede configurar un script (automatizado) para que alguien de marketing de la empresa pueda ir subiendo las plantillas (u otro método vamos)
  6. Se utilizarán scripts de remediación para que vaya revisando las claves de registro de los usuarios y sino están bien, con un script de corrección que lo vaya actualizando.

No puedo escribirlo todo, pero aquí os dejo como definir la seguridad de la container creado en la cuenta de almacenamiento de Azure y como obtener el SASToken que luego utilizaremos en el script:

Accedemos al container que hemos creado para las plantillas de Word (wordtemplates) y pulsamos sobre Change access level y lo establecemos como os muestro (Private (no anonumous)):

Luego, para obtener el SAS Token pulsamos en Shared access tokens y en permisos elegimos Rea y List, definimos la fecha máxima de vigencia y pulsamos en Generate  SAS Token and Url y copiamos el texto de la línea Blob SAS token:

Ahora aquí os dejo los scripts que he creado:

  • Intune-Word-Add.ps1: script que descargará las plantillas y configurará las claves de registro
  • Intune-Word-Del.ps1: script para borrar las plantillas (también podríamos incluir que borrase las claves de registro que configura el Word)
  • Intune-Word-DR.ps1: script utilizando como método de detección para que Intune tenga constancia de que la aplicación se ha instalado correctamente. En este caso lo vamos a utilizar para comprobar que tenemos las plantillas descargadas y mediante su HASH verificar que se han copiado correctamente.

Como os había comentado al principio, utilizaré AzCopy (+ info sobre AzCopy aquí: Introducción a AzCopy) para conectarse de forma segura a la cuenta de almacenamiento y descargarme las plantillas, pero los equipos no tienen AzCopy instalado o más bien descargado el .exe que es lo único que necesitamos. Para no tener que llevarlo en dentro del .intunewim se descargará desde Internet en el directorio temporal del perfil del usuario ($env:LOCALAPPDATA\Temp) y luego se borrará para no dejarlo ahí (Get-ChildItem -path $TempFolder -Recurse -Filter ‘azco*’ | Remove-Item -Force -Recurse):

 

El proceso es parecido al de instalación, volvemos a descargarnos las plantillas para luego comparar los HASH de cada uno de los ficheros (sean 1 o 100) y si hay diferencias entonces se tiene que reintentar la instalación de las plantillas. Siempre estoy comentando instalar pero porque estamos utilizando un paquete intunewin para desplegarlo como una aplicación desde Intune, pero vamos, que es copiar ficheros :-).

# Carpetas donde se guardarán las plantillas en el perfil del usuario
$WordTemplates = "$env:APPDATA\Microsoft\Templates\Word"
$WordThemes = "$env:APPDATA\Microsoft\Templates\Document Themes"
$WordThemesColor = "$env:APPDATA\Microsoft\Templates\Document Themes\Theme Colors"
# SASToken
$SASToken = "https://smbWord.blob.core.windows.net/wordtemplates/*?sp=rl&st=2023-12-19T14:02:03Z&se=2026-01-01T22:02:03Z&spr=https&sv=2022-11-02&sr=c&sig=RY2kW47wQfV%2FwcjmXtQ4g8u9FV54g2VD%2FIS%2Fllun9Ok%3D"
# Descargar AzCopy
$TempFolder = "$env:LOCALAPPDATA\TEMP"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -Uri 'https://azcopyvnext.azureedge.net/release20220315/azcopy_windows_amd64_10.14.1.zip' -OutFile $TempFolder\azcopyv10.zip
Expand-archive -Path $TempFolder\azcopyv10.zip -Destinationpath $TempFolder -Force
$AzCopy = (Get-ChildItem -path $TempFolder -Recurse -File -Filter 'azcopy.exe').FullName


# Descargar y guardar las plantillas en las rutas correspondientes
& $AzCopy copy $SASToken $WordTemplates --include-pattern=*.dotx --recursive --overwrite=True
& $AzCopy copy $SASToken $WordThemes --include-pattern=*.xml --recursive --overwrite=True
& $AzCopy copy $SASToken $WordThemesColor --include-pattern=*.thmx --recursive --overwrite=True
# Establecer ruta de las plantilla para las versiones de Office No Enterprise
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\16.0\Word\options" -Name "PersonalTemplates"  -Value $WordTemplates -PropertyType ExpandString -Force

Nota: en la ruta del SAS Token debéis cambiar /wordtemplates/?sp por /wordtemplates/*?sp, para que con el comando AzCopy copy solo copie los elementos que están dentro del container.

Una vez que se ha descargado las plantillas, ahora  se ejecutará el script Intune-Word-DR.ps1 para verificar que todo se ha copiado correctamente, como os he comentado, una salida Exit 0 del script será lo que le indicará a Intune que la aplicación está bien instalada. Personalmente me ha gustado esta forma de comprobar que los ficheros son los que tienen que ser, porque sino  .. habia pensado en contarlos, en ver su tamaño, etc .. pero es muy estático y siempre me obligaría a modificar el script y por ello crear cada vez que haya modificaciones en las plantillas (en las existentes o nuevas) un paquete .intunewin y volver a subirlo, no tenía sentido.

# Carpetas a comprobar el hash de los ficheros
$WordCheckFolder = "$env:LOCALAPPDATA\TEMP\Word"
$WordTemplates = "$env:APPDATA\Microsoft\Templates\Word"
# SASToken
$SASToken = "https://smbWord.blob.core.windows.net/wordtemplates/*?sp=rl&st=2023-12-19T14:02:03Z&se=2026-01-01T22:02:03Z&spr=https&sv=2022-11-02&sr=c&sig=RY2kW47wQfV%2FwcjmXtQ4g8u9FV54g2VD%2FIS%2Fllun9Ok%3D"
if (Test-Path $WordTemplates){
    # Descargar AzCopy
    $TempFolder = "$env:LOCALAPPDATA\TEMP"
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    Invoke-WebRequest -Uri 'https://azcopyvnext.azureedge.net/release20220315/azcopy_windows_amd64_10.14.1.zip' -OutFile $TempFolder\azcopyv10.zip
    Expand-archive -Path $TempFolder\azcopyv10.zip -Destinationpath $TempFolder -Force
    $AzCopy = (Get-ChildItem -path $TempFolder -Recurse -File -Filter 'azcopy.exe').FullName
    # Descargar plantillas de Azure para comprobar su HASH
    & $AzCopy copy $SASToken $WordCheckFolder --include-pattern=*.dotx --recursive --overwrite=True
    # Obtener los HASH de cada fichero de cada carpeta
    $LocalTemplates = Get-ChildItem -Filter *.dotx -Path $WordTemplates | foreach {Get-FileHash -Path $_.FullName}
    $AzureTemplates = Get-ChildItem -Filter *.dotx -Path $WordCheckFolder | foreach {Get-FileHash -Path $_.FullName}
    # Comparar los HASH
    $HashDifferent = Compare-Object -ReferenceObject $AzureTemplates.Hash  -DifferenceObject $LocalTemplates.Hash
        if ($HashDifferent.InputObject -eq $Null){
            Write-host "Updated templates"
            Remove-Item -Path $WordCheckFolder -Recurse
            Get-ChildItem -path $TempFolder -Recurse -Filter 'azco*' | Remove-Item -Force -Recurse
            Exit 0
        }
        else {
            Write-host "Templates to be updated"
            Exit 1618
        }
}
else {
    Write-host "The template directory is not created"
    Exit 1618
}

Por último, el script Intune-Word-Del.ps1 que borrará las plantillas locales de cada usuario:

$Wordolder = "$env:APPDATA\Microsoft\Templates\Word"
Get-ChildItem $PivotalFolder -Filter  *.dotx   | Remove-Item -Force
Ahora aquí os dejo el resumen de la configuración de la configuración del paquete intunewin que habéis creado con los scripts anteriores:
 
Con esto, ya tenemos las plantillas descargadas y el Word configurado:
Y ya los usuarios para que los usuarios puedan crear documentos utilizando las plantillas corporativas:
 
Y ahora si, por último,  os dejo aquí los dos scripts para revisar que equipos no tienen el Word configurado para las plantillas con los scripts de remediación:
  • Intune-Templates-Check.ps1: comprueba que existe la clave del registro configurada como queremos
  • Intune-Templates-Remediation.ps1: establece las claves que configuran el Word:

Aquí el Intune-Templates-Check.ps1: solo compruebo que esté la clave, porque ya con lo anterior ya tengo las plantillas descargadas, pero esto es para usuario que ya tienen las plantillas pero no las claves de registro configuradas:

$KeyWord = "Registry::HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Word\Options"
$KeyPPoint = "Registry::HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\PowerPoint\Options"
$PersonalWordTemplates = (Get-ItemProperty -Path $KeyWord  -Name PersonalTemplates -ErrorAction SilentlyContinue).PersonalTemplates
$PersonalPowerPointTemplates = (Get-ItemProperty -Path $KeyPPoint  -Name PersonalTemplates -ErrorAction SilentlyContinue).PersonalTemplates
if (($PersonalWordTemplates -eq $null) -or ($PersonalPowerPointTemplates -eq $null)){
    Write-Host "Pending configuration of the template path"
    Exit 1
}
else {
    Write-Host "Configured template path"
    Exit 0
}

Y para los usuarios Intune-Templates-Remediation.ps1: si el script anterior termina con un Exit 1 entonces se ejecutaría este:

# Ruta de las plantillas
$WordTemplates = "$env:APPDATA\Microsoft\Templates\Word"
# Establecer ruta de las plantillas de Word  para las versiones de Office No Enterprise
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\16.0\Word\options" -Name "PersonalTemplates"  -Value $WordTemplates -PropertyType ExpandString -Force
# Establecer ruta de las plantillas de PowerPoint  para las versiones de Office No Enterprise
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\16.0\powerpoint\options" -Name "PersonalTemplates"  -Value $WordTemplates -PropertyType ExpandString -Force
Aquí os dejo la capturas de pantalla de como configurar:
 
Escribimos un nombre para el script de remediación:
Ahora añadimos el script de detección:
 
Y aquí el script de correción:
Por último, definimos la periodicidad con la que queremos que se ejecute el script en los equipos:
Listo, ahora pulsamos en Create y ya tenemos todo finalizado:
Después de unas horas podéis ir viendo como se va ejecutando y nos va indicando si hay equipos para corregir, etc..:
 
Como veis se sencillo, creo que la comparación de los HASH nos da un plus de seguridad a la hora de comprobar ficheros, configuraciones, etc..  si alguien tiene alguna duda sobre este artículo, por favor, dejarlo en los comentarios y os responderé encantando.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¡Comparte!