Unify Windows client bootstrap and discover network paths
This commit is contained in:
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user