Unify Windows client bootstrap and discover network paths

This commit is contained in:
2026-09-10 08:13:46 -06:00
parent 74235ec6f8
commit 7f8a9eed4e
14 changed files with 634 additions and 219 deletions
+3 -3
View File
@@ -120,9 +120,9 @@ En la estación administrativa, emita una credencial distinta por equipo:
$w11 = .\scripts\New-SguAzureP2sCertificates.ps1 -ClientName 'Windows11'
```
Copie a la VM Windows 11 de Hyper-V:
Copie a la VM Windows 10/11 de Hyper-V:
- `sgu-windows11-client-bootstrap-VERSION.zip` extraído;
- `sgu-windows-client-bootstrap-VERSION.zip` extraído (Windows 10/11 x64);
- `$vpn.PackagePath`;
- `$w11.ClientCertificatePath`;
- `sgu-azure-p2s-root.cer`.
@@ -148,7 +148,7 @@ Si la red local bloquea IKEv2 (UDP 500/4500), el paquete de Azure también
incluye un perfil SSTP sobre TCP 443, pero ese fallback todavía requiere
instalación manual con el instalador oficial incluido en `WindowsAmd64`.
Windows 11 Pro admite unión a AD y VPN nativa, pero Microsoft no licencia el
Windows 10/11 Pro admite unión a AD y VPN nativa, pero Microsoft no licencia el
**Always On VPN device tunnel** para Pro. Por ello el perfil se instala para
todos los usuarios y se puede seleccionar desde el control de red de la
pantalla de inicio de sesión; antes del primer logon de una cuenta de dominio,
+16 -20
View File
@@ -96,42 +96,38 @@ Se admiten Pro, Enterprise y Education. Windows Home no puede unirse a Active
Directory local ni actuar como host RDP; el bootstrap lo detecta antes de cambiar
el equipo y explica que se debe actualizar la edición.
1. Descargar y extraer el paquete correspondiente:
`sgu-windows10-legacy-client-bootstrap-VERSION.zip` o
`sgu-windows11-client-bootstrap-VERSION.zip`.
1. Descargar y extraer `sgu-windows-client-bootstrap-VERSION.zip`, común para
Windows 10 y Windows 11 x64 Pro, Enterprise o Education.
2. Ejecutar con la IP fija actual del controlador de dominio:
```bat
Start-SguClientEnrollment.cmd 192.168.50.10 192.168.50.11
Start-SguClientEnrollment.cmd 192.168.50.10
```
El primer argumento es el controlador de dominio y el segundo es una dirección
IPv4 fija, libre y exclusiva del cliente en la red privada. Si se omite la IP
del cliente, el bootstrap la solicita cuando el adaptador sólo tiene APIPA
(`169.254.x.x`). En una VM con Internet por `Default Switch` y otra NIC para
`Laboratorio AD`, el bootstrap elige la NIC sin puerta de enlace y no cambia la
ruta predeterminada. Si falla, la ventana elevada permanece abierta y el mismo
error queda en `C:\ProgramData\SGU\Bootstrap\Client\latest-error.log`.
También puede hacerse doble clic y escribir la IP del controlador. El cliente
conserva sus IP/DHCP y prueba WinRM por las interfaces con rutas disponibles,
incluyendo VPN y redes enrutadas. No requiere compartir subred con el servidor.
Si una NIC sólo tiene APIPA, necesita DHCP o una IP asignada por el administrador;
el bootstrap no inventa direcciones. Si falla, la ventana permanece abierta y
el error queda en `C:\ProgramData\SGU\Bootstrap\Client\latest-error.log`.
Cada manifiesto fija su perfil y evita cruzar paquetes: Windows 10 utiliza
`Windows10Legacy` (build menor a 22000) y Windows 11 `Windows11Modern` (build
22000 o posterior). El ZIP moderno conserva tanto el enrolamiento directo como
Azure P2S/pre-logon; el ZIP legado contiene el flujo directo. El código común y
las garantías de seguridad son idénticos.
El manifiesto usa `Auto` y ambos Windows ejecutan el mismo código. Azure P2S está
incluido para ambos; otras VPN ya conectadas usan el lanzador habitual.
Después de UAC, se solicita interactivamente la credencial autorizada para unir
equipos. La contraseña existe sólo en memoria. El bootstrap:
1. apunta el DNS del adaptador al IP proporcionado;
2. abre una sesión WinRM autenticada con el DC y verifica que pertenece al
dominio esperado;
1. selecciona una interfaz con conectividad comprobada al servidor;
2. abre una sesión WinRM autenticada con el DC, descubre el dominio y configura
DNS mediante NRPT sólo para ese dominio, conservando el DNS de Internet;
3. crea en el cliente un certificado mTLS RSA-3072 no exportable y envía sólo su
parte pública al broker;
4. recupera por esa sesión autenticada el certificado público del broker;
5. instala el runtime .NET 10 offline y el Credential Provider;
6. valida binarios, registro COM, certificados y salud del broker;
7. instala el guardián de reparación al arranque;
8. sólo entonces ejecuta `Add-Computer` dentro de `OU=Laboratorio` y reinicia;
8. sólo entonces ejecuta `Add-Computer` en `OU=Laboratorio` si existe, o en el
contenedor de equipos predeterminado del dominio, y reinicia;
9. al arrancar, activa RDP/NLA, WinRM y las reglas Domain, y vuelve a validar el
enrolamiento.
10. instala RustDesk desde el MSI oficial comprobado, lo apunta al servidor
+52 -17
View File
@@ -1,14 +1,15 @@
# Enrolamiento obligatorio de clientes SGU
Para una instalación limpia se selecciona primero el ZIP correspondiente:
Para Windows 10 y Windows 11 se usa un solo paquete:
- `sgu-windows10-legacy-client-bootstrap-VERSION.zip` para Windows 10;
- `sgu-windows11-client-bootstrap-VERSION.zip` para Windows 11.
- `sgu-windows-client-bootstrap-VERSION.zip` (x64, Pro, Enterprise o Education).
Ambos conservan el punto de entrada directo:
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 192.168.50.11
Start-SguClientEnrollment.cmd 192.168.50.10
```
Este comando realiza el intercambio de certificados descrito abajo sin mover
@@ -16,19 +17,52 @@ una clave privada y luego ejecuta la transacción proveedor-primero. Las
instrucciones completas están en
[`bootstrap-recovery.md`](bootstrap-recovery.md).
El primer argumento es la IP fija del controlador; el segundo es una IP fija y
única para el cliente en la misma subred. Si el segundo se omite y la NIC
privada no tiene una IP válida, se solicita en pantalla. El bootstrap prefiere
la única NIC activa sin puerta de enlace para no reemplazar el adaptador de
Internet. Ante cualquier error conserva la ventana y escribe el diagnóstico en
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 manifiesto contiene el perfil `Windows10Legacy` o `Windows11Modern` y el
bootstrap rechaza un ZIP que no corresponda al build instalado. El paquete de
Windows 11 conserva además `Start-SguAzureClientEnrollment.cmd` y el instalador
P2S de equipo; el legado de Windows 10 se limita al transporte directo del
laboratorio. Credential Provider, mTLS, cuenta `alumno`, RustDesk, monitorización
y autorreparación siguen saliendo de la misma base de código.
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
@@ -91,7 +125,8 @@ Orden de la transacción:
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
`ingenieria`, la habilita y garantiza que no pertenezca a Administradores;
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;
+57
View File
@@ -0,0 +1,57 @@
# Validación del bootstrap Windows unificado
Fecha: 2026-09-10. Paquete: 0.5.1.
## Comprobaciones locales
- Publicación Release del Auth Broker y del Credential Provider completada.
- Pruebas Pester ejecutadas en Windows PowerShell 5.1: selección de rutas,
dos interfaces, VPN en otra subred, preferencia por la ruta de Windows,
restricción explícita de interfaz, APIPA, falta de ruta, prefijo más específico,
ruta de host y conflictos, DNS limitado al dominio, reintentos y compatibilidad.
- Prueba TCP real con socket ligado a una IP e interfaz y servicio cerrado.
- Reenrolamiento: se conserva la contraseña de `alumno` si la cuenta ya existe,
para no provocar rechazos de historial/complejidad tras aplicar las políticas
del dominio; se mantienen las verificaciones de permisos de usuario estándar.
- El empaquetador genera un solo ZIP Windows con los lanzadores habitual y Azure,
el instalador VPN, el runtime offline y el manifiesto SHA-256.
## Prueba real en Hyper-V
Servidor: VM `Windows Server`, dominio `lci.lasalle.mx`, DC `192.168.50.10`.
Cliente: VM `Windows11-002`, Windows 11 Enterprise LTSC, build 26100,
nombre de equipo `DESKTOP-LM7D7OM`, inicialmente en WORKGROUP.
Antes de la prueba se creó el checkpoint
`Before SGU unified enrollment 2026-09-10`. El cliente sólo tenía conexión al
`Default Switch`; se añadió la tarjeta `SGU AD Test` al switch `Laboratorio AD`
y se configuró administrativamente `192.168.50.202/24` sin puerta de enlace.
Esta preparación de la red del laboratorio es independiente del bootstrap:
el enrolador no asignó esa dirección y no recibió parámetros de IP del cliente,
interfaz, dominio, NetBIOS ni OU.
Se ejecutó el paquete con la IP del DC, una credencial en memoria y
`-SkipRestart` para inspeccionar el resultado; después se reinició el cliente.
Resultados comprobados:
- Selección automática de `Laboratorio AD` y descubrimiento autenticado de
`lci.lasalle.mx`, `LCI` y `OU=Laboratorio`.
- Proveedor y certificados instalados; salud mTLS verificada antes de la unión.
- Unión al dominio completada y `Test-ComputerSecureChannel` verdadero después
del reinicio.
- `Test-SguClientEnrollment.ps1` con exigencia de dominio, broker, acceso remoto
y RustDesk: `IsValid=True`, sin incidencias, después del guard de arranque.
- Interfaz privada `DomainAuthenticated`; interfaz de Internet `Public`, con
DHCP y su servidor DNS originales. Resolución pública y HTTPS comprobados
contra `www.microsoft.com` (HTTP 200).
## Alcance pendiente
Windows 10 se cubrió mediante pruebas de compatibilidad y código compartido,
pero no se ejecutó una instalación real en Windows 10 en esta sesión. La VPN
Azure y otras VPN requieren validación en sus redes reales; las pruebas locales
cubren rutas en otra subred, pero no un gateway Azure activo.
El servidor debe tener SGU preparado. La IP de un DC no permite crear una VPN,
adivinar una IP libre ni sustituir permisos, DHCP o políticas de firewall.