229 lines
12 KiB
Markdown
229 lines
12 KiB
Markdown
# Enrolamiento obligatorio de clientes SGU
|
|
|
|
Para Windows 10 y Windows 11 se usa un solo paquete:
|
|
|
|
- `sgu-windows-client-bootstrap-VERSION.zip` (x64, Pro, Enterprise o Education).
|
|
|
|
Extraer el ZIP y hacer doble clic en `Start-SguClientEnrollment.cmd`. Aceptar
|
|
UAC, introducir la IP del controlador y la cuenta del dominio con su contraseña.
|
|
También se puede indicar el servidor desde consola:
|
|
|
|
```bat
|
|
Start-SguClientEnrollment.cmd 192.168.50.10
|
|
```
|
|
|
|
Este comando realiza el intercambio de certificados descrito abajo sin mover
|
|
una clave privada y luego ejecuta la transacción proveedor-primero. Las
|
|
instrucciones completas están en
|
|
[`bootstrap-recovery.md`](bootstrap-recovery.md).
|
|
|
|
El único dato de red necesario es la IPv4 del controlador. El bootstrap prueba
|
|
WinRM desde las direcciones de las interfaces conectadas, incluyendo túneles
|
|
VPN, empezando por la ruta elegida por Windows. Si ésta falla, prueba las demás
|
|
rutas disponibles. Cliente y servidor pueden estar en subredes distintas.
|
|
Si la red todavía está inicializando, reintenta el descubrimiento durante
|
|
20 segundos antes de informar el último diagnóstico.
|
|
Conserva DHCP, direcciones y puertas de enlace. Sólo si Windows elige otra
|
|
interfaz agrega una ruta persistente `/32` hacia ese servidor por la interfaz
|
|
comprobada; no modifica la ruta de Internet. Ante cualquier error conserva la
|
|
ventana y escribe el diagnóstico en
|
|
`C:\ProgramData\SGU\Bootstrap\Client\latest-error.log`.
|
|
|
|
El dominio DNS, NetBIOS y contenedor de equipos se descubren en la sesión
|
|
autenticada. Usa `OU=Laboratorio` si existe en la raíz del dominio y, en caso
|
|
contrario, el contenedor de equipos configurado en AD. Los parámetros
|
|
`-DomainName`, `-DomainNetbios` y `-ComputerOuDn` permiten validarlos o elegirlos
|
|
explícitamente. Para otra cuenta, editar el usuario sugerido como
|
|
`DOMINIO\usuario` o `usuario@dominio`. No se guardan contraseñas.
|
|
|
|
El DNS se configura mediante una regla NRPT para el dominio descubierto,
|
|
conservando los servidores DNS de los adaptadores y la resolución de Internet.
|
|
Las políticas DNS/VPN corporativas deben permitir resolver ese dominio.
|
|
El servidor necesita el bootstrap SGU (AD/DNS, WinRM, Auth Broker y RustDesk):
|
|
este paquete no es un enrolador genérico de Microsoft Entra ID ni instala SGU
|
|
en un directorio ajeno automáticamente. Se comprueban TCP 53, 88, 135, 389, 445,
|
|
5985 y 8443; la unión también requiere DNS/Kerberos por UDP y RPC dinámico
|
|
según la configuración de AD. Estas pruebas no sustituyen la unión real.
|
|
|
|
Una VPN de cualquier proveedor ya conectada utiliza el mismo lanzador. Para
|
|
instalar la VPN Azure IKEv2 se incluyen `Start-SguAzureClientEnrollment.cmd` e
|
|
`Install-SguAzureP2sClient.ps1` en el mismo ZIP para ambos Windows; la primera
|
|
instalación requiere perfil y certificados. La conectividad antes del inicio
|
|
de sesión depende de la VPN y sus políticas, no se puede deducir de la IP del DC.
|
|
|
|
Una interfaz con sólo APIPA (`169.254.x.x`), sin DHCP o sin ruta necesita que
|
|
el administrador configure la red o conecte la VPN. El bootstrap no inventa una
|
|
IP libre ni una puerta de enlace. Para una LAN estática se mantienen los
|
|
parámetros avanzados `-ClientIPv4Address`, `-ClientPrefixLength` y
|
|
`-NetworkInterfaceAlias`; la IP y la interfaz deben indicarse juntas.
|
|
|
|
El manifiesto usa `CompatibilityProfile: Auto`. No hay restricciones de VPN
|
|
por Windows 10/11; los nombres antiguos de perfil se aceptan como parámetros
|
|
obsoletos. Se valida x64, edición con unión a AD y Windows 10 desde 1607 o
|
|
Windows 11 (el runtime incluido es .NET 10; usar una edición/build compatible
|
|
con su ciclo de soporte). Credential Provider, mTLS, cuenta `alumno`, RustDesk,
|
|
monitorización y autorreparación conservan la misma implementación.
|
|
|
|
El flujo administrado instala y valida el Credential Provider **antes** de
|
|
ejecutar `Add-Computer`. La pertenencia al dominio es el último cambio; si falta
|
|
el runtime, un certificado, el registro COM, la directiva predeterminada o la
|
|
salud mTLS del broker, el script rechaza la unión.
|
|
|
|
Una cuenta administrativa todavía puede modificar Windows fuera de este flujo.
|
|
Por eso el enrolamiento también instala la tarea
|
|
`SGU-CredentialProvider-EnrollmentGuard`, ejecutada como `SYSTEM` al iniciar y
|
|
diariamente. La tarea conserva un paquete local protegido, repara el registro o
|
|
los binarios y vuelve a habilitar RDP/WinRM en equipos unidos al dominio. No
|
|
guarda contraseñas.
|
|
|
|
## 1. Preparar el nuevo Windows Enterprise
|
|
|
|
En la VM nueva, antes de unirla al dominio:
|
|
|
|
1. copiar `artifacts\credential-provider` y todos los scripts de `scripts`;
|
|
2. copiar el instalador offline más reciente de .NET 10 x64;
|
|
3. crear el certificado cliente no exportable:
|
|
|
|
```powershell
|
|
powershell.exe -NoProfile -ExecutionPolicy Bypass `
|
|
-File .\New-LabCertificate.ps1 `
|
|
-Role CredentialProviderClient
|
|
```
|
|
|
|
Copiar únicamente el `.cer` público al broker y registrarlo:
|
|
|
|
```powershell
|
|
powershell.exe -NoProfile -ExecutionPolicy Bypass `
|
|
-File .\Register-SguClientCertificate.ps1 `
|
|
-CertificatePath C:\SGUDeploy\new-client.cer
|
|
```
|
|
|
|
Exportar únicamente el certificado público actual del broker e importarlo en
|
|
el cliente con `Import-LabPeerCertificate.ps1`. Nunca copiar claves privadas.
|
|
|
|
## 2. Instalar, comprobar y unir en una sola operación
|
|
|
|
Ejecutar como administrador local dentro de la VM nueva. La credencial del
|
|
dominio se solicita de forma segura si no se proporciona como objeto
|
|
`PSCredential`:
|
|
|
|
```powershell
|
|
powershell.exe -NoProfile -ExecutionPolicy Bypass `
|
|
-File .\Enroll-SguDomainClient.ps1 `
|
|
-PublishPath C:\SGUDeploy\credential-provider `
|
|
-BrokerEndpoint https://sgu-auth.lci.lasalle.mx:8443/v1/authenticate `
|
|
-ClientCertificateThumbprint CLIENT_CERT_THUMBPRINT `
|
|
-ServerCertificateThumbprint SERVER_CERT_THUMBPRINT `
|
|
-DotNetRuntimeInstallerPath C:\SGUDeploy\dotnet-runtime-10-win-x64.exe `
|
|
-ComputerOuDn 'OU=Laboratorio,DC=lci,DC=lasalle,DC=mx' `
|
|
-NewComputerName LAB-W11-001
|
|
```
|
|
|
|
Orden de la transacción:
|
|
|
|
1. instala .NET y los binarios versionados;
|
|
2. registra COM, configura SGU como proveedor predeterminado y oculta el
|
|
último usuario que cerró sesión;
|
|
3. crea o actualiza la cuenta local estándar `alumno` con la contraseña
|
|
inicial `ingenieria` sólo al crearla; si ya existe conserva su contraseña,
|
|
la habilita y garantiza que no pertenezca a Administradores;
|
|
4. instala el guard de autorreparación;
|
|
5. exige health mTLS del broker y ejecuta las comprobaciones locales;
|
|
6. configura DNS del dominio;
|
|
7. sólo entonces ejecuta `Add-Computer` en `OU=Laboratorio` y reinicia;
|
|
8. al arrancar, el guard habilita RDP, NLA y WinRM y comprueba el estado final.
|
|
|
|
La directiva de Windows **Assign a default credential provider** selecciona SGU
|
|
por defecto. El instalador también habilita **Interactive logon: Don't display
|
|
last signed-in** y deshabilita **Enumerate local users on domain-joined
|
|
computers**. De este modo un usuario SGU desaparece después de cerrar sesión y
|
|
permanece el mosaico genérico **Other user**. No se instala ningún filtro: el
|
|
proveedor de contraseña de Microsoft permanece disponible para cuentas creadas
|
|
manualmente y recuperación.
|
|
|
|
La GPO existente **Deploy VSCodium** debe estar vinculada una vez a
|
|
`OU=Laboratorio` (configuración de equipo) y a `OU=Usuarios-SGU` (configuración
|
|
de usuario: fondo institucional). El parámetro `ComputerOuDn` coloca los
|
|
equipos nuevos directamente en `Laboratorio`; VSCodium se instala en el
|
|
siguiente arranque síncrono y el fondo se aplica al siguiente inicio de sesión
|
|
del usuario SGU.
|
|
|
|
En el controlador de dominio, aplicar una vez la directiva de usuario al árbol
|
|
completo `Usuarios-SGU` y la directiva de equipo a `Laboratorio`:
|
|
|
|
```powershell
|
|
.\Set-SguDomainUserPolicies.ps1
|
|
.\Set-SguDomainComputerPolicies.ps1
|
|
```
|
|
|
|
El script crea y vincula de forma idempotente el GPO
|
|
`SGU - User session restrictions` y configura `DisableLockWorkstation=1` para
|
|
Administrativos, Alumnos y Docentes; también deshabilita el protector de
|
|
pantalla. El segundo crea `SGU - Windows client experience` y, antes del primer
|
|
inicio de sesión de dominio, suprime la experiencia de privacidad, las
|
|
notificaciones y controles de telemetría, la animación **Hi / Preparing
|
|
Windows**, y el acceso a ubicación. Además fija en **Nunca** el apagado de
|
|
pantalla, suspensión, hibernación y suspensión híbrida, conectado a corriente o
|
|
batería. El guard de enrolamiento vuelve a aplicar `powercfg /hibernate off` y
|
|
los tiempos en cero al inicio y diariamente.
|
|
|
|
Esa GPO también ejecuta el generador local del fondo de bienvenida y aplica el
|
|
fondo azul base a la pantalla de bloqueo. El fondo individual se crea al abrir la
|
|
sesión con el nombre del usuario y `location`/OU del equipo; véase
|
|
[welcome-wallpaper.md](welcome-wallpaper.md).
|
|
|
|
`HideEULAPage` no forma parte de esta GPO: es una opción de archivo Unattend para
|
|
la fase OOBE y Microsoft la reserva para pruebas de OEM/System Builder. La GPO
|
|
usa las alternativas soportadas `DisablePrivacyExperience=1` y
|
|
`EnableFirstLogonAnimation=0`, que son las que afectan a cada cuenta de dominio
|
|
nueva.
|
|
|
|
## 3. Verificación y reparación
|
|
|
|
```powershell
|
|
.\Test-SguClientEnrollment.ps1 `
|
|
-RequireDomainJoined `
|
|
-RequireRemoteAccess `
|
|
-RequireBrokerHealth `
|
|
-Enforce
|
|
|
|
Get-ScheduledTask -TaskName SGU-CredentialProvider-EnrollmentGuard
|
|
Start-ScheduledTask -TaskName SGU-CredentialProvider-EnrollmentGuard
|
|
```
|
|
|
|
Un resultado válido exige simultáneamente binario y registro COM, configuración,
|
|
certificados, .NET 10, proveedor SGU predeterminado, último usuario oculto,
|
|
enumeración local deshabilitada, cuenta local estándar `alumno` habilitada y
|
|
fuera del grupo Administradores, y proveedor de contraseña de Microsoft
|
|
preservado. El guard recrea o corrige esa cuenta de forma idempotente. El script de reparación se encuentra en
|
|
`C:\ProgramData\SGU\Enrollment` con ACL exclusiva para `SYSTEM` y
|
|
administradores.
|
|
|
|
## 4. Experiencia de LogonUI
|
|
|
|
El proveedor usa un mosaico genérico dedicado, no una credencial asociada al SID
|
|
anónimo de **Other user**. Windows muestra la imagen institucional y la etiqueta
|
|
`La Salle · Acceso SGU`; el encabezado `Acceso institucional SGU`
|
|
se publica como `CPFT_LARGE_TEXT` solamente en el mosaico seleccionado. LogonUI
|
|
elige la familia, el peso y el tamaño final y no expone opciones de tipografía a
|
|
un Credential Provider.
|
|
|
|
La configuración soportada garantiza que SGU queda seleccionado por defecto y
|
|
que no se conserva el último usuario. El orden vertical exacto de mosaicos lo
|
|
decide LogonUI y no tiene una directiva pública. Por seguridad no se filtra ni
|
|
se elimina **Other user**: Microsoft recomienda conservar al menos un proveedor
|
|
del sistema como ruta de recuperación.
|
|
|
|
Referencias de Microsoft:
|
|
|
|
- <https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-csp-admx-credentialproviders#defaultcredentialprovider>
|
|
- <https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-csp-windowslogon#enumeratelocalusersondomainjoinedcomputers>
|
|
- <https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-csp-admx-ctrlaltdel#disablelockcomputer>
|
|
- <https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-csp-privacy#disableprivacyexperience>
|
|
- <https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-csp-windowslogon#enablefirstlogonanimation>
|
|
- <https://learn.microsoft.com/en-us/windows/privacy/manage-connections-from-windows-operating-system-components-to-microsoft-services#182-location>
|
|
- <https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/powercfg-command-line-options>
|
|
- <https://learn.microsoft.com/en-us/windows-hardware/customize/desktop/automate-oobe>
|
|
- <https://learn.microsoft.com/en-us/windows/win32/api/credentialprovider/ne-credentialprovider-credential_provider_field_type>
|
|
- <https://learn.microsoft.com/en-us/windows/win32/api/credentialprovider/nf-credentialprovider-icredentialprovidercredential2-getusersid>
|