¿El despliegue de un MSI por GPO “funciona” pero al arrancar el servicio se revierte y en el log aparece System error 1376: The specified local group does not exist? Esta guía explica la causa raíz, cómo localizar el grupo implicado y cómo solucionarlo de forma fiable en entornos Windows/AD.
Escenario y síntomas
- Se despliega un
.msi
mediante un script de inicio de equipo en GPO: Equipo > Directivas > Configuración de Windows > Scripts > Inicio. - El script llama a un
.cmd
que ejecuta el MSI con parámetros (por ejemplo, cuenta de dominio y contraseña para el servicio que instala). - El paquete se lee desde
\\domain\netlogon
. La instalación parece terminar, pero al iniciar el servicio, el instalador hace rollback y deja una carpeta casi vacía enC:\Program Files\...
. - En el log del MSI se observa el texto: System error 1376: The specified local group does not exist.
- Si el
.cmd
se ejecuta manualmente en el equipo, sí funciona y el servicio arranca.
Qué significa el error 1376
El código 1376 es un error de Windows que indica que el grupo local al que se intenta hacer referencia no existe en el equipo. En un MSI o en un script, esto suele aparecer cuando:
- Se intenta agregar un usuario a un grupo local que no existe.
- Se pretende conceder permisos (ACL) a un grupo local que no está creado.
- Se usa el nombre de un grupo integrado (Built-in) en un idioma que no coincide con el del sistema.
- El MSI debería crear el grupo, pero el orden de acciones no lo respeta (se intenta usar el grupo antes de crearlo), o la creación falla bajo el contexto de ejecución del script.
Por qué funciona manualmente y falla con GPO
La diferencia clave es el contexto de seguridad y el momento de ejecución:
- Un script de inicio de equipo se ejecuta como
LOCAL SYSTEM
y temprano en el arranque. El MSI y cualquier acción que manipule grupos/servicios ocurren en ese contexto. - Si ejecutas el
.cmd
manualmente (por ejemplo, como un administrador interactivo), el contexto puede resolver nombres de grupos de forma distinta, y el orden de dependencias (red, servicios, creación de grupos) suele estar ya estable. - Además, los nombres localizados de los grupos integrados (p. ej., “Administradores” vs. “Administrators”) pueden resolverse “de casualidad” en una sesión interactiva, pero no en el arranque.
Resumen ejecutivo de solución (pasos rápidos)
Objetivo | Acción | Comando/Ubicación |
---|---|---|
Identificar el grupo que falta | Revisar el log MSI y localizar la Custom Action o tabla que falla | /l*v C:\Windows\Temp\app-verbose.log |
Crear o corregir el grupo | Crear el grupo antes de la instalación (GPP o script) | net localgroup "AppName Users" /add |
Evitar nombres localizados | Usar SIDs o “BUILTIN\” donde aplique; validar nombres en el SO destino | wmic group get name,sid |
Derecho “Iniciar sesión como un servicio” | Conceder el derecho a la cuenta de servicio vía GPO | Equipo > Configuración de seguridad > Asignación de derechos |
Orden/red estables | Esperar a la red; copiar MSI a disco local antes de instalar | copy \\domain\netlogon\app.msi C:\Windows\Temp\ |
Método de despliegue | Valorar “Instalación de software” en GPO o Tarea programada como SYSTEM | Equipo > Configuración de software > Instalación de software |
Localizar el problema en el log MSI
- Habilita logging detallado. En tu script de inicio, invoca:
msiexec /i "C:\Windows\Temp\app.msi" /qn /l*v "C:\Windows\Temp\app-verbose.log"
Nota: en contexto de inicio (SYSTEM), la variable%TEMP%
apunta normalmente aC:\Windows\Temp
. - Busca en el log términos como
1376
,LocalGroup
,AddMembers
,group
,icacls
,net localgroup
,sc.exe
, o el nombre de tu aplicación. - Identifica el nombre exacto del grupo con el que falla y la acción que lo usa (Custom Action, ServiceInstall, permisos de carpeta, etc.).
Crear o corregir el grupo antes de instalar
Con GPP: Usuarios y grupos locales
- GPO > Preferencias > Configuración del equipo > Panel de control > Usuarios y grupos locales.
- Añade un Nuevo > Grupo local. Elige Crear y escribe exactamente el nombre que espera el MSI (por ejemplo,
AppName Users
). - Si procede, agrega como miembro la cuenta
DOMINIO\CuentaServicio
.
Con script (inicio de equipo)
:: Crear el grupo (si no existe)
net localgroup "AppName Users" /add
\:: Agregar la cuenta de servicio de dominio
net localgroup "AppName Users" "DOMINIO\CuentaServicio" /add
Si el grupo es integrado (p. ej., “Event Log Readers”, “Performance Log Users”), verifica la existencia y el nombre localizado antes de usarlo:
:: Enumerar grupos locales
net localgroup
\:: Comprobar existencia exacta
net localgroup "Event Log Readers"
\:: PowerShell (nombre y SID)
powershell -NoProfile -Command "Get-LocalGroup | Select-Object Name, SID" </code></pre>
<h2>Evitar problemas de nombres localizados</h2>
<p>En sistemas no ingleses, los grupos integrados tienen nombres localizados (p. ej., <em>Administradores</em>, <em>Usuarios</em>). Recomendaciones:</p>
<ul>
<li>Para permisos en archivos/carpeta, <strong>usa SIDs</strong> cuando sea posible (evita depender de nombres):
<pre><code>:: Conceder Control total a Administradores (SID bien conocido)
icacls "C:\Program Files\App" /grant *S-1-5-32-544:(F) /T</code></pre>
</li>
<li>Cuando necesites <strong>referirte a un grupo integrado</strong> y no puedes usar SID, <strong>descubre el nombre correcto en el equipo destino</strong>:
<pre><code>wmic group get name,sid
:: o
powershell -NoProfile -Command "(New-Object System.Security.Principal.NTAccount('BUILTIN','Event Log Readers')).Translate([System.Security.Principal.SecurityIdentifier]).Value"</code></pre>
</li>
<li>Evita “codificar” nombres en inglés si despliegas a SO en otros idiomas.</li>
</ul>
<h2>Conceder “Iniciar sesión como un servicio” (SeServiceLogonRight)</h2>
<p>Aunque el síntoma visible sea 1376 (grupo), los <strong>fallos al iniciar el servicio</strong> pueden causar <em>rollback</em>. Asegúrate de que la cuenta <code>DOMINIO\CuentaServicio</code> tiene el derecho <strong>Iniciar sesión como un servicio</strong> vía GPO:</p>
<ol>
<li>GPO > <em>Configuración del equipo</em> > <em>Configuración de Windows</em> > <em>Configuración de seguridad</em> > <em>Directivas locales</em> > <em>Asignación de derechos de usuario</em>.</li>
<li>Edita <strong>Iniciar sesión como un servicio</strong> y agrega la cuenta.</li>
<li>Aplica la GPO a los equipos de destino.</li>
</ol>
<p><strong>Consejo:</strong> si el MSI configura el servicio durante la instalación, tener este derecho antes de la fase de <em>start service</em> evita reversión.</p>
<h2>Orden, red y contexto en el arranque</h2>
<ul>
<li><strong>Esperar a la red</strong> en el inicio:
<ul>
<li>GPO: <em>Equipo > Plantillas administrativas > Sistema > Inicio de sesión</em> > <strong>Esperar siempre a la red en el inicio y el inicio de sesión del equipo</strong> = <em>Habilitado</em>.</li>
</ul>
</li>
<li><strong>Copia local</strong> antes de instalar (reduces riesgos de red):
<pre><code>copy "\\domain\netlogon\app.msi" "C:\Windows\Temp\app.msi" /Y
msiexec /i "C:\Windows\Temp\app.msi" /qn /l*v "C:\Windows\Temp\app.log"
Cuida el quoting de rutas y parámetros con espacios. Usa comillas dobles de apertura/cierre en cada argumento.
Métodos de despliegue recomendados
- Instalación de software (GPO) para MSI: Equipo > Directivas > Configuración de software > Instalación de software. Gestiona mejor orden, reintentos y contexto que un script simple.
- Tarea programada que ejecute como
SYSTEM
(una vez, al arrancar) si necesitas lógica de prechequeo:schtasks /Create /TN "Instalar-App" /RU "SYSTEM" /SC ONSTART /TR "C:\Windows\Temp\instalar-app.cmd" /RL HIGHEST /F
- Si dispones de herramientas como Intune/ConfigMgr, aprovecha detección de estado, dependencias y reintentos.
Prueba como SYSTEM (recrea el contexto de GPO)
Para reproducir exactamente el contexto de un script de inicio, ejecuta tu instalador como SYSTEM. Si no quieres usar herramientas externas, crea una tarea programada manual temporal que invoque el .cmd
. Comprueba que bajo SYSTEM no aparece el 1376.
Diagnóstico profundo: ¿qué parte del MSI toca grupos?
Las referencias a grupos locales pueden venir de:
- Custom Actions (scripts/ejecutables embebidos) que ejecutan
net localgroup
,icacls
,sc.exe
, etc. - Tablas MSI como ServiceInstall/ServiceControl (arranque del servicio) y acciones que dependen de permisos previos.
- Custom Actions que crean el grupo pero, por orden, otra acción intenta usarlo antes de que exista.
Si el MSI debería crear el grupo, y detectas que lo usa antes de crearlo, existen dos caminos:
- Solución operativa: crear el grupo por GPO o script antes.
- Solución de empaquetado: ajustar el orden de Custom Actions (por ejemplo, con un transform MST) para garantizar que la creación ocurra en
InstallExecuteSequence
antes del uso. Esto requiere conocimientos de empaquetado MSI.
Seguridad: credenciales y cuentas de servicio
- Evita contraseñas en texto claro en
.cmd
. Como alternativa:- Usa cuentas de servicio administradas (gMSA) cuando la aplicación lo permita.
- Configura el inicio del servicio después de instalar, leyendo credenciales de un secreto seguro (si tu pipeline lo soporta).
- Si debes pasar usuario/contraseña al MSI, minimiza su exposición (permisos del share, NTFS, rotación de credenciales, etc.).
Checklist de verificación
- ¿Cuál es el nombre exacto del grupo que provoca el 1376?
- ¿Ese grupo existe en el equipo (con su nombre localizado)?
- Si es un grupo de la app, ¿está creado previamente por GPP o script?
- ¿La cuenta de servicio tiene “Iniciar sesión como un servicio” antes de iniciar el servicio?
- ¿El script espera a la red y copia local el MSI?
- ¿El logging está habilitado (
/l*v
) y revisado? - ¿Has probado el instalador como SYSTEM para replicar el contexto de GPO?
Matriz de síntomas → causas → acciones
Síntoma | Causa probable | Acción recomendada |
---|---|---|
MSI hace rollback tras intentar iniciar servicio | Falta de grupo/localización errónea o falta de “Iniciar sesión como un servicio” | Crear/corregir grupo; conceder derecho; reintentar |
Error 1376 en log MSI | Referencia a grupo que no existe | Identificar grupo en log; crear/verificar nombre exacto |
Funciona manualmente, falla por GPO | Diferencia de contexto (SYSTEM vs usuario), orden, red | Probar como SYSTEM; asegurar red; copiar MSI local |
Permisos de carpeta no aplican | Nombre localizado no resuelve | Usar SIDs en icacls o descubrir nombre correcto |
Servicio no arranca aun con grupo correcto | Falta derecho de servicio o credenciales inválidas | Asignar “Iniciar sesión como un servicio”; validar credenciales |
Script de instalación robusto (plantilla)
Ejemplo de .cmd
para desplegar por GPO (inicio de equipo):
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set MSI\_NAME=app.msi
set MSI\SRC=\domain\netlogon%MSI\NAME%
set MSI\DST=C:\Windows\Temp%MSI\NAME%
set LOG=C:\Windows\Temp\app-install-%DATE:~-4%%DATE:~3,2%%DATE:~0,2%-%TIME:~0,2%%TIME:~3,2%.log
\:: 1) Red estable y copia local
copy "%MSI\SRC%" "%MSI\DST%" /Y
if errorlevel 1 (
echo \[ERROR] No se pudo copiar el MSI desde %MSI\_SRC% >> "%LOG%"
exit /b 1
)
\:: 2) Pre-req: crear grupo local de la app (si aplica)
net localgroup "AppName Users" >nul 2>&1 || net localgroup "AppName Users" /add
\:: 3) (Opcional) Agregar cuenta de servicio al grupo
net localgroup "AppName Users" "DOMINIO\CuentaServicio" /add
\:: 4) Instalar en modo silencioso con logging detallado
msiexec /i "%MSI\_DST%" /qn /l\*v "%LOG%"
set MSIERR=%ERRORLEVEL%
if not "%MSIERR%"=="0" (
echo \[ERROR] msiexec retorno %MSIERR% >> "%LOG%"
exit /b %MSIERR%
)
echo \[OK] Instalación completada >> "%LOG%"
exit /b 0
Habilitar logging de Windows Installer por directiva
Si necesitas trazas permanentes, habilita la directiva de Logging de Windows Installer con el valor voicewarmupx
para capturar logs detallados durante instalaciones MSI silenciosas.
Comprobaciones y herramientas de sistema
:: Listar todos los grupos locales
net localgroup
\:: Verificar si un grupo existe
net localgroup "Event Log Readers"
\:: PowerShell: listar grupos con SID
powershell -NoProfile -Command "Get-LocalGroup | Select-Object Name, SID"
\:: Mostrar GPO aplicadas y resultados
gpresult /h C:\gpo.html
\:: Forzar actualización de directivas
gpupdate /force
\:: Visor de eventos relevantes
eventvwr.msc
\:: - Application > Origen: MsiInstaller
\:: - Applications and Services Logs > Microsoft > Windows > GroupPolicy > Operational
Buenas prácticas adicionales
- No dependas de traducciones. Si el MSI necesita “Administrators”, usa SID en ACLs o resuelve el nombre en tiempo de ejecución.
- Comprueba la edición del sistema (Home/Pro/Enterprise/Server) porque algunos grupos integrados cambian por SKU.
- Valida el idioma del SO objetivo antes de decidir los nombres de grupos integrados en scripts.
- No mezcles responsabilidades en el MSI: separar “crear grupo” y “usar grupo” reduce condiciones de carrera.
- Evita ejecutar desde recursos de red en la fase crítica: realiza primero la copia local.
Preguntas frecuentes (FAQ)
¿Puedo desactivar el rollback para “forzar” que se quede instalado?
No es recomendable. El rollback protege la coherencia del sistema; céntrate en corregir la causa (grupo inexistente, derecho de servicio, orden).
¿Usar “BUILTIN\Administrators” evita el problema de localización?
Para muchas APIs y utilidades sí, pero no siempre. El método más robusto en permisos de archivos es el SID; para miembros de grupo, detecta el nombre correcto en el propio equipo.
¿Por qué en inglés el grupo existe y en otros idiomas no?
Porque el nombre está localizado. Siempre valida el nombre en el objetivo o utiliza SIDs cuando proceda.
¿Qué evento busco en el Visor para fallos MSI?
En Application, origen MsiInstaller (IDs típicos de instalación/fallo). Revisa también el log detallado generado con /l*v
.
Procedimiento completo recomendado (paso a paso)
- Habilita logging y reproduce el error con
/l*v
. Identifica el nombre exacto del grupo y la acción que lo usa. - Comprueba el grupo en destino con
net localgroup
oGet-LocalGroup
. Si no existe, créalo (GPP/script) con el nombre exacto. - Valida nombres localizados. Si dependes de grupos integrados, descubre el nombre correcto en cada SO (o usa SIDs para ACLs).
- Concede “Iniciar sesión como un servicio” a la cuenta de dominio si el MSI configura un servicio con dicha cuenta.
- Ajusta el script: espera a la red, copia local, cita rutas y habilita logging.
- Prueba como SYSTEM (tarea programada) para verificar que ya no hay 1376 ni rollback.
- Opcional: migra a Instalación de software (GPO) o a una plataforma de gestión que maneje dependencias y reintentos.
Resultado esperado
Una vez creado o referenciado el grupo local correcto (con el nombre adecuado al idioma del sistema), y otorgado el derecho “Iniciar sesión como un servicio” a la cuenta correspondiente, la instalación MSI no volverá a disparar el error 1376, el servicio podrá iniciarse y no habrá rollback. El paquete quedará instalado de forma estable.
Apéndice: ejemplos de comandos útiles
:: Listar todos los grupos locales
net localgroup
\:: Ver si un grupo existe
net localgroup "Event Log Readers"
\:: PowerShell: listar grupos
powershell -NoProfile -Command "Get-LocalGroup | Select-Object Name"
\:: Ver SID de un grupo
powershell -NoProfile -Command "(New-Object System.Security.Principal.NTAccount('BUILTIN','Administrators')).Translate(\[System.Security.Principal.SecurityIdentifier]).Value"
\:: Conceder permiso a Administradores por SID
icacls "C:\Program Files\App" /grant \*S-1-5-32-544:(F) /T
\:: Ver resultado de GPO en HTML
gpresult /h C:\gpo.html
\:: Registrar MSI en modo muy detallado
msiexec /i "C:\Windows\Temp\app.msi" /qn /l\*v "C:\Windows\Temp\app-verbose.log"
Conclusión: el 1376 es un error claro pero traicionero: el grupo no existe en ese momento y contexto. Con logging, creación previa del grupo, cuidado con nombres localizados, derecho de servicio y un proceso de despliegue robusto (GPO o tarea SYSTEM), el problema se resuelve de forma consistente y segura.