Script de Powershell para configurar firmas de correo electrónico de usuarios a nivel de Tenant en Microsoft Office 365
Set-Signatures es un script de PowerShell que permite a los administradores de Microsoft 365 y Exchange Online configurar firmas de correo electrónico de forma centralizada para todos los usuarios de una organización.
- Configuración masiva de firmas para múltiples usuarios
- Configuración individual por usuario específico
- Plantillas HTML personalizables
- Integración con Microsoft Graph para obtener datos de usuarios
- Configuración automática en Outlook Web App (OWA)
- Sistema de logging detallado
- Estadísticas de ejecución
- Manejo de errores
- PowerShell 5.1 o (Recomendable Powershell 7)
- Windows 10/11 o Windows Server 2016+
- Conexión a Internet
El script utiliza diferentes modulos de Powershell, que verificará e instalará automáticamente en caso de que no se encuentren instalados en el sistema:
ExchangeOnlineManagementMicrosoft.GraphAz.Accounts
- Microsoft Graph:
User.Read.All - Exchange Online: Permisos de administrador para configurar buzones
# Descargar la última versión
Invoke-WebRequest -Uri "https://github.com/pablolgamarra/Set-Signatures/releases/latest/download/Set-Signatures.ps1" -OutFile "Set-Signatures.ps1"git clone https://github.com/pablolgamarra/Set-Signatures.git
cd Set-Signatures.\Set-Signatures.ps1 -BusinessName <string> -TemplatePath <string> [-UserMail <string>] [-SetOWA] [-LogPath <string>]| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
BusinessName |
String | ✅ Sí | Nombre de la organización para nombrar las firmas |
TemplatePath |
String | ✅ Sí | Ruta al archivo HTM de plantilla |
UserMail |
String | ❌ No | Email del usuario específico. Si se omite, procesa todos los usuarios |
SetOWA |
Switch | ❌ No | Habilita la configuración de firmas en OWA (default: $false) |
LogPath |
String | ❌ No | Ruta para guardar logs. Si se omite, solo muestra en consola |
.\Set-Signatures.ps1 `
-BusinessName "Acme Corp" `
-TemplatePath "C:\Templates\signature.html" `
-SetOWA.\Set-Signatures.ps1 `
-BusinessName "Acme Corp" `
-TemplatePath "C:\Templates\signature.html" `
-UserMail "usuario@acme.com" `
-SetOWA.\Set-Signatures.ps1 `
-BusinessName "Acme Corp" `
-TemplatePath "C:\Templates\signature.html" `
-SetOWA `
-LogPath "C:\Logs".\Set-Signatures.ps1 `
-BusinessName "Acme Corp" `
-TemplatePath "C:\Templates\signature.html"La plantilla HTML debe contener los siguientes placeholders:
| Placeholder | Descripción | Ejemplo |
|---|---|---|
{0} |
Nombre completo del usuario | Juan Pérez |
{1} |
Título del trabajo | Gerente Dpto. TI |
{2} |
Teléfono de negocio | +595 21 123456 |
{3} |
Email (para href) | juan.perez@empresa.com |
{4} |
Email (para mostrar) | juan.perez@empresa.com |
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Email Signature</title>
</head>
<body style="font-family: Arial, sans-serif; font-size: 10pt;">
<table style="border-collapse: collapse;">
<tr>
<td>
<strong style="font-size: 14pt; color: #1a1a1a;">{0}</strong><br>
<span style="color: #666666;">{1}</span><br>
<span style="color: #666666;">Tel: {2}</span><br>
<a href="mailto:{3}" style="color: #0066cc;">{4}</a>
</td>
</tr>
</table>
</body>
</html>El repositorio incluye una plantilla profesional en templates/signature-example.html que se puede usar como punto de partida, aunque con que el HTML personalizado de tu firma esté bien configurado, debería funcionar.
El script proporciona mensajes codificados por colores:
- 🟢 SUCCESS: Operaciones exitosas
- 🔵 INFO: Información general
- 🟡 WARNING: Advertencias
- 🔴 ERROR: Errores
Al finalizar, el script muestra un resumen:
========================================
EXECUTION SUMMARY
========================================
Total Users Processed: 50
Successful: 48
Failed: 2
Failed Users:
- usuario1@empresa.com
- usuario2@empresa.com
========================================La primera vez que ejecutes el script:
- Se abrirá una ventana de autenticación de Microsoft
- Inicia sesión con una cuenta de administrador
- Acepta los permisos solicitados
Para scripts automatizados, considera usar:
- Service Principal con certificado
- Managed Identity en Azure
Las imágenes deben usar URLs absolutas (no rutas locales):
<!-- ❌ NO funcionará -->
<img src="../images/logo.png">
<!-- ✅ SÍ funcionará -->
<img src="https://www.empresa.com/assets/logo.png">- Las firmas HTML tienen un límite de 30 KB
- Las imágenes externas pueden ser bloqueadas por políticas de seguridad
- Algunos clientes de correo pueden no renderizar CSS complejo
El script configura automáticamente PostponeRoamingSignaturesUntilLater en el tenant para evitar conflictos con firmas locales.
Solución: Verifica que tengas permisos de administrador y que el módulo Microsoft.Graph esté actualizado:
Update-Module Microsoft.Graph -ForceSolución: Asegúrate de que tu plantilla HTML contenga los placeholders {0} a {4}.
Solución:
- Verifica que el email del usuario sea correcto
- Confirma que el usuario tenga un buzón de Exchange Online
- Verifica que tengas permisos para leer usuarios
Las contribuciones son bienvenidas. Por favor:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para más detalles.
Pablo Gamarra
- GitHub: @pablolgamarra
- LinkedIn: Pablo Gamarra
- Comunidad de PowerShell
- Microsoft Exchange Team
- Todos los contribuidores
- Sistema de logging con niveles (INFO, WARNING, ERROR, SUCCESS)
- Estadísticas detalladas de ejecución
- Soporte para múltiples usuarios
- Validación de plantillas HTML
- Manejo robusto de errores por usuario
- Barras de progreso
- Mejorado el manejo de conexiones
- Optimizado el procesamiento de arrays
- Actualizada la documentación
- Problema con objetos individuales vs arrays
- Error al procesar un solo usuario
- Manejo de teléfonos de negocio vacíos
- Versión inicial funcional
Hecho con ❤️ por Pablo Gamarra