Guía de personalización de imágenes de implementación de Windows (WIM) (Parte 5)

Iniciado por Eleкtro, 12 Abril 2014, 23:20 PM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

5.0
· Introducción a las características/paquetes de Windows




Windows instala consigo muchas características, algunas son visibles y configurables para el usuario como Windows Media Player e Internet Explorer, pero otras son completamente ocultas por seguridad, como drivers, codecs, Telnet, Reconocimiento de voz, y muchas otras cosas más internas, estas características se distribuyen dentro de "paquetes" los cuales están catalogados y se pueden instalar y/o desinstalar dentro de una imagen WIM, paquetes y características se tratan por separado.


· ¿Que herramientas necesitaremos?
·DISM, para el montaje de la imagen y la eliminación de paquetes y características.
· WIM Registry Tweak Tool, para tomar privilegios necesarios en el Hive montado.






5.1
· Obtener información sobre los paquetes

Primero deben usar DISM para montar la imagen Install.wim del DVD de Windows en un directorio (recuerden montar el índice de imagen que quieren manipular), en el punto 3.2 del tutorial está explicado el procedimiento de montaje usando DISM.

En este ejemplo montaré el índice 1 de mi imagen WIM del DVD original de Windows 8.1, que hace referencia a la edición "Windows 8.1 (Core)", la sintaxis del comando es esta:
Dism.exe /Mount-Image /imageFile:".\Install.wim" /Index:"1" /MountDir:"C:\WinMount"



Seguídamente, para obtener los paquetes visibles y que están instalados en dicha edición/imagen usamos DISM de nuevo usando esta sintaxis:
Dism.exe /Get-Packages /Image:"Directorio de montaje"

El parámetro /Get-Packages indica que se trata de una operación de obtención de información.
En el parámetro /Image debemos indicar el directorio donde previamente hemos montado la imagen WIM.

Ejemplo:
Dism.exe /Get-Packages /Image:"C:\WinMount" /Format:Table



También podemos usar la utilidad WIM Registry Tweak Tool para desocultar los paquetes ocultos y obtener los paquetes, usaremos esta sintaxis:
"WIM Registry Tweak Tool.exe" /p "Directorio de montaje" /l

Ejemplo:
"WIM Registry Tweak Tool.exe" /p "C:\WinMount" /l



Esto nos creará un archivo "Packages.txt" en el directorio de trabajo del WIM Registry Tweak Tool con los nombres de los paquetes existentes:

Packages.txt
Adobe-Flash-For-Windows-Package~31bf3856ad364e35~amd64~~6.3.9600.16384
Microsoft-Windows-InternetExplorer-Optional-Package~31bf3856ad364e35~amd64~es-ES~11.0.9600.16384
Microsoft-Windows-InternetExplorer-Optional-Package~31bf3856ad364e35~amd64~~11.0.9600.16384
Microsoft-Windows-InternetExplorer-Package-shell~31bf3856ad364e35~amd64~es-ES~6.3.9600.16384
Microsoft-Windows-InternetExplorer-Package-shell~31bf3856ad364e35~amd64~~6.3.9600.16384
Microsoft-Windows-InternetExplorer-Package-ua~31bf3856ad364e35~amd64~es-ES~6.3.9600.16384
Microsoft-Windows-InternetExplorer-Package-ua~31bf3856ad364e35~amd64~~6.3.9600.16384
Microsoft-Windows-InternetExplorer-Package~31bf3856ad364e35~amd64~es-ES~11.0.9600.16384
Microsoft-Windows-InternetExplorer-Package~31bf3856ad364e35~amd64~~11.0.9600.16384
...



Nota: Los nombres de los paquetes también los pueden encontrar en el directorio montado: ...\Windows\Servicing\Packages






5.2
· Obtener información sobre las características

Nota: Lista de características de Windows 8.1: http://technet.microsoft.com/en-us/library/dn328991.aspx

Para obtener las carcterísticas que están habilitadas en la imagen de Windows usaremos DISM.

Sintaxis
Dism.exe /Get-Features /Image:"Directorio de montaje" /Format:Table

Ejemplo:
Dism.exe /Get-Features /Image:"C:\WinMount" /Format:Table








5.3
· Eliminar paquetes

Aqui deben tener MUCHO cuidado, ya que muchos paquetes son esenciales para el correcto funcionamiento de windows (Ej: Drivers, NET Framework, etc...), pero una gran mayoria son inutiles y muchos de nosotros no los querremos tener instalados, pudiendo así ahorrar espacio de instalación y consumo de RAM.

Nota: Los archivos asociados a los paquetes no se eliminan del directorio WinSXS, simplemente dejarán una señal de desinstalación pendiente para cuando vayamos a instalar Windows.

La complejidad para eliminar un paquete puede variar, si tienen más de un índice en una imagen Install.wim es muy probable que los paquetes dependan de otras ediciones (índices) y no se pueden eliminar, además DISM puede dar un error de acceso denegado al montar los Hives del registro, así que para asegurarnos de que todo sale bien, primero utilizaremos la utilidad WIM Registry Tweak Tool para montar el registro y tomar los privilegios necesarios de Admin:

Ejecutaremos WIM Registry Tweak Tool usando esta sintaxis:
"WIM Registry Tweak Tool.exe" /p "Directorio de montaje"

Ejemplo:
"WIM Registry Tweak Tool.exe" /p "C:\WinMount"



Ahora ya estamos listos para desinstalar los pquetes que queramos usando DISM (También pueden hacerlo con WIM Registry Tweak Tool, pero es más seguro DISM).

Ejecutaremos DISM con esta sintaxis:
Dism.exe /Remove-Package /PackageName:"Nombre de la característica" /Imaage:"Directorio de montaje"

Ejemplo:
Dism.exe /Remove-Package /PackageName:"microsoft-windows-internetexplorer-optional-package~31bf3856ad364e35~amd64~~119600.16384" /Image:"C:\WinMount"



Listo!






5.4
· Desactivar características

El procedimiento para desactivar características es casi identico al de eliminar paquetes pero sin las mayores dificultades que tiene este otro, y con la diferencia además de que no corren ningún riesgo grave en el funcionamiento del SO por desactivar una característica (siempre la pueden volver a habilitar).

Para desactivar una característica de Windows, ejecutamos DISM usando la siguiente sintaxis:
Dism.exe /Image:"Directorio de montaje" /Disable-Feature /FeatureName:"Nombre de característica"

Ejemplo:
Dism.exe /Image:"C:\WinMount" /Disable-Feature /FeatureName:"WindowsMediaPlayer"







5.5
· Finalizando la eliminación de paquetes y desactivación de características

El último paso que debemos tener en cuenta es desmontar la imagen y aplicar los cambios realizados,
esto lo haremos utilizando DISM con la siguiente sintaxis:
Dism.exe /Unmount-Wim /Commit /MountDir:"Directorio de montaje"

Ejemplo:
Dism.exe /Unmount-Wim /Commit /MountDir:"C:\WinMount"



Nota: Opcionalmente podemos usar la utilidad ImageX para reconstruir la imagen WIM, el manejo de esta operación está explicada en el punto 3.4 del tutorial.






5.6
· Automatizar la eliminación de paquetes

He desarrollado un modo mediante el cual solo necesitan escribir los nombres de los paquetes que quieren eliminar en un archivo de texto y usar un Script Batch, el cual se encargará de Montar, tomar privilegios, eliminar, desmontar y reconstruir, todo de forma automatizada.

Todo lo necesario está incluido en este archivo comprimido:
http://www.mediafire.com/download/mq7o7q7brq6h4ca/WIM_Package_Uninstaller.rar


Una imagen de muestra:



Instrucciones:
Deben crear un archivo llamado "Packages.txt" y añadir los nombres de los paquetes que desenan eliminar (1 nombre por linea).

Ejemplo:
Packages.txt
microsoft-windows-miracast-driver-package~31bf3856ad364e35~amd64~~6.3.9600.16384
microsoft-windows-mobilepc-client-basic-package~31bf3856ad364e35~amd64~es-es~6.3.9600.16384
microsoft-windows-vpnplugins-package~31bf3856ad364e35~amd64~~6.3.9600.16384
microsoft-windows-webcamexperience-package~31bf3856ad364e35~amd64~~6.3.9600.16384


Seguídamente utilizan este Script.

Nota: Deben configurar los valores de las variables que están documentadas en la cabecera del código.

WIM Package Uninstaller.cmd
Código (dos) [Seleccionar]
@Echo OFF



REM =================
REM Console Settings:
REM =================

Title WIM Package Uninstaller - By Elektro
Mode Con Cols=150 Lines=50
CHCP 1252 1>NUL & REM Windows-1252, Spanish-Latin.



REM =====
REM Info:
REM =====

Echo+
Echo  ----------------------------------------------------------------------------------
Echo  This script mounts a Windows Image ^(WIM^) and then removes pre-installed packages
Echo  ----------------------------------------------------------------------------------
Echo+



REM ====================
REM User defined values:
REM ====================

REM This value indicates whether the Windows Image should be mounted.
REM True  = 'DISM' will try to mount the 'WIM' image.
REM False = 'DISM' will not try to mount the WIM image.
REM Set this value to 'FALSE' if the 'WIM' image is already mounted in the specified mount directory,
REM Otherwise, keep it as 'TRUE'.
Set "MountImage=True"

REM This value indicates whether the Windows Image should be unmounted at the end.
REM True  = 'DISM' will try to unmount the 'WIM' image.
REM False = 'DISM' will not try to unmount the WIM image.
REM Set this value to 'FALSE' if you want to keep the image mounted to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "UnmountImage=True"

REM This value indicates whether the Windows Image should be rebuilt at the end.
REM True  = 'ImageX' will try to rebuild the 'WIM' image.
REM False = 'ImageX' will keep the 'WIM' image as is.
REM Set this value to 'FALSE' if you want to keep the image with normal size to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "Rebuild=True"

REM This value indicates the 'WIM' image to be mounted.
Set "WindowsImage=%UserProfile%\Desktop\win 8 .1\win\sources\install.wim"

REM This value indicates the Image Index of the 'WIM' image.
Set "ImageIndex=1"

REM This value indicates the directory where to mount the 'WIM' image.
Set "MountDir=%HomeDrive%\WinMount"

REM This value indicates the textfile that contains the names of the packages to remove.
Set "PackageList=%CD%\Packages.txt"

REM This value indicates the ubication of the 'WIM Registry Tweak Tool.exe' file.
Set "WIMRegistryTweakTool=%CD%\Tools\WIM Registry Tweak Tool\WIM Registry Tweak Tool.exe"

REM This value indicates the ubication of 'ImageX.exe' file.
Set "ImageX=%CD%\Tools\Dism\ImageX.exe"

REM This value indicates the ubication of a custom 'DISM.exe' file if needed.
REM Default ubication: "%SystemRoot%\System32\Dism.exe"
Set "Dism=%CD%\Tools\Dism\Dism.exe"

REM This value indicates the ubication of the logfile that will record 'DISM' errors.
Set "DismLogfile=%CD%\%~n0 DISM.log"

REM This value indicates the logging-level of the 'DISM' process.
REM 1 = Errors only
REM 2 = Errors and warnings
REM 3 = Errors, warnings, and informational
REM 4 = All of the information listed previously, plus debug output
Set /A "DismLogLevel=2"

REM This value indicates the ubication of the logfile that will record Main information.
Set "Logfile=%CD%\%~n0.log"



REM =====
REM Main:
REM =====

:: Call Methods.
Call :CheckErrors
Call :CreateLogs
Call :CreateMountDir
Call :GetWIMSizeBefore
Call :StartTimer
Call :Mount
CLS
Call :ParsePackages
CLS
Call :CleanUp
Call :Unmount
Call :Rebuild
Call :StopTimer
Call :GetWIMSizeAfter
Call :EndLog
Pause&Exit



REM ========
REM Methods:
REM ========


:CreateLogs

:: Create the 'DISM' logfile with 'ANSI' encoding,
:: this is necessary to record a non-default 'DISM' loglevel such as '1' or '2'.
Echo+ >"%DismLogfile%"


:: Create the Main logfile and record starting info on it.
Echo+ >"%Logfile%"
(
Echo+
Echo   WIM Package Uninstaller
Echo ===========================
Echo   %DATE% ^| %TIME:~0,-3%
Echo /\/\/\/\/\/\/\/\/\/\/\/\/\/
Echo+
Echo [i] Mount Image?...: %MountImage%
Echo [i] Unmount Image?.: %UnmountImage%
Echo+
Echo [i] Windows Image..: %WindowsImage%
Echo [i] Image Index....: %ImageIndex%
Echo [i] Mount Directory: %MountDir%
Echo+
Echo [i] ImageX Path....: %ImageX%
Echo [i] Dism Path......: %Dism%
Echo [i] Dism Log File..: %DismLogfile%
Echo [i] Dism Log Level.: %DismLogLevel%
Echo+
Echo [i] Package List...: %PackageList%
Echo [i] Log File.......: %Logfile%
Echo+
Echo ===========================
)>"%Logfile%"

:: Display starting log info.
Type "%Logfile%"

:: Continue writting log.
(
Echo+
Echo Package conflicts:
Echo ==================
Echo+
)>>"%LogFile%"
Goto:EOF


:EndLog
(
Echo+
Echo [i] Done!
Echo [i] WIM Image Size Before........: %WIMSizeBefore%
Echo [i] WIM Image Size After.........: %WIMSizeAfter%
Echo [i] Packages Successfully Removed: %PackagesRemovedCount% Packages.
Echo [i] Packages Failed To Remove....: %PackagesFailedCount% Packages.
Echo [i] Packages Not Found...........: %PackagesNotFoundCount% Packages.
Echo [i] Elapsed Time.................: %ElapsedTime%
Echo+
)>>"%LogFile%"

:: Display ending information.
CLS
Type "%LogFile%"
Goto:EOF


:CreateMountDir
:: Create the mount directory.
(
If Not Exist "%MountDir%" If /I "%MountImage%" EQU "True" (
MkDir "%MountDir%" 2>NUL
)
) || (
Echo+
Echo [x] Error trying to create the directory "%MountDir%" to mount the Windows Image.
Echo [i] Ensure that you have Admin rights to create the directory.
Echo [i] Ensure that the directory name does not contains illegal characters.
Echo+
Pause&Exit
)
Goto:EOF


:Mount
:: Mount the Windows Image into the directory.
Echo+
Echo [+] Mounting WIM Image...
If /I "%MountImage%" EQU "True" (

"%Dism%" /Mount-Image /ImageFile:"%WindowsImage%" /Index:"%ImageIndex%" /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" || (
Echo+
Echo [x] Error mounting the Image Index "%ImageIndex%" in "%MountDir%"
Echo [i] Ensure that the Image Index exist.
Echo [i] Ensure that you have Admin rights to write inside the directory.
Echo [i] Ensure that the directory is not already mounted.
Echo [i] Ensure that the directory is fully empty.
Echo+
REM Try to unmount the failed image and discard changes.
If /I "%UnmountImage%" EQU "True" (
Echo [+] Unmounting and discarding changes...
"%Dism%" /Unmount-WIM /Discard /MountDir:"%MountDir%"
)
Pause&Exit
)

)
Goto:EOF


:CleanUp
Echo [+] CleaningUp WIM Image...
"%Dism%" /CleanUp-Image /StartComponentCleanUp /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet
Echo+
Goto:EOF


:Unmount
:: Unmount the Windows Image commiting changes.
Echo [+] Unmounting WIM Image...
If /I "%UnmountImage%" EQU "True" (
"%Dism%" /Unmount-WIM /Commit /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%"
)
Goto:EOF


:Rebuild
If /I "%Rebuild%" EQU "False" (Goto:EOF)

Echo+
Echo [+] Rebuilding WIM image...

("%ImageX%" /Compress Maximum /Export "%WindowsImage%" "*" "%TEMP%\Rebuilt Image.wim" /Check) && (
Del /Q /F "%WindowsImage%" 1>NUL
Move /Y "%TEMP%\Rebuilt Image.wim" "%WindowsImage%" 1>NUL
) || (
Echo [x] Error rebuilding Image "%WindowsImage%" to "%TEMP%\Rebuilt Image.wim".
)

Goto :EOF


:StartTimer
Set "StartingDate=%Date%"
Set "StarttingTime=%Time:~0,-3%"
Goto :EOF


:StopTimer
(
Echo Minutes = DateDiff^("n", "%StartingDate% %StarttingTime%", Now^)
Echo WScript.Echo Minutes ^& " Minutes"
)>"%TEMP%\%~n0 MinuteDiff.vbs"

For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 MinuteDiff.vbs"'
) Do (
Set "ElapsedTime=%%#"
)

Goto:EOF


:WriteConvertBytesScript
If Exist "%TEMP%\%~n0 Convert Bytes.vbs" (Goto:EOF)
(
Echo Suffix = Array^("Bytes", "KB", "MB", "GB", "TB"^)
Echo+
Echo Function Convert^(Bytes^)
Echo Convert = convert0^(Bytes, 0^)
Echo End Function
Echo+
Echo Function Convert0^(Bytes, Level^)
Echo If Bytes ^>= 1024 Then
Echo Bytes = Round^(Bytes / 1024, 2^)
Echo Level = Level + 1
Echo Convert0 = Convert0^(Bytes, Level^)
Echo End If
Echo Convert0 = Bytes ^& " " ^& Suffix^(Level^)
Echo End Function
Echo+
Echo WScript.Echo Convert^(WScript.Arguments^(0^)^)
)>"%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeBefore
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeBefore=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeBefore%"'
) Do (
Set "WIMSizeBefore=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeAfter
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeAfter=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeAfter%"'
) Do (
Set "WIMSizeAfter=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:ParsePackages

Set /A "PackagesRemovedCount=0"
Set /A "PackagesFailedCount=0"
Set /A "PackagesNotFoundCount=0"

:: Unhide packages and take registry ownership.
"%WIMRegistryTweakTool%" /p "%MountDir%"
Echo+

:: Remove Packages.
For /F "UseBackQ Tokens=* Delims=" %%# In ("%PackageList%") Do (

Echo [+] Removing package: %%~#

"%Dism%" /Remove-Package /PackageName:"%%~#" /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet 1>NUL
   Call Set /A "ExitCode=%%Errorlevel%%"

   (Call Echo "%%ExitCode%%"| Findstr.exe "^\"0\"$" 1>NUL 2>&1) && (
    Call Set /A "PackagesRemovedCount+=1"
   )

(Call Echo "%%ExitCode%%"| Findstr.exe "^\"5\"$" 1>NUL 2>&1) && (
Call Set /A "PackagesFailedCount+=1"
Echo Failed to remove package: %%~#>>"%LogFile%"
)

(Call Echo "%%ExitCode%%"| Find.exe "-2146498555" 1>NUL 2>&1) && (
Call Set /A "PackagesNotFoundCount+=1"
Echo Package is not installed: %%~#>>"%LogFile%"
)

)
Goto:EOF



REM ====================
REM File Error Controls:
REM ====================

:CheckErrors
:: WIM File Error-Check.
If /I "MountImage" EQU "True" If Not Exist "%WindowsImage%" (
Echo [x] Windows Image not found at: "%WindowsImage%" | MORE
Pause&Exit
)

:: PackageList File Error-Check.
If Not Exist "%PackageList%" (
Echo [x] PackageList not found at: "%PackageList%" | MORE
Pause&Exit
)

:: 'DISM.exe' File Error-Check.
If Not Exist "%DISM%" (
Echo [x] 'DISM' process not found at: "%DISM%" | MORE
Pause&Exit
)

:: 'ImageX.exe' File Error-Check.
If Not Exist "%ImageX%" (
Echo [x] 'ImageX' process not found at: "%ImageX%" | MORE
Pause&Exit
)

:: 'WIM Registry Tweak Tool.exe' File Error-Check.
If Not Exist "%WIMRegistryTweakTool%" (
Echo [x] 'WIM Registry Tweak Tool' process not found at: "%WIMRegistryTweakTool%" | MORE
Pause&Exit
)


Goto:EOF



Que lo disfruten! ...e intenten no joder Windows eliminando paquetes esenciales para el SO!






5.7
· Automatizar la desactivación de características

Todo lo necesario está incluido en este archivo comprimido:
http://www.mediafire.com/download/lq4sc56ri59klod/WIM_Feature_Uninstaller.rar


Una imagen de muestra:



Instrucciones:
Deben crear un archivo de texto con el nombre "Features.txt" y añadir los nombres de las características que que quieren deshabilitar, 1 nombre por cada linea.

Ejemplo:
Features.txt
DirectPlay
FaxServicesClientPackage
Internet-Explorer-Optional-amd64
Microsoft-Windows-MobilePC-LocationProvider-INF
MicrosoftWindowsPowerShellV2
MicrosoftWindowsPowerShellV2Root
Printing-Foundation-InternetPrinting-Client
Printing-XPSServices-Features
WindowsMediaPlayer
Xps-Foundation-Xps-Viewer



Seguídamente deben usar este Script que he desarrollado el cual se encarga de hacer todas las tareas necesarias.

Nota: Deben configurar los valores de las variables que están documentadas en la cabecera del código.

WIM Feature Uninstaller.cmd
Código (dos) [Seleccionar]
@Echo OFF



REM =================
REM Console Settings:
REM =================

Title WIM Feature Uninstaller - By Elektro
Mode Con Cols=150 Lines=50
CHCP 1252 1>NUL & REM Windows-1252, Spanish-Latin.



REM =====
REM Info:
REM =====

Echo+
Echo  -----------------------------------------------------------------------------
Echo  This script mounts a Windows Image ^(WIM^) and then disables Windows features
Echo  -----------------------------------------------------------------------------
Echo+



REM ====================
REM User defined values:
REM ====================

REM This value indicates whether the Windows Image should be mounted.
REM True  = 'DISM' will try to mount the 'WIM' image.
REM False = 'DISM' will not try to mount the WIM image.
REM Set this value to 'FALSE' if the 'WIM' image is already mounted in the specified mount directory,
REM Otherwise, keep it as 'TRUE'.
Set "MountImage=True"

REM This value indicates whether the Windows Image should be unmounted at the end.
REM True  = 'DISM' will try to unmount the 'WIM' image.
REM False = 'DISM' will not try to unmount the WIM image.
REM Set this value to 'FALSE' if you want to keep the image mounted to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "UnmountImage=True"

REM This value indicates whether the Windows Image should be rebuilt at the end.
REM True  = 'ImageX' will try to rebuild the 'WIM' image.
REM False = 'ImageX' will keep the 'WIM' image as is.
REM Set this value to 'FALSE' if you want to keep the image with normal size to make other changes,
REM Otherwise, keep it as 'TRUE'.
Set "Rebuild=True"

REM This value indicates the 'WIM' image to be mounted.
Set "WindowsImage=%UserProfile%\Desktop\win 8 .1\win\sources\install.wim"

REM This value indicates the Image Index of the 'WIM' image.
Set "ImageIndex=1"

REM This value indicates the directory where to mount the 'WIM' image.
Set "MountDir=%HomeDrive%\WinMount"

REM This value indicates the textfile that contains the names of the features to disable.
Set "FeatureList=%CD%\Features.txt"

REM This value indicates the ubication of 'ImageX.exe' file.
Set "ImageX=%CD%\Tools\Dism\ImageX.exe"

REM This value indicates the ubication of a custom 'DISM.exe' file if needed.
REM Default ubication: "%SystemRoot%\System32\Dism.exe"
Set "Dism=%CD%\Tools\Dism\Dism.exe"

REM This value indicates the ubication of the logfile that will record 'DISM' errors.
Set "DismLogfile=%CD%\%~n0 DISM.log"

REM This value indicates the logging-level of the 'DISM' process.
REM 1 = Errors only
REM 2 = Errors and warnings
REM 3 = Errors, warnings, and informational
REM 4 = All of the information listed previously, plus debug output
Set /A "DismLogLevel=2"

REM This value indicates the ubication of the logfile that will record Main information.
Set "Logfile=%CD%\%~n0.log"



REM =====
REM Main:
REM =====

:: Call Methods.
Call :CheckErrors
Call :CreateLogs
Call :CreateMountDir
Call :GetWIMSizeBefore
Call :StartTimer
Call :Mount
CLS
Call :ParseFeatures
CLS
Call :CleanUp
Call :Unmount
Call :Rebuild
Call :StopTimer
Call :GetWIMSizeAfter
Call :EndLog
Pause&Exit



REM ========
REM Methods:
REM ========


:CreateLogs

:: Create the 'DISM' logfile with 'ANSI' encoding,
:: this is necessary to record a non-default 'DISM' loglevel such as '1' or '2'.
Echo+ >"%DismLogfile%"


:: Create the Main logfile and record starting info on it.
Echo+ >"%Logfile%"
(
Echo+
Echo   WIM Feature Uninstaller
Echo ===========================
Echo   %DATE% ^| %TIME:~0,-3%
Echo /\/\/\/\/\/\/\/\/\/\/\/\/\/
Echo+
Echo [i] Mount Image?...: %MountImage%
Echo [i] Unmount Image?.: %UnmountImage%
Echo+
Echo [i] Windows Image..: %WindowsImage%
Echo [i] Image Index....: %ImageIndex%
Echo [i] Mount Directory: %MountDir%
Echo+
Echo [i] Dism Path......: %Dism%
Echo [i] Dism Log File..: %DismLogfile%
Echo [i] Dism Log Level.: %DismLogLevel%
Echo+
Echo [i] Feature List...: %FeatureList%
Echo [i] Log File.......: %Logfile%
Echo+
Echo ===========================
)>"%Logfile%"

:: Display starting log info.
Type "%Logfile%"

:: Continue writting log.
(
Echo+
Echo Feature conflicts:
Echo ==================
Echo+
)>>"%LogFile%"
Goto:EOF


:EndLog
(
Echo+
Echo [i] Done!
Echo [i] WIM Image Size Before.........: %WIMSizeBefore%
Echo [i] WIM Image Size After..........: %WIMSizeAfter%
Echo [i] Features Successfully Disabled: %FeaturesRemovedCount% Packages.
Echo [i] Features Failed To Disable....: %FeaturesFailedCount% Packages.
Echo [i] Features Not Found............: %FeaturesNotFoundCount% Packages.
Echo [i] Elapsed Time..................: %ElapsedTime%
Echo+
)>>"%LogFile%"

:: Display ending information.
CLS
Type "%LogFile%"
Goto:EOF


:CreateMountDir
:: Create the mount directory.
(
If Not Exist "%MountDir%" If /I "%MountImage%" EQU "True" (
MkDir "%MountDir%" 2>NUL
)
) || (
Echo+
Echo [x] Error trying to create the directory "%MountDir%" to mount the Windows Image.
Echo [i] Ensure that you have Admin rights to create the directory.
Echo [i] Ensure that the directory name does not contains illegal characters.
Echo+
Pause&Exit
)
Goto:EOF


:Mount
:: Mount the Windows Image into the directory.
Echo+
Echo [+] Mounting WIM Image...
If /I "%MountImage%" EQU "True" (

"%Dism%" /Mount-Image /ImageFile:"%WindowsImage%" /Index:"%ImageIndex%" /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" || (
Echo+
Echo [x] Error mounting the Image Index "%ImageIndex%" in "%MountDir%"
Echo [i] Ensure that the Image Index exist.
Echo [i] Ensure that you have Admin rights to write inside the directory.
Echo [i] Ensure that the directory is not already mounted.
Echo [i] Ensure that the directory is fully empty.
Echo+
REM Try to unmount the failed image and discard changes.
If /I "%UnmountImage%" EQU "True" (
Echo [+] Unmounting and discarding changes...
"%Dism%" /Unmount-WIM /Discard /MountDir:"%MountDir%"
)
Pause&Exit
)

)
Goto:EOF


:CleanUp
Echo [+] CleaningUp WIM Image...
"%Dism%" /CleanUp-Image /StartComponentCleanUp /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet
Echo+
Goto:EOF


:Unmount
:: Unmount the Windows Image commiting changes.
Echo [+] Unmounting WIM Image...
If /I "%UnmountImage%" EQU "True" (
"%Dism%" /Unmount-WIM /Commit /MountDir:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%"
)
Goto:EOF


:Rebuild
If /I "%Rebuild%" EQU "False" (Goto:EOF)

Echo+
Echo [+] Rebuilding WIM image...

("%ImageX%" /Compress Maximum /Export "%WindowsImage%" "*" "%TEMP%\Rebuilt Image.wim" /Check) && (
Del /Q /F "%WindowsImage%" 1>NUL
Move /Y "%TEMP%\Rebuilt Image.wim" "%WindowsImage%" 1>NUL
) || (
Echo [x] Error rebuilding Image "%WindowsImage%" to "%TEMP%\Rebuilt Image.wim".
)

Goto :EOF


:StartTimer
Set "StartingDate=%Date%"
Set "StarttingTime=%Time:~0,-3%"
Goto :EOF


:StopTimer
(
Echo Minutes = DateDiff^("n", "%StartingDate% %StarttingTime%", Now^)
Echo WScript.Echo Minutes ^& " Minutes"
)>"%TEMP%\%~n0 MinuteDiff.vbs"

For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 MinuteDiff.vbs"'
) Do (
Set "ElapsedTime=%%#"
)

Goto:EOF


:WriteConvertBytesScript
If Exist "%TEMP%\%~n0 Convert Bytes.vbs" (Goto:EOF)
(
Echo Suffix = Array^("Bytes", "KB", "MB", "GB", "TB"^)
Echo+
Echo Function Convert^(Bytes^)
Echo Convert = convert0^(Bytes, 0^)
Echo End Function
Echo+
Echo Function Convert0^(Bytes, Level^)
Echo If Bytes ^>= 1024 Then
Echo Bytes = Round^(Bytes / 1024, 2^)
Echo Level = Level + 1
Echo Convert0 = Convert0^(Bytes, Level^)
Echo End If
Echo Convert0 = Bytes ^& " " ^& Suffix^(Level^)
Echo End Function
Echo+
Echo WScript.Echo Convert^(WScript.Arguments^(0^)^)
)>"%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeBefore
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeBefore=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeBefore%"'
) Do (
Set "WIMSizeBefore=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:GetWIMSizeAfter
Call :WriteConvertBytesScript
For %%# in ("%WindowsImage%") Do (Set "WIMSizeAfter=%%~z#")
For /F "Tokens=*" %%# In (
'Cscript.exe /Nologo "%TEMP%\%~n0 Convert Bytes.vbs" "%WIMSizeAfter%"'
) Do (
Set "WIMSizeAfter=%%#"
)
Del /Q "%TEMP%\%~n0 Convert Bytes.vbs"
Goto:EOF


:ParseFeatures

Set /A "FeaturesRemovedCount=0"
Set /A "FeaturesFailedCount=0"
Set /A "FeaturesNotFoundCount=0"

:: Disable Features.
For /F "UseBackQ Tokens=* Delims=" %%# In ("%FeatureList%") Do (

Echo [+] Disabling Feature: %%~#

"%Dism%" /Disable-Feature /FeatureName:"%%~#" /Image:"%MountDir%" /English /LogPath:"%DismLogfile%" /LogLevel:"%DismLogLevel%" /Quiet 1>NUL
   Call Set /A "ExitCode=%%Errorlevel%%"

   (Call Echo "%%ExitCode%%"| Findstr.exe "^\"0\"$" 1>NUL 2>&1) && (
    Call Set /A "FeaturesRemovedCount+=1"
   )

(Call Echo "%%ExitCode%%"| Findstr.exe "^\"5\"$" 1>NUL 2>&1) && (
Call Set /A "FeaturesFailedCount+=1"
Echo Failed to disable feature: %%~#>>"%LogFile%"
)

(Call Echo "%%ExitCode%%"| Find.exe "-2146498548" 1>NUL 2>&1) && (
Call Set /A "FeaturesNotFoundCount+=1"
Echo Feature is not found.....: %%~#>>"%LogFile%"
)

)
Goto:EOF



REM ====================
REM File Error Controls:
REM ====================

:CheckErrors

:: WIM File Error-Check.
If /I "MountImage" EQU "True" If Not Exist "%WindowsImage%" (
Echo [x] Windows Image not found at: "%WindowsImage%" | MORE
Pause&Exit
)

:: FeatureList File Error-Check.
If Not Exist "%FeatureList%" (
Echo [x] FeatureList not found at: "%FeatureList%" | MORE
Pause&Exit
)

:: 'DISM.exe' File Error-Check.
If Not Exist "%DISM%" (
Echo [x] 'DISM' process not found at: "%DISM%" | MORE
Pause&Exit
)

:: 'ImageX.exe' File Error-Check.
If Not Exist "%ImageX%" (
Echo [x] 'ImageX' process not found at: "%ImageX%" | MORE
Pause&Exit
)

Goto:EOF








dato000

Caramba!! Sensacionales los dos scripts, fucking A!!!

Sin embargo aún no conozco a fondo los registros y caracteristicas de windows así que realmente no se cuales deberia quitar/remover/eliminar/borrar/desactivar/deshabiltar

Supongo que me tomare mi tiempo analizando lo bueno y lo malo, sin embargo, necesito hacer doble tarea, pues ya va siendo hora de actualizar un equipo, creo que le pondre windows 8.1, a lo que viene mi duda, no hay diferencia entre todas estas tareas para windows 8 y windows 8.1?? parece que tanto para windows 7-8-8.1 todo trabaja de una manera similar, pero siempre existen ligeras diferencias.

Ya esto leyendo el enlace, aunque es para windows 8 http://technet.microsoft.com/en-us/library/dn328991.aspx, el de windows 7 es: http://technet.microsoft.com/en-us/library/ff716257.aspx

Editado: Pues ummm mirando las caracteristicas, honestamente no se que deshabilitar, y mucho menos eliminar, además por el hecho de que este tipo de cosas pueden activarse/desactivarse a medida que se vayan necesitando, aunque yo veo muy necesario el uso de IIS, supongo que no es totalmente imperativo para todas las personas, pero aún así activar todos lo servicios relacionados con IIS es algo exagerado, por lo que debo continuar con el analisis, y otra cosa que queria decir es que me sorprende mucho el hecho de que en windows 7 venga solo el framwork .NET 3.0, pensaba que al menos traia el 3.5, pero veo que no es así, fue una gran sorpresa para mi por el hecho de que realmente es muy importante tener un pc actualizado para el uso de las herramientas estandar en un software de windows, esta es una de las causas, bueno, tal vez para muchos no sea la gran cosa, pero para mi fue toda una revelación.

Aguante Elektro, genial este tuto también!!!!