Aclaración:

No hospedamos ninguna aplicación o contenido en nuestros servidores y la ley NO prohíbe COMPARTIR links de terceros.

lunes, 28 de octubre de 2024

thumbnail

Código "print.bat" para habilitar la detección de equipos compartidos en la red.



Código "print.bat" para habilitar la detección de equipos compartidos en la red.


Te explico paso a paso qué hace cada función o elemento de este código, explicaré para qué sirve y qué hace, también explicaré cómo restaurar los valores originales en caso de haber usado ese código:


for %%i in (fdPhost FDResPub upnphost lmhosts iphlpsvc SSDPSRV) do (

sc config "%%i" start=auto > NUL 2>&1

net start "%%i" > NUL 2>&1

)

netsh advfirewall reset > NUL 2>&1

Powershell "Enable-WindowsOptionalFeature -Online -NoRestart -FeatureName SMB1Protocol"

Powershell "foreach ($Group in ('@FirewallAPI.dll,-28502','@FirewallAPI.dll,-32752')) {Set-NetFirewallRule -Group $Group -Profile Private, Public -Enabled True}"

Powershell "Get-NetConnectionProfile | Set-NetConnectionProfile -InterfaceAlias Ethernet* -NetworkCategory  %red%"

Powershell "Get-NetConnectionProfile | Set-NetConnectionProfile -InterfaceAlias Wi-Fi* -NetworkCategory  %red%"

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "EnablePlainTextPassword" /t REG_DWORD /d "0" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "EnableSecuritySignature" /t REG_DWORD /d "1" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d "0" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d "1" /f > NUL 2>&1

Reg.exe add "HKLM\Software\Microsoft\Windows\CurrentVersion\NcdAutoSetup\Private" /v "AutoSetup" /t REG_DWORD /d "0" /f > NUL 2>&1


Descarga el SCRIPT desde: https://www.mediafire.com/file_premium/13wsc8ssufnrxhg/prints.7z/file


=====================================


Ahora vamos a desglosar cada parte del código y explicar su propósito y funcionamiento:


1. Bucle for

for %%i in (fdPhost FDResPub upnphost lmhosts iphlpsvc SSDPSRV) do (

sc config "%%i" start=auto > NUL 2>&1

net start "%%i" > NUL 2>&1

)


Propósito: Configura y arranca automáticamente una lista de servicios.

Funcionamiento:

for %%i in (...) do: Itera sobre cada servicio en la lista.

sc config "%%i" start=auto: Configura el servicio para que inicie automáticamente.

net start "%%i": Inicia el servicio.

> NUL 2>&1: Redirige la salida y los errores a NUL para que no se muestren en la consola.


2. Restablecer la configuración del firewall

netsh advfirewall reset > NUL 2>&1

Propósito: Restablece la configuración del firewall a sus valores predeterminados.

Funcionamiento: netsh advfirewall reset restablece todas las reglas y configuraciones del firewall.


3. Habilitar SMB1

Powershell "Enable-WindowsOptionalFeature -Online -NoRestart -FeatureName SMB1Protocol"

Propósito: Habilita el protocolo SMB1.

Funcionamiento: Usa PowerShell para habilitar la característica opcional SMB1 sin reiniciar el sistema.


4. Habilitar reglas de firewall

Powershell "foreach ($Group in ('@FirewallAPI.dll,-28502','@FirewallAPI.dll,-32752')) {Set-NetFirewallRule -Group $Group -Profile Private, Public -Enabled True}"


Propósito: Habilita reglas específicas del firewall para perfiles privados y públicos.

Funcionamiento: Itera sobre los grupos de reglas y las habilita para los perfiles de red privado y público.


5. Configurar el perfil de red

Powershell "Get-NetConnectionProfile | Set-NetConnectionProfile -InterfaceAlias Ethernet* -NetworkCategory  %red%"

Powershell "Get-NetConnectionProfile | Set-NetConnectionProfile -InterfaceAlias Wi-Fi* -NetworkCategory  %red%"

Propósito: Cambia la categoría de red de las interfaces Ethernet y Wi-Fi.

Funcionamiento: Usa PowerShell para obtener los perfiles de conexión y establecer la categoría de red (por ejemplo, Private o Public).


6. Modificar el registro de Windows

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "EnablePlainTextPassword" /t REG_DWORD /d "0" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "EnableSecuritySignature" /t REG_DWORD /d "1" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d "0" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d "1" /f > NUL 2>&1

Reg.exe add "HKLM\Software\Microsoft\Windows\CurrentVersion\NcdAutoSetup\Private" /v "AutoSetup" /t REG_DWORD /d "0" /f > NUL 2>&1

Propósito: Configura varios parámetros de la red y la autenticación en el registro de Windows.

Funcionamiento:

EnablePlainTextPassword: Deshabilita las contraseñas en texto plano.

EnableSecuritySignature: Habilita la firma de seguridad.

RequireSecuritySignature: No requiere la firma de seguridad.

AllowInsecureGuestAuth: Permite la autenticación de invitados inseguros.

AutoSetup: Deshabilita la configuración automática de NcdAutoSetup.


Restaurar valores originales

Para restaurar los valores originales, deberías revertir cada cambio realizado. Aquí hay una guía general:


Servicios:

for %%i in (fdPhost FDResPub upnphost lmhosts iphlpsvc SSDPSRV) do (

    sc config "%%i" start=demand > NUL 2>&1

    net stop "%%i" > NUL 2>&1

)


Firewall:

netsh advfirewall reset > NUL 2>&1


SMB1:

Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol


Reglas de firewall:

Powershell "foreach ($Group in ('@FirewallAPI.dll,-28502','@FirewallAPI.dll,-32752')) {Set-NetFirewallRule -Group $Group -Profile Private, Public -Enabled False}"


Perfil de red:

Powershell "Get-NetConnectionProfile | Set-NetConnectionProfile -InterfaceAlias Ethernet* -NetworkCategory Public"

Powershell "Get-NetConnectionProfile | Set-NetConnectionProfile -InterfaceAlias Wi-Fi* -NetworkCategory Public"


Registro de Windows:

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "EnablePlainTextPassword" /t REG_DWORD /d "1" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "EnableSecuritySignature" /t REG_DWORD /d "0" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d "1" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d "0" /f > NUL 2>&1

Reg.exe add "HKLM\Software\Microsoft\Windows\CurrentVersion\NcdAutoSetup\Private" /v "AutoSetup" /t REG_DWORD /d "1" /f > NUL 2>&1


El código que has compartido realiza varias configuraciones en el sistema relacionadas con servicios de red, firewall, y ajustes del registro de Windows.

Aquí hay algunas consideraciones sobre su uso:


Posibles Riesgos y Efectos

Servicios de Red:

Riesgo: Cambiar el estado de inicio de los servicios a automático y arrancarlos puede afectar el rendimiento del sistema si no son necesarios.

Efecto: Puede mejorar la conectividad de red si estos servicios son esenciales para tu entorno.

Restablecer el Firewall:

Riesgo: Restablecer el firewall puede eliminar reglas personalizadas, lo que podría exponer el sistema a riesgos de seguridad.

Efecto: Puede solucionar problemas de conectividad relacionados con configuraciones de firewall incorrectas.

Habilitar SMB1:

Riesgo: SMB1 es un protocolo antiguo y tiene vulnerabilidades conocidas. Habilitarlo puede aumentar el riesgo de ataques.

Efecto: Puede ser necesario para compatibilidad con dispositivos o sistemas antiguos.

Reglas de Firewall:

Riesgo: Habilitar reglas de firewall sin una comprensión clara de su propósito puede abrir puertos innecesarios.

Efecto: Puede mejorar la funcionalidad de aplicaciones que dependen de estas reglas.

Cambiar Categoría de Red:

Riesgo: Cambiar la categoría de red a Private o Public puede afectar la visibilidad y accesibilidad de tu dispositivo en la red.

Efecto: Ajustar la categoría de red puede mejorar la seguridad o la funcionalidad según el entorno.

Modificar el Registro:

Riesgo: Cambiar valores en el registro puede tener efectos no deseados si no se hace correctamente.

Efecto: Las modificaciones pueden mejorar la seguridad o la funcionalidad de la red.

Recomendaciones

Realiza una copia de seguridad: Antes de ejecutar el código, haz una copia de seguridad de tu sistema y del registro.

Prueba en un entorno controlado: Si es posible, prueba el código en un entorno de prueba antes de aplicarlo en un sistema de producción.

Comprende cada cambio: Asegúrate de entender cada configuración y su impacto en tu sistema.

El código puede ser útil para configurar la red, pero también puede tener riesgos si no se usa con cuidado al modificar valore importantes o críticos. Es importante evaluar cada cambio y su necesidad en tu entorno específico. Si tienes dudas, consultar con un profesional de TI puede ser una buena idea ya que pueden adaptarlo o mejorarlo según sus necesidades, pero hazlo con alguien que realmente sepa del tema ya que algunos podrían configurarlo mal al entender incorrectamente las instrucciones.


Mejorando el Código:

Para mejorar el código y asegurar que no se expongan puertos innecesarios ni se comprometa la seguridad del sistema, podemos hacer algunos ajustes. Aquí tienes una versión mejorada del código, seguida de una explicación de las diferencias:


Código Mejorado

@echo off

REM Configurar y arrancar servicios necesarios

for %%i in (fdPhost FDResPub upnphost lmhosts iphlpsvc SSDPSRV) do (

    sc config "%%i" start=auto > NUL 2>&1

    net start "%%i" > NUL 2>&1

)


REM Restablecer configuración del firewall a valores seguros

netsh advfirewall reset > NUL 2>&1


REM Habilitar SMB1 solo si es absolutamente necesario

Powershell "Enable-WindowsOptionalFeature -Online -NoRestart -FeatureName SMB1Protocol -LimitAccess"


REM Habilitar reglas de firewall específicas para detección de red

Powershell "Set-NetFirewallRule -DisplayGroup 'File and Printer Sharing' -Profile Private,Public -Enabled True"

Powershell "Set-NetFirewallRule -DisplayGroup 'Network Discovery' -Profile Private,Public -Enabled True"


REM Configurar perfil de red a privado para mayor seguridad

Powershell "Get-NetConnectionProfile | Set-NetConnectionProfile -InterfaceAlias Ethernet* -NetworkCategory Private"

Powershell "Get-NetConnectionProfile | Set-NetConnectionProfile -InterfaceAlias Wi-Fi* -NetworkCategory Private"


REM Modificar el registro para mejorar la seguridad de la red

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "EnablePlainTextPassword" /t REG_DWORD /d "0" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "EnableSecuritySignature" /t REG_DWORD /d "1" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d "1" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d "0" /f > NUL 2>&1

Reg.exe add "HKLM\Software\Microsoft\Windows\CurrentVersion\NcdAutoSetup\Private" /v "AutoSetup" /t REG_DWORD /d "0" /f > NUL 2>&1


Descarga el SCRIPT desde: https://www.mediafire.com/file_premium/n70tctnatou4kj1/prints_mejorado.7z/file


Diferencias y Mejoras del código en relación al primero.

Servicios de Red:

Original: Configura y arranca servicios sin cambios.

Mejorado: Sin cambios en esta sección, ya que los servicios son necesarios para la detección de red.

Restablecer el Firewall:

Original: Restablece todas las configuraciones del firewall.

Mejorado: Mantiene el restablecimiento, pero se asegura de que las configuraciones sean seguras.

Habilitar SMB1:

Original: Habilita SMB1 sin restricciones.

Mejorado: Habilita SMB1 con la opción -LimitAccess para minimizar la exposición.

Reglas de Firewall:

Original: Habilita reglas de firewall sin especificar.

Mejorado: Habilita solo las reglas necesarias para la detección de red (File and Printer Sharing y Network Discovery).

Perfil de Red:

Original: Cambia la categoría de red según una variable (%red%).

Mejorado: Establece explícitamente la categoría de red a Private para mayor seguridad.

Registro de Windows:

Original: Permite la autenticación de invitados inseguros y otras configuraciones.

Mejorado: Deshabilita la autenticación de invitados inseguros (AllowInsecureGuestAuth a 0) y asegura que la firma de seguridad sea requerida (RequireSecuritySignature a 1).

Estas mejoras aseguran que el sistema pueda detectar redes y equipos compartidos sin comprometer la seguridad, minimizando la exposición de puertos y configuraciones inseguras.


=====================================


RESTABECIENDO CONFIGURACIONES ORIGINALES.

Si usaste cualquiera de los scripts anteriores y deseas restablecer todas las configuraciones de Windows a de fábrica tal cuál Microsoft tiene su sistema operativo, te dejo estas instrucciones

Aquí tienes un código que restablece todas las configuraciones modificadas por tu código original, devolviendo el sistema a su estado predeterminado:


Código para Restablecer Configuraciones

@echo off

REM Detener y configurar servicios a inicio manual

for %%i in (fdPhost FDResPub upnphost lmhosts iphlpsvc SSDPSRV) do (

    net stop "%%i" > NUL 2>&1

    sc config "%%i" start=demand > NUL 2>&1

)


REM Restablecer configuración del firewall a valores predeterminados

netsh advfirewall reset > NUL 2>&1


REM Deshabilitar SMB1

Powershell "Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol"


REM Deshabilitar reglas de firewall específicas para detección de red

Powershell "Set-NetFirewallRule -DisplayGroup 'File and Printer Sharing' -Profile Private,Public -Enabled False"

Powershell "Set-NetFirewallRule -DisplayGroup 'Network Discovery' -Profile Private,Public -Enabled False"


REM Configurar perfil de red a público (valor predeterminado)

Powershell "Get-NetConnectionProfile | Set-NetConnectionProfile -InterfaceAlias Ethernet* -NetworkCategory Public"

Powershell "Get-NetConnectionProfile | Set-NetConnectionProfile -InterfaceAlias Wi-Fi* -NetworkCategory Public"


REM Restaurar valores del registro a predeterminados

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "EnablePlainTextPassword" /t REG_DWORD /d "1" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "EnableSecuritySignature" /t REG_DWORD /d "0" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d "1" /f > NUL 2>&1

Reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d "0" /f > NUL 2>&1

Reg.exe add "HKLM\Software\Microsoft\Windows\CurrentVersion\NcdAutoSetup\Private" /v "AutoSetup" /t REG_DWORD /d "1" /f > NUL 2>&1


Descarga el SCRIPT desde:

https://www.mediafire.com/file_premium/nuvb46wgkcuv87h/prints_restablecer_original_Microsoft.7z/file


=====================================


En este código al igual que en los anteriores se puede ver para qué sirve y que realiza cada sección, de esa manera tendrás la seguridad de qué estás modificando o restaurando.

Explicación de las Diferencias

Servicios de Red:

Original: Configura los servicios para que inicien automáticamente y los arranca.

Restauración: Detiene los servicios y los configura para que inicien manualmente (start=demand).

Restablecer el Firewall:

Original: Restablece todas las configuraciones del firewall.

Restauración: Mantiene el restablecimiento del firewall a sus valores predeterminados.

SMB1:

Original: Habilita SMB1.

Restauración: Deshabilita SMB1.

Reglas de Firewall:

Original: Habilita reglas específicas para la detección de red.

Restauración: Deshabilita esas reglas de firewall.

Perfil de Red:

Original: Cambia la categoría de red a un valor específico (%red%).

Restauración: Establece la categoría de red a Public, que es el valor predeterminado.

Registro de Windows:

Original: Modifica varios valores del registro para la configuración de red.

Restauración: Restaura los valores del registro a sus configuraciones predeterminadas.

Este código debería ayudarte a revertir todas las configuraciones realizadas por el código original.


_________________________________________

Tecno PC Sistemas Ecuador

Laboratorio Técnico

martes, 7 de mayo de 2024

thumbnail

Microsoft tira la toalla y no solucionará este grave error en Windows 10 y 11

Microsoft tira la toalla y no solucionará este grave error en Windows 10 y 11, así que, te enseño cómo resolverlo manualmente.  




Agregar un paquete de actualización a Windows RE

Puede aplicar una actualización, ya sea una LCU o una actualización dinámica (DU) de sistema operativo seguro a una imagen de Windows RE. Los pasos para actualizar una imagen de Windows RE son diferentes en función de si está actualizando una imagen sin conexión o una imagen en un sistema en ejecución.

  • Al agregar una LCU: tanto antes de agregar una actualización como después de agregar una actualización, compruebe el número de versión de WinRE para asegurarse de que la actualización se aplicó correctamente.
  • Al agregar un paquete DU: Una vez que haya agregado el paquete, compruebe la lista de paquetes de la imagen para asegurarse de que el paquete se agregó correctamente a la imagen.

Actualizar una imagen sin conexión

En los pasos siguientes se explica cómo agregar un paquete actualizado a una imagen de Windows RE sin conexión.

Montar la imagen de Windows

La imagen de Windows RE (winre.wim) se incluye dentro de la imagen de Windows (install.wim) y, finalmente, se copia en la partición de herramientas de Windows RE en el equipo o dispositivo de destino. Para modificar la imagen de WinRE, primero debe montar la imagen de Windows y, a continuación, montar la imagen de Windows RE. Una vez montadas ambas imágenes, puede realizar los cambios, desmontar la imagen de WinRE y, a continuación, desmontar la imagen de Windows.

  • Cree un directorio de montaje y monte install.wim:

    Símbolo del sistema de Windows
    md C:\mount\windows
    Dism /Mount-Wim /WimFile:C:\images\install.wim /index:1 /MountDir:C:\mount\windows 
    

Montar la imagen de WinRE

  • Monte el archivo de imagen de Windows RE a partir de la imagen montada.

    Símbolo del sistema de Windows
    Md c:\mount\winre 
    Dism /Mount-Wim /WimFile:C:\mount\windows\Windows\System32\Recovery\winre.wim /index:1 /MountDir:C:\mount\winre 
    

     Propina

    Si winre.wim no se puede ver en el directorio especificado, use el siguiente comando para hacer visible el archivo:

    Símbolo del sistema de Windows
    attrib -h -a -s C:\mount\windows\Windows\System32\Recovery\winre.wim
    

Adición del paquete de actualización a WinRE

Con la imagen de recuperación montada, puede agregar la actualización para solucionar el problema.

  1. Descargue el paquete de actualización necesario y agréguelo a la imagen de recuperación.

    Símbolo del sistema de Windows
    Dism /Add-Package /Image:C:\mount\winre /PackagePath:"c:\downloadedupdate\update.msu" 
    

    o

    Símbolo del sistema de Windows
    Dism /Add-Package /Image:C:\mount\ /PackagePath:"c:\downloadedupdate\dynamicupdate.cab" 
    
  2. Si agregó un paquete de actualización dinámica, valide que el paquete que agregó esté en la imagen:

    Símbolo del sistema de Windows
     Dism /Image:C:\mount\ /Get-Packages
    

    Compruebe la lista del paquete de actualización que acaba de agregar. El paquete debe incluir el número de KB y mostrará el como si se hubiera agregado correctamente:StateInstalled

    Package Identity : Package_for_KB5021041~31bf3856ad364e35~amd64~~22621.815.1.0
    State : Installed
    Release Type : Update
    
  3. Limpie la imagen de recuperación y restablezca la base de los componentes reemplazados:

    Símbolo del sistema de Windows
    dism /image:C:\mount /cleanup-image /StartComponentCleanup /ResetBase 
    

Desmontar las imágenes

  1. Cierre todas las aplicaciones que puedan estar accediendo a los archivos de la imagen, incluido el Explorador de archivos.

  2. Confirme los cambios y desmonte la imagen de Windows RE:

    Símbolo del sistema de Windows
    Dism /Unmount-Image /MountDir:"C:\mount\winre" /Commit 
    

    Este proceso puede tardar unos minutos.

  3. Confirme los cambios y desmonte la imagen de Windows:

    Símbolo del sistema de Windows
    Dism /Unmount-Image /MountDir:"C:\mount\windows" /Commit 
    

    Donde C es la letra de unidad de la unidad que contiene la imagen. Este proceso puede tardar varios minutos.

La imagen de Windows RE ahora está actualizada y forma parte de la imagen de Windows más grande.

Aplicar la actualización a un equipo en ejecución

Puede aplicar la corrección a la imagen de recuperación de Windows en un equipo en ejecución. Los siguientes pasos le guiarán a través del montaje de una imagen de recuperación de Windows, la aplicación de una actualización a ella y, a continuación, el guardado de los cambios:

  1. Abra un símbolo del sistema como administrador.

  2. Cree un directorio en el que pueda montar la imagen de recuperación para realizar cambios en ella.

    Símbolo del sistema de Windows
    md c:\mount 
    
  3. Monta tu imagen de recuperación con REAgentC:

    Símbolo del sistema de Windows
    ReAgentC.exe /mountre /path c:\mount 
    
  4. Con la imagen de recuperación montada, puede descargar y agregar el paquete de actualización a la imagen de Windows RE.

    Símbolo del sistema de Windows
    Dism /Add-Package /Image:C:\mount\ /PackagePath:"c:\downloadedupdate\update.msu" 
    

    o

    Símbolo del sistema de Windows
    Dism /Add-Package /Image:C:\mount\ /PackagePath:"c:\downloadedupdate\dynamicupdate.cab" 
    
  5. Si agregó un paquete de actualización dinámica, valide que el paquete que agregó esté en la imagen:

    Símbolo del sistema de Windows
     Dism /Image:C:\mount\ /Get-Packages
    

    Compruebe la lista del paquete de actualización que acaba de agregar. El paquete debe incluir el número de KB y mostrará el como si se hubiera agregado correctamente:StateInstalled

    Package Identity : Package_for_KB5021041~31bf3856ad364e35~amd64~~22621.815.1.0
    State : Installed
    Release Type : Update
    
  6. Limpie la imagen de recuperación y restablezca la base de los componentes reemplazados:

    Símbolo del sistema de Windows
    dism /image:C:\mount /cleanup-image /StartComponentCleanup /ResetBase 
    
  7. Desmonte la imagen de recuperación de Windows:

    Símbolo del sistema de Windows
    ReAgentC.exe /unmountre /path c:\mount /commit 
    
  8. Si el disco del equipo está protegido por BitLocker o Cifrado de dispositivos: Utilícelo para deshabilitar y volver a habilitar Windows RE. Esto garantiza que la imagen actualizada de Windows RE esté activada y configurada correctamente para la instalación de Windows:ReagentC

    Símbolo del sistema de Windows
    reagentc /disable
    reagentc /enable 
    

La imagen de Windows RE en el equipo en ejecución ahora está actualizada.

Comprobación de la versión de la imagen de WinRE

Puede comprobar el número de versión de la imagen de WinRE en las instalaciones de Windows en línea y sin conexión. Esto puede ser útil para comprobar la versión de WinRE antes de agregar una actualización y, a continuación, después de aplicar una actualización para comprobar que la actualización se agregó correctamente.

 Nota

El número de versión de WinRE solo cambiará después de agregar una LCU. Si agrega un paquete DU, use DISM /get-packages como se describe en los pasos anteriores para asegurarse de que el paquete se ha agregado a la imagen.

Validación de la versión de Windows RE en un sistema operativo Windows en línea

  1. Use ReagentC para buscar la ubicación de la imagen de WinRE instalada ejecutando el siguiente comando:

    Símbolo del sistema de Windows
    reagentc /info
    

    Este comando devuelve la ubicación de Windows RE similar al ejemplo siguiente:

    Símbolo del sistema de Windows
    \\?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE
    
  2. Use DISM para obtener información de versión sobre la imagen winre.wim ubicada en la ruta de acceso devuelta por ReagentC en el paso anterior. Asegúrese de agregar el nombre de la imagen de WinRE y el número de índice de la imagen a la ruta de acceso al ejecutar el comando:

    Símbolo del sistema de Windows
    Dism /Get-ImageInfo /ImageFile:\\?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE\winre.wim /index:1
    

    Observe la versión notificada. Por ejemplo:

    Símbolo del sistema de Windows
    Version : 10.0.22621
    ServicePack Build : 1
    ServicePack Level : 0
    

    Asegúrese de que el es mayor o igual que el UBR de la actualización que ha agregado. Por ejemplo, para Windows 11, versión 22H2, la actualización de seguridad de noviembre se mostraría como , ya que el número de versión completo de esa actualización es 22621.819.ServicePackBuild819SerivcePack Build

    • Si la versión notificada es una versión anterior, esto indica que la imagen de Windows RE no está actualizada.
    • Si la versión notificada es la misma o una versión posterior, no es necesario realizar ninguna acción.

Validación de la versión de Windows RE en un sistema operativo Windows sin conexión

  1. Monte la imagen de Windows en una carpeta local, por ejemplo C:\mount\windows:

    Símbolo del sistema de Windows
    mkdir C:\mount\windows
    Dism /Mount-Image /ImageFile:C:\mount\install.wim /Index:1 /MountDir:C:\mount\windows
    
  2. Use DISM para obtener información de la versión de la imagen winre.wim ubicada en la carpeta. Asegúrese de especificar el número de índice de la imagen cuando ejecute el comando:Windows\system32\recovery

    Símbolo del sistema de Windows
    Dism /Get-ImageInfo /ImageFile:c:\mount\windows\windows\system32\recovery\winre.wim /index:1
    

    Observe la versión notificada. Por ejemplo:

    Símbolo del sistema de Windows
    Version : 10.0.22621
    ServicePack Build : 1
    ServicePack Level : 0
    

    Asegúrese de que el es mayor o igual que el UBR de la actualización que ha agregado. Por ejemplo, para Windows 11, versión 22H2, la actualización de seguridad de noviembre se mostraría como , ya que el número de versión completo de esa actualización es 22621.819.ServicePackBuild819SerivcePack Build

    • Si la versión notificada es una versión anterior, esto indica que la imagen de Windows RE no está actualizada.
    • Si la versión notificada es la misma o una versión posterior, no es necesario realizar ninguna acción.

Extender la partición de Windows RE

El script de ejemplo siguiente se puede usar para aumentar el tamaño de la partición de recuperación para actualizar correctamente el Entorno de recuperación de Windows (WinRE). Se recomienda tener 250 MB de espacio libre en la partición de recuperación para que las actualizaciones de WinRE se instalen correctamente. En los dispositivos que pueden no tener suficiente espacio libre en la partición de recuperación, el script de ejemplo siguiente se puede utilizar para ampliar la partición de recuperación en 250 MB.

Reinicie el equipo antes de ejecutar el script. Esto es fundamental, ya que puede haber operaciones de partición pendientes en el equipo que deberán finalizarse antes de que el script pueda aumentar de forma segura el tamaño de la partición WinRE. Después de que la máquina se reinicie, abra Powershell como administrador y ejecute mkdir <ruta de acceso al nuevo directorio de copia de seguridad> para crear un directorio de copia de seguridad que el script puede usar en caso de que no se pueda restaurar la partición original. Tenga en cuenta la ubicación de este directorio de copia de seguridad, ya que el script le pedirá la ruta de copia de seguridad. Si va a implementar esto a escala, puede omitir la solicitud de script mediante los parámetros

" -SkipConfirmation $true -BackupFolder "

Por ejemplo

Resize_script.ps1 -SkipConfirmation $true -BackupFolder c:\winre_backup

PowerShell
Param (
[Parameter(Mandatory=$false,HelpMessage="Skip confirmation")][bool]$SkipConfirmation=$false,
[Parameter(Mandatory=$true,HelpMessage="Path to backup old WinRE partition content to")][string]$BackupFolder
)
# ------------------------------------
# Helper functions
# ------------------------------------
# Log message
function LogMessage([string]$message)
{
	$message = "$message"
	Write-Host $message
}
# Extract numbers from string
function ExtractNumbers([string]$str)
{
	$cleanString = $str -replace "[^0-9]"
	return [long]$cleanString
}
# Display partition info using fsutil
# Return an array, the first value is total size and the second value is free space
function DisplayPartitionInfo([string[]]$partitionPath)
{
	$volume = Get-WmiObject -Class Win32_Volume | Where-Object { $partitionPath -contains $_.DeviceID }
	LogMessage("  Partition capacity: " +  $volume.Capacity)
	LogMessage("  Partition free space: " + $volume.FreeSpace)
	return $volume.Capacity, $volume.FreeSpace
} 
# Display WinRE status
function DisplayWinREStatus()
{
	# Get WinRE partition info
	$WinREInfo = Reagentc /info
	foreach ($line in $WinREInfo)
	{
		$params = $line.Split(':')
		if ($params.Count -lt 2)
		{
			continue
		}
		if (($params[1].Trim() -ieq "Enabled") -Or (($params[1].Trim() -ieq "Disabled")))
		{
			$Status = $params[1].Trim() -ieq "Enabled"
			LogMessage($line.Trim())
		}
		if ($params[1].Trim() -like "\\?\GLOBALROOT*")
		{
			$Location = $params[1].Trim()
			LogMessage($line.Trim())
		}
	}
	
	return $Status, $Location
}
# ------------------------------------
# Main execution
# ------------------------------------
# Clear the error
$Error.Clear()
# ------------------------------------
# Examining the system to collect required info 
# for the execution
# Need to check WinRE status, collect OS and WinRE
# partition info
# ------------------------------------
LogMessage("Start time: $([DateTime]::Now)")
LogMessage("Examining the system...")
$NeedShrink = $true
$NeedCreateNew = $false
$NeedBackup = $false
# Get WinRE partition info
$InitialWinREStatus = DisplayWinREStatus
$WinREStatus = $InitialWinREStatus[0]
$WinRELocation = $InitialWinREStatus[1]
if (!$WinREStatus)
{
	LogMessage("Error: WinRE Disabled")
	exit 1
}
# Get System directory and ReAgent xml file
$system32Path = [System.Environment]::SystemDirectory
LogMessage("System directory: " + $system32Path)
$ReAgentXmlPath = Join-Path -Path $system32Path -ChildPath "\Recovery\ReAgent.xml"
LogMessage("ReAgent xml: " + $ReAgentXmlPath)
if (!(Test-Path  $ReAgentXmlPath))
{
	LogMessage("Error: ReAgent.xml cannot be found")
	exit 1
}
# Get OS partition
LogMessage("")
LogMessage("Collecting OS and WinRE partition info...")
$OSDrive = $system32Path.Substring(0,1)
$OSPartition = Get-Partition -DriveLetter $OSDrive
# Get WinRE partition
$WinRELocationItems = $WinRELocation.Split('\\')
foreach ($item in $WinRELocationItems)
{
    if ($item -like "harddisk*")
	{
		$OSDiskIndex = ExtractNumbers($item)
	}
	if ($item -like "partition*")
	{
		$WinREPartitionIndex = ExtractNumbers($item)
	}
}
LogMessage("OS Disk: " + $OSDiskIndex)
LogMessage("OS Partition: " + $OSPartition.PartitionNumber)
LogMessage("WinRE Partition: " + $WinREPartitionIndex)
$WinREPartition = Get-Partition -DiskNumber $OSDiskIndex -PartitionNumber $WinREPartitionIndex
$diskInfo = Get-Disk -number $OSDiskIndex
$diskType = $diskInfo.PartitionStyle
LogMessage("Disk PartitionStyle: " + $diskType)
# Display WinRE partition size info
LogMessage("WinRE partition size info")
$WinREPartitionSizeInfo = DisplayPartitionInfo($WinREPartition.AccessPaths)
LogMessage("WinRE Partition Offset: " + $WinREPartition.Offset)
LogMessage("WinRE Partition Type: " + $WinREPartition.Type)
LogMessage("OS partition size: " + $OSPartition.Size)
LogMessage("OS partition Offset: " + $OSPartition.Offset)
$OSPartitionEnds = $OSPartition.Offset + $OSPartition.Size
LogMessage("OS partition ends at: " + $OSPartitionEnds)
LogMessage("WinRE partition starts at: " + $WinREPartition.Offset)
$WinREIsOnSystemPartition = $false
if ($diskType -ieq "MBR")
{
	if ($WinREPartition.IsActive)
	{
		LogMessage("WinRE is on System partition")
		$WinREIsOnSystemPartition = $true
	}
}
if ($diskType -ieq "GPT")
{
	if ($WinREPartition.Type -ieq "System")
	{
		LogMessage("WinRE is on System partition")
		$WinREIsOnSystemPartition = $true
	}
}
# Checking the BackupFolder parameter
if ($PSBoundParameters.ContainsKey('BackupFolder'))
{
	LogMessage("")
	LogMessage("Backup Directory: [" + $BackupFolder + "]")
	
	$Needbackup = $true
	
	if ($WinREIsOnSystemPartition)
	{
		$Needbackup = $false
		LogMessage("WinRE is on System partition which will be preserved. No need to backup content")
	}
	else
	{
		if (Test-path $BackupFolder)
		{
			$items = Get-ChildItem -Path $BackupFolder
			if ($items)
			{
				LogMessage("Error: Existing backup directory is not empty")
				exit 1
			}
		}
		else
		{
			LogMessage("Creating backup directory...")
			try 
			{
				$item = New-Item -Path $BackupFolder -ItemType Directory -ErrorAction Stop
				if ($item)
				{
					LogMessage("Backup directory created")
				}
				else
				{
					LogMessage("Error: Failed to create backup directory [" + $BackupFolder + "]")
					exit 1
				}
			} catch 
			{
				LogMessage("Error: An error occurred: $_")
				exit 1
			}
		}
	}
}
# ------------------------------------
# Verify whether we meet requirements of execution
# - WinRE cannot be on OS partition for the extension
# - WinRE partition must be the next partition after OS partition
# - If WinRE partition already have >=250MB free space, no need to do repartition
# - If there is enough unallocated space to grow the WinRE partition size, skip shrinking OS
# 
# However, if the WinRE partition is before the OS partition, there is no chance to extend it
# As a result, it's better to create a new WinRE partition after the OS partition
# ------------------------------------
# Perform a few checks
LogMessage("")
LogMessage("Verifying if the WinRE partition needs to be extended or not...")
if (!(($diskType -ieq "MBR") -Or ($diskType -ieq "GPT")))
{
	LogMessage("Error: Got an unexpected disk partition style: " +$diskType)
	exit 1
}
# WinRE partition must be after OS partition for the repartition
if ($WinREPartitionIndex -eq $OSPartition.PartitionNumber)
{
	LogMessage("WinRE and OS are on the same partition, should not perform extension")
	exit 0
}
$supportedSize = Get-PartitionSupportedSize -DriveLetter $OSDrive
# if there is enough free space, skip extension
if ($WinREPartitionSizeInfo[1] -ge 250MB)
{
	LogMessage("More than 250 MB of free space was detected in the WinRE partition, there is no need to extend the partition")
	exit 0
}
if ($WinREPartition.Offset -lt $OSPartitionEnds)
{
	LogMessage("WinRE partition is not after OS partition, cannot perform extension")
	LogMessage("Need to create a new WinRE partition after OS partition")
	$NeedCreateNew = $true
	$NeedShrink = $true
	
	# Calculate the size of repartition
	# Will create a new WinRE partition with current WinRE partition size + 250 MB
	# The OS partition size will be shrunk by the new WinRE partition size
	$targetWinREPartitionSize = $WinREPartitionSizeInfo[0] + 250MB
	$shrinkSize = [Math]::Ceiling($targetWinREPartitionSize / 1MB) * 1MB
	$targetOSPartitionSize = $OSPartition.Size - $shrinkSize
	if ($targetOSPartitionSize -lt $supportedSize.SizeMin)
	{
		LogMessage("Error: The target OS partition size after shrinking is smaller than the supported minimum size, cannot perform the repartition")
		exit 1
	}
}
else
{
	if ($WinREIsOnSystemPartition)
	{
		LogMessage("WinRE parititon is after the OS partition and it's also System partition")
		LogMessage("Error: Got unexpected disk layout, cannot proceed")
		exit 1
	}
	if (!($WinREPartitionIndex -eq ($OSPartition.PartitionNumber + 1)))
	{
		LogMessage("Error: WinRE partition is not right after the OS partition, cannot extend WinRE partition")
		exit 1
	}
	# Calculate the size of repartition
	# Will shrink OS partitition by 250 MB
	$shrinkSize = 250MB
	$targetOSPartitionSize = $OSPartition.Size - $shrinkSize
	$targetWinREPartitionSize = $WinREPartitionSizeInfo[0] + 250MB
	$UnallocatedSpace = $WinREPartition.Offset - $OSPartitionEnds;
	# If there is unallocated space, consider using it
	if ($UnallocatedSpace -ge 250MB)
	{
		$UnallocatedSpace = $WinREPartition.Offset - $OSPartitionEnds;
		LogMessage("Found unallocated space between OS and WinRE partition: " + $UnallocatedSpace)
		LogMessage("There is already enough space to extend WinRE partition without shrinking the OS partition")
		$NeedShrink = $false
		$targetOSPartitionSize = 0
	}
	else
	{
		$shrinkSize = [Math]::Ceiling((250MB - $UnallocatedSpace)/ 1MB) * 1MB
		if ($shrinkSize > 250MB)
		{
			$shrinkSize = 250MB
		}
		$targetOSPartitionSize = $OSPartition.Size - $shrinkSize
		if ($targetOSPartitionSize -lt $supportedSize.SizeMin)
		{
			LogMessage("Error: The target OS partition size after shrinking is smaller than the supported minimum size, cannot perform the repartition")
			exit 1
		}
	}
}
# ------------------------------------
# Report execution plan and ask for user confirmation to continue
# ------------------------------------
# Report the changes planned to be executed, waiting for user confirmation
LogMessage("")
LogMessage("Summary of proposed changes")
if ($NeedCreateNew)
{
	LogMessage("Note: WinRE partition is before OS partition, need to create a new WinRE partition after OS partition")
	LogMessage("Will shrink OS partition by " + $shrinkSize)
	LogMessage("  Current OS partition size: " + $OSPartition.Size)
	LogMessage("  Target OS partition size after shrinking: " + $targetOSPartitionSize)
	LogMessage("New WinRE partition will be created with size: ", $targetWinREPartitionSize)
	if ($WinREIsOnSystemPartition)
	{
		LogMessage("Existing WinRE partition is also system partition, it will be preserved")
	}
	else
	{
		LogMessage("Existing WinRE partition will be deleted")
		LogMessage("  WinRE partition: Disk [" + $OSDiskIndex + "] Partition [" + $WinREPartitionIndex + "]")
		LogMessage("  Current WinRE partition size: " + $WinREPartitionSizeInfo[0])
	}
}
else
{
	if ($NeedShrink)
	{
		LogMessage("Will shrink OS partition by " + $shrinkSize)
		LogMessage("  Current OS partition size: " + $OSPartition.Size)
		LogMessage("  Target OS partition size after shrinking: " + $targetOSPartitionSize)
		if ($UnallocatedSpace -ge 0)
		{
			LogMessage("Unallocated space between OS and WinRE partition that will be used towards the new WinRE partition: " + $UnallocatedSpace)
		}
	}
	else
	{
		LogMessage("Will use 250MB from unallocated space between OS and WinRE partition")
	}
	LogMessage("Will extend WinRE partition size by 250MB")
	LogMessage("  WinRE partition: Disk [" + $OSDiskIndex + "] Partition [" + $WinREPartitionIndex + "]")
	LogMessage("  Current WinRE partition size: " + $WinREPartitionSizeInfo[0])
	LogMessage("  New WinRE partition size:     " + $targetWinREPartitionSize)
	LogMessage("WinRE will be temporarily disabled before extending the WinRE partition and enabled automatically in the end")
	if ($UnallocatedSpace -ge 100MB)
	{
		LogMessage("Warning: More than 100MB of unallocated space was detected between the OS and WinRE partitions")
		LogMessage("Would you like to proceed by using the unallocated space between the OS and the WinRE partitions?")
	}
}
if ($Needbackup)
{
	LogMessage("")
	LogMessage("The contents of the old WinRE partition will be backed up to [" + $BackupFolder + "]")
}
LogMessage("")
LogMessage("Please reboot the device before running this script to ensure any pending partition actions are finalized")
LogMessage("")
if ($SkipConfirmation)
{
	LogMessage("User chose to skip confirmation")
	LogMessage("Proceeding with changes...")
}
else
{
	$userInput = Read-Host -Prompt "Would you like to proceed? Y for Yes and N for No"
		
	if ($userInput -ieq "Y")
	{
		LogMessage("Proceeding with changes...")
	}
	elseif ($userInput -ieq "N")
	{
		LogMessage("Canceling based on user request, no changes were made to the system")
		exit 0
	}
	else
	{
		LogMessage("Error: Unexpected user input: [" + $userInput + "]") 
		exit 0
	}
}
LogMessage("")
LogMessage("Note: To prevent unexpected results, please do not interrupt the execution or restart your system")
# ------------------------------------
# Do the actual execution
# The main flow is:
# 1. Check whether ReAgent.xml has stage location and clear it for repartiion
# 2. Disable WinRE as WinRE partition will be deleted
# 3. Perform the repartition to create a larger WinRE partition
# 4. Re-enable WinRE
# ------------------------------------
LogMessage("")
# Load ReAgent.xml to clear Stage location
LogMessage("Loading [" + $ReAgentXmlPath + "] ...")
$xml = [xml](Get-Content -Path $ReAgentXmlPath)
$node = $xml.WindowsRE.ImageLocation
if (($node.path -eq "") -And ($node.guid -eq "{00000000-0000-0000-0000-000000000000}") -And ($node.offset -eq "0") -And ($node.id -eq "0"))
{
	LogMessage("Stage location info is empty")
}
else
{
	LogMessage("Clearing stage location info...")
	$node.path = ""
	$node.offset = "0"
	$node.guid= "{00000000-0000-0000-0000-000000000000}"
	$node.id="0"
	# Save the change
	LogMessage("Saving changes to [" + $ReAgentXmlPath + "]...")
	$xml.Save($ReAgentXmlPath)
}
# Disable WinRE
LogMessage("Disabling WinRE...")
reagentc /disable
if (!($LASTEXITCODE -eq 0))
{
	LogMessage("Warning: encountered an error when disabling WinRE: " + $LASTEXITCODE)
	exit $LASTEXITCODE
}
# Verify WinRE is under C:\Windows\System32\Recovery\WinRE.wim
$disableWinREPath = Join-Path -Path $system32Path -ChildPath "\Recovery\WinRE.wim"
LogMessage("Verifying that WinRE wim exists in downlevel at default location")
if (!(Test-Path $disableWinREPath))
{
	LogMessage("Error: Cannot find " + $disableWinREPath)
	
	# Re-enable WinRE
	LogMessage("Re-enabling WinRE on error...")
	reagentc /enable
	if (!($LASTEXITCODE -eq 0))
	{
		LogMessage("Warning: encountered an error when enabling WinRE: " + $LASTEXITCODE)
	}
	exit 1
}
# ------------------------------------
# Perform the repartition
# 1. Resize the OS partition
# 2. Delete the WinRE partition
# 3. Create a new WinRE partition
# ------------------------------------
LogMessage("Performing repartition to extend the WinRE partition ...")
# 1. Resize the OS partition
if ($NeedShrink)
{
	LogMessage("Shrinking the OS partition to create a larger WinRE partition")
	LogMessage("Resizing the OS partition to: [" + $targetOSPartitionSize + "]...")
	Resize-Partition -DriveLetter $OSDrive -Size $targetOSPartitionSize
	if ($Error.Count -gt 0) {
		LogMessage("Error: Resize-Partition encountered errors: " + $Error[0].Exception.Message)
		
		# Re-enable WinRE
		LogMessage("Re-enabling WinRE on error...")
		reagentc /enable
		if (!($LASTEXITCODE -eq 0))
		{
			LogMessage("Warning: encountered an error when enabling WinRE: " + $LASTEXITCODE)
		}
		exit 1
	}
	$OSPartitionAfterShrink = Get-Partition -DriveLetter $OSDrive
	LogMessage("Target partition size: " + $targetOSPartitionSize)
	LogMessage("Size of OS partition after shrinking: " + $OSPartitionAfterShrink.Size)
}
# 2. Delete the WinRE partition
LogMessage("")
if ($WinREIsOnSystemPartition)
{
	LogMessage("Existing WinRE partition is System partition, skipping deletion")
}
else
{	
	# If requested by user, backup rest of the content on WinRE partition to backup directory
	if ($Needbackup)
	{
		$sourcePath = $WinREPartition.AccessPaths[0] 
		LogMessage("Copying content on WinRE partition from [" + $sourcePath + "] to [" + $BackupFolder + "]...")
		
		# Copy-Item may have access issue with certain system folders, enumerate the children items and exlcude them
		$items = Get-ChildItem -LiteralPath $sourcePath -Force
		foreach ($item in $items)
		{
			if ($item.Name -ieq "System Volume Information")
			{
				continue
			}
			$sourceItemPath = Join-Path -Path $sourcePath -ChildPath $item.Name
			$destItemPath = Join-Path -Path $BackupFolder -ChildPath $item.Name
			try 
			{
				LogMessage("Copying [" + $sourceItemPath + "] to [" + $destItemPath + "]...")
				Copy-Item -LiteralPath $sourceItemPath -Destination $destItemPath -Recurse -Force
			} catch 
			{
				LogMessage("Error: An error occurred during copy: $_")
				exit 1
			}
		}
		
		LogMessage("Backup completed")
		LogMessage("")
	}
	LogMessage("Deleting WinRE partition: Disk [" + $OSDiskIndex + "] Partition [" + $WinREPartitionIndex + "]...")
	Remove-Partition -DiskNumber $OSDiskIndex -PartitionNumber $WinREPartitionIndex -Confirm:$false
	if ($Error.Count -gt 0) {
		LogMessage("Error: Remove-Partition encountered errors: " + $Error[0].Exception.Message)
		exit 1
	}
}
# A short sleep for the partition change
Sleep 5
# 3. Create a new WinRE partition
LogMessage("")
LogMessage("Creating new WinRE partition...")
LogMessage("Target size: " + $targetWinREPartitionSize)
if ($diskType -ieq "GPT")
{
	$partition = New-Partition -DiskNumber $OSDiskIndex -Size $targetWinREPartitionSize -GptType "{de94bba4-06d1-4d40-a16a-bfd50179d6ac}"
	
	$newPartitionIndex = $partition.PartitionNumber
	# A short sleep to make sure the partition is ready for formatting
	Sleep 2
	LogMessage("Formating the partition...")
	$result = Format-Volume -Partition $partition -FileSystem NTFS -Confirm:$false
	if ($Error.Count -gt 0) {
		LogMessage("Error: Format-Volume encountered errors: " + $Error[0].Exception.Message)
		exit 1
	}
}
else
{
	#$partition = New-Partition -DiskNumber $OSDiskIndex -Size $targetWinREPartitionSize -MbrType 0x27
	$targetWinREPartitionSizeInMb = [int]($targetWinREPartitionSize/1MB)
	$diskpartScript = 
@"
select disk $OSDiskIndex
create partition primary size=$targetWinREPartitionSizeInMb id=27
format quick fs=ntfs label="Recovery"
set id=27
"@
	$TempPath = $env:Temp
	$diskpartSciptFile = Join-Path -Path $TempPath -ChildPath "\ExtendWinRE_MBR_PowershellScript.txt"
	
	LogMessage("Creating temporary diskpart script to create Recovery partition on MBR disk...")
	LogMessage("Temporary diskpart script file: " + $diskpartSciptFile)
	$diskpartScript | Out-File -FilePath $diskpartSciptFile -Encoding ascii
	
	LogMessage("Executing diskpart script...")
	try 
	{
		$diskpartOutput = diskpart /s $diskpartSciptFile
		
		if ($diskpartOutput -match "DiskPart successfully") 
		{
			LogMessage("Diskpart script executed successfully")
		}
		else
		{
			LogMessage("Error executing diskpart script:" + $diskpartOutput)
			exit 1
		}
		LogMessage("Deleting temporary diskpart script file...")
		Remove-Item $diskpartSciptFile
	}
	catch 
	{
		LogMessage("Error executing diskpart script: $_")
		exit 1
	}
	
	$vol = Get-Volume -FileSystemLabel "Recovery"
	$newPartitionIndex = (Get-Partition | Where-Object { $_.AccessPaths -contains $vol.Path } ).PartitionNumber
}
if ($Error.Count -gt 0) 
{
	LogMessage("Error: New-Partition encountered errors: " + $Error[0].Exception.Message)
	exit 1
}
LogMessage("New Partition index: " + $newPartitionIndex)
# Re-enable WinRE
LogMessage("Re-enabling WinRE...")
reagentc /enable
if (!($LASTEXITCODE -eq 0))
{
	LogMessage("Warning: encountered an error when enabling WinRE: " + $LASTEXITCODE)
	exit $LASTEXITCODE
}
# In the end, Display WinRE status to verify WinRE is enabled correctly
LogMessage("")
LogMessage("WinRE Information:")
$FinalWinREStatus = DisplayWinREStatus
$WinREStatus = $FinalWinREStatus[0]
$WinRELocation = $FinalWinREStatus[1]
if (!$WinREStatus)
{
	LogMessage("Warning: WinRE Disabled")
}
$WinRELocationItems = $WinRELocation.Split('\\')
foreach ($item in $WinRELocationItems)
{
	if ($item -like "partition*")
	{
		$WinREPartitionIndex = ExtractNumbers($item)
	}
}
LogMessage("WinRE Partition Index: " + $WinREPartitionIndex)
$WinREPartition = Get-Partition -DiskNumber $OSDiskIndex -PartitionNumber $WinREPartitionIndex
$WinREPartitionSizeInfoAfter = DisplayPartitionInfo($WinREPartition.AccessPaths)
LogMessage("")
LogMessage("OS Information:")
$OSPartition = Get-Partition -DriveLetter $OSDrive
LogMessage("OS partition size: " + $OSPartition.Size)
LogMessage("OS partition Offset: " + $OSPartition.Offset)
if (!($WinREPartitionIndex -eq $newPartitionIndex))
{
	LogMessage("Warning: WinRE is installed to partition [" + $WinREPartitionIndex +"], but the newly created Recovery partition is [" + $newPartitionIndex + "]")
}
LogMessage("End time: $([DateTime]::Now)")
if ($NeedBackup)
{
	LogMessage("")
	LogMessage("The contents of the old WinRE partition has been backed up to [" + $BackupFolder + "]")
}
LogMessage("")
LogMessage("Successfully completed the operation")

About

Vistas de página en total

Tecno PC® Ecuador. Con la tecnología de Blogger.

Followers