Microsoft Deployment Toolkit (MDT) es una utilidad para el despliegue de sistemas operativos Windows que se puede instalar en un servidor o en una estación de trabajo. Una de las ventajas de instalarlo en un servidor, por ejemplo Windows Server 2016, es la posibilidad de agregar Windows Deployment Services (WDS) para facilitar el despliegue remoto de los equipos.
En este post se documenta la instalación de la versión 8456 en una estación de trabajo Windows 10 x64. Antes de instalar MDT, es necesario instalar Windows Assessment and Deployment Kit (Windows ADK). En concreto se ha instalado la versión 1809 y su correspondiente add-on para WinPE (en una descargada separada desde esta versión).
Instalación de Windows ADK
- Ejecutar adksetup.exe:
- Instalar en C:\Program Files (x86)\Windows Kits\10
- No enviar datos de uso anónimos acerca de los Windows 10 Kits
- Aceptar la licencia del producto
- Seleccionar para instalar como mínimo los siguientes componentes:
- Deployment Tools (DISM, SIM, BCDBoot, etc.)
- Imaging and Configuration Designer (ICD)
- Configuration Designer
- User State Migration Tool (USMT)
- Instalar opcionalmente los siguientes componentes:
- Microsoft User Experience Virtualization (UE-V) Template
Instalación de WinPE add-on
- Ejecutar adkwinpesetup.exe
- Instalar en C:\Program Files (x86)\Windows Kits\10
- No enviar datos de uso anónimos acerca de los Windows 10 Kits
- Aceptar la licencia del producto
- Seleccionar para instalar el siguiente componente:
- Windows Preinstallation Environment (Windows PE)
Instalación de MDT
- Ejecutar MicrosoftDeploymentToolkit_x64.msi
- Setup Wizard -> Next
- Aceptar los términos de licencia
- Seleccionar para instalar todos los componentes:
- Microsoft Deployment Toolkit
- Documents
- Tools and Templates
- Instalar en C:\Program Files\Microsoft Deployment Toolkit
- No participar en el CEIP (Customer Experience Inprovement Program)
Creación del share
Antes de poder trabajar con MDT hay que realizar una mínima configuración inicial creando la carpeta compartida (Deployment Share) desde la que se desplegarán los sistemas operativos.
En este ejemplo, se creará la carpeta compartida en la unidad V:\
. Esta operación se puede realizar mediante la herramienta gráfica Deployment Workbench (.\Bin\DeploymentWorkbench.msc
):
- Deployment share path:
V:\MDT\DeploymentShare
- Share name: DeploymentShare$
- Deployment share description: MDT Deployment Share
- Options: por defecto (se pueden cambiar a posteriori modificando las reglas de la carpeta compartida)
O mediante el siguiente código en PowerShell:
New-Item -Path "V:\MDT\DeploymentShare" -ItemType directory
New-SmbShare -Name "DeploymentShare$" -Path "V:\MDT\DeploymentShare" -FullAccess Administrators
Import-Module "C:\Program Files\Microsoft Deployment Toolkit\Bin\MicrosoftDeploymentToolkit.psd1"
New-PSDrive -Name "DS001" -PSProvider "MDTProvider" -Root "V:\MDT\DeploymentShare" -Description "MDT Deployment Share" -NetworkPath "\\PCLYM\DeploymentShare$" -Verbose | Add-MDTPersistentDrive -Verbose
Opcionalmente, podría ser interesante modificar los ACLs de la carpeta para que no sean tan restrictivos, por ejemplo agregando una cuenta con permisos para escribir en la carpeta “Captures”:
$DeploymentShareDir = "V:\MDT\DeploymentShare"
icacls.exe $DeploymentShareDir /grant '"MDT_User":(OI)(CI)(RX)'
icacls.exe $DeploymentShareDir /grant '"Administrators":(OI)(CI)(F)'
icacls.exe $DeploymentShareDir /grant '"SYSTEM":(OI)(CI)(F)'
icacls.exe "$DeploymentShareDir\Captures" /grant '"MDT_User":(OI)(CI)(M)'
$DeploymentShare = "DeploymentShare$"
Grant-SmbShareAccess -Name $DeploymentShare -AccountName "EVERYONE" -AccessRight Change -Force
Revoke-SmbShareAccess -Name $DeploymentShare -AccountName "CREATOR OWNER" -Force
A partir de este momento se puede comenzar a utilizar MDT para:
- Importar los sistemas operativos que se quieren desplegar
- Agregar paquetes como actualizaciones o lenguajes (no es necesario si el SO ya los incluye porque se ha realizado offline servicing del mismo)
- Agregar aplicaciones que se instalarán después de desplegar el SO (por ejemplo, los runtime de Visual C++)
- Crear una secuencia de tareas (task sequence) con los pasos que se quieran realizar durante el despliegue
Importar sistemas operativos
Esta operación se puede realizar desde la interfaz gráfica, pero es mucho más rápido realizarla mediante un script en PowerShell. En el siguiente ejemplo, se importa un Windows Server 2016 actualizado mediante OSBuilder:
Import-Module "C:\Program Files\Microsoft Deployment Toolkit\Bin\MicrosoftDeploymentToolkit.psd1"
New-PSDrive -Name "DS001" -PSProvider MDTProvider -Root "V:\MDT\DeploymentShare"
Import-MDTOperatingSystem -Path "DS001:Operating Systems" -SourcePath "V:\OSBuilder\OSMedia\Windows Server 2016 Standard Desktop Experience x64 1607 14393.2791OS" -DestinationFolder "Windows Server 2016 Standard x64" -Verbose
Es recomendable renombrar los sistemas operativos que se importan con un nombre más corto. En este caso se renombrará a “Windows Server 2016 Standard x64”.
Crear secuencia de tareas
Se creará una secuencia de tareas con las siguientes características:
- Task sequence ID: WIN2016-X64-001
- Task sequence name: Windows Server 2016 x64
- Template: Standard Client Task Sequence
- Operating system: Windows Server 2016 Standard x64
- No especificar una clave de producto
- Nombre/Organización: LYM/LYM
- Internet Explorer home page: www.google.com
- No especificar el password
El código en PowerShell:
Import-Module "C:\Program Files\Microsoft Deployment Toolkit\Bin\MicrosoftDeploymentToolkit.psd1"
New-PSDrive -Name "DS001" -PSProvider MDTProvider -Root "V:\MDT\DeploymentShare"
Import-MDTTaskSequence -Path "DS001:Task Sequences" -Name "Windows Server 2016 x64" -Template "Client.xml" -Comments "" -ID "WIN2016-X64-001" -Version "1.0" -OperatingSystemPath "DS001:Operating Systems\Windows Server 2016 Standard x64" -FullName "LYM" -OrgName "LYM" -HomePage "www.google.com" -Verbose
En este momento se tendría que modificar la tarea para habilitar o deshabilitar fases, agregar pasos y acciones, etc.
Reglas del share
A continuación se configuran las reglas de la carpeta mediante la modificación de los ficheros Bootstrap.ini y CustomSettings.ini. Estos ficheros indicarán, por ejemplo, si es necesario capturar la imagen, realizar un sysprep o unir el equipo a un dominio. Se puede encontrar más información en la Toolkit Reference o en el listado de variables de una secuencia de tareas.
Bootstrap.ini
Es el primer fichero que se procesa al arrancar en Windows PE. Este fichero se puede dividir en tres secciones: Settings, Custom y Default. El contenido del fichero al crear la secuencia de tareas anterior es el siguiente:
[Settings]
Priority=Default
[Default]
DeployRoot=\\192.168.1.20\DeploymentShare$
Este fichero se puede utilizar para especificar información que permita distinguir a un cierto ordenador de otro (por ejemplo una dirección MAC), una red de otra (por ejemplo un gateway), etc. Las secciones de tipo custom se procesan en orden de aparición y la primera que concuerda es la que se aplica. La sección de valores por defecto se suele utilizar para todo aquello que es común a los diferentes despliegues.
Una posible modificación del fichero de configuración que permitiría cambiar la carpeta compartida en función de la puerta de enlace del equipo sería la siguiente:
[Settings]
Priority=DefaultGateway,MACAdress,Default
[DefaultGateway]
192.168.1.1=UnitedStatesHQ
192.168.2.1=SpainHQ
[UnitedStatesHQ]
DeployRoot=\\192.168.1.20\DeploymentShare$
[SpainHQ]
DeployRoot=\\192.168.2.20\DeploymentShare$
KeyboardLocalePE=es-ES
[00:11:22:AA:BB:CC]
OSDAdapterCount=1
OSDAdapter0EnableDHCP=FALSE
OSDAdapter0IPAddressList=192.168.2.101
OSDAdapter0SubnetMask=255.255.255.0
OSDAdapter0Gateways=192.168.2.1
OSDAdapter0DNSServerList=8.8.8.8
OSDAdapter0DNSSuffix=LYM.LOCAL
En la sección [Default] se suelen incluir las credenciales para autenticarse en la carpeta compartida (DeployRoot) especificada anteriormente. Además, se puede indicar que hay que saltarse la pantalla de bienvenida de BDD y comenzar con el siguiente script:
[Default]
SkipBDDWelcome=YES
KeyboardLocale=es-ES
UserID=MDT_User
UserPassword=P@ssw0rd
UserDomain=LYM.LOCAL
Siempre que se realiza un cambio en este fichero, es necesario actualizar la carpeta compartida de despliegue ya que este fichero se graba en la imagen de arranque de Windows PE.
CustomSettings.ini
Este script controla el orden en que se ejecutarán los scripts de MDT y asigna valores a las variables que permitirán hacer un despliegue LTI o ZTI. También tiene tres secciones: Settings, Custom y Default. El contenido del fichero al crear la secuencia de tareas descrita anteriormente es:
[Settings]
Priority=Default
Properties=MyCustomProperty
[Default]
OSInstall=Y
SkipCapture=NO
SkipAdminPassword=YES
SkipProductKey=YES
SkipComputerBackup=NO
SkipBitLocker=NO
La primera sección [Settings] es la encargada de asignar la prioridad de las secciones que están presentes en el fichero y el orden en que deben ser leídas. Las propiedades son variables que se pueden utilizar durante el despliegue:
[Settings]
Priority=Init,DefaultGateway,ClientType,Model,Default
Properties=MyCustomProperty;BIOSVersion;SMBIOSBIOSVersion;ProductVersion,ComputerSerialNumber
Se suele incluir una sección para inicializar variables (por ejemplo, obtener parte del número de serie para construir el nombre del equipo en el AD):
[Init]
ComputerSerialNumber=#Right("%SerialNumber%",7)#
DeploymentOU=OU=Deployment,OU=Computers
SitesOU=OU=Sites,DC=LYM,DC=LOCAL
[DefaultGateway]
192.168.1.1=LAX
192.168.2.1=BCN
[LAX]
Localidad=Los Angeles
MachineObjectOU=OU=%DeploymentOU%,OU=%Localidad%,OU=%SitesOU%
[BCN]
Localidad=Barcelona
MachineObjectOU=OU=%DeploymentOU%,OU=%Localidad%,OU=%SitesOU%
También se suele incluir la sección [ClientType] para realizar acciones diferentes según el tipo de cliente (servidor, estación de trabajo, etc.) obtenido mediante consultas WMI. También se puede especificar un modelo concreto de equipo al que se aplicará una determinada configuración:
[ClientType]
SubSection=Servidor-%IsServer%
[Servidor-True]
TaskSequenceID=WIN2016_X64
[Servidor-False]
Subsection=Cliente-%IsDesktop%
[Cliente-True]
TaskSequenceID=WIN10_X64
[Cliente-False]
Subsection=Portatil-%IsLaptop%
[Precision 7530]
DriverGroup001=Windows 10x64%Model%
DriverSelectionProfile=nothing
DeploymentType=NEWCOMPUTER
Se puede obtener el modelo de un equipo mediante la siguiente consulta en PowerShell: (Get-WmiObject -Class:Win32_ComputerSystem).Model.
La sección [Default] es la más importante ya que, habitualmente, se suelen incluir las opciones que se aplicarán a todos los despliegues. Por ejemplo, la variable _SMSTSORGNAME incluye la marca que se incluirá en todos los asistentes y diálogos de MDT, la variable OSDComputername será el nombre del equipo, etc.
[Default]
_SMSTSORGNAME=LYM: %OSDComputername%
OSInstall=Y
DoNotCreateExtraPartition=YES
TimeZoneName=Romance Standard Time
AdminPassword=P@ssw0rd
OSDComputername=%DefaultGateway%-%ComputerSerialNumber%
También se suele utilizar para añadir la información necesaria para unir el equipo al dominio:
;JoinWorkgroup=WORKGROUP
JoinDomain=LYM.LOCAL
DomainAdmin=Administrator
DomainAdminDomain=LYM.LOCAL
DomainAdminPassword=P@ssw0rd
MachineObjectOU=OU=Unknown Computers,OU=%SitesOU%
DomainErrorRecovery=AUTO
Administrators001=LYMUser
Otro ejemplo de fichero CustomSettings.ini más completo podría ser el siguiente. Un equipo “Dell Precision 7530”, en la red 192.168.2.0/24 con número de serie 12345678, acabaría llamándose LBCN1324567:
[Settings]
Priority=Default,ByModel,DefaultGateway,SetMacSettings
Properties=SiteCode,tSerialNum,OUContainer,OUSite,PCPrefix
[SetMacSettings]
OSDComputerName=%PCPrefix%%SiteCode%%tSerialNum%
MachineObjectOU=LDAP://%OUContainer%,%OUSite%,DC=contoso,DC=com
[ByModel]
Subsection=%Model%
[Precision 7530]
OSInstall=Y
PCPrefix=L
OUContainer=OU=Laptop,OU=Machines
tSerialNum=#Right("%SerialNumber%",7)#
[OptiPlex 7020]
OSInstall=Y
PCPrefix=D
OUContainer=OU=Desktop,OU=Machines
tSerialNum=#Right("%SerialNumber%",7)#
[VMWare Virtual Platform]
OSInstall=Y
PCPrefix=V
OUContainer=OU=Virtual,OU=Machines
tSerialNum=#Right(Replace(Replace(oEnvironment.Item("SerialNumber")," ",""),"-",""),7)#
[BCN]
SiteCode=BCN
OUSite=OU=Barcelona
TimeZoneName=Romance Standard Time
[DefaultGateway]
192.168.2.1=BCN
Configuración Windows PE
Finalmente se configuran las opciones de Windows PE para definir qué arquitectura tendrá la imagen de arranque (boot image), qué controladores se añadirán, etc.
Después de actualizar la carpeta compartida se puede proceder a desplegar el sistema operativo utilizando la imagen de arranque generada anteriormente en una VM o en una máquina física.
Import-Module "C:\Program Files\Microsoft Deployment Toolkit\Bin\MicrosoftDeploymentToolkit.psd1"
New-PSDrive -Name "DS001" -PSProvider MDTProvider -Root "V:\MDT\DeploymentShare"
Update-MDTDeploymentShare -path "DS001:" -Verbose
Pero eso queda para otro post ;-)