A Beginner’s Guide to Windows Domain Join using Workspace ONE UEM

Last Updated: June 17, 2026

  1. What region is the device in?
  2. What keyboard layout do you prefer?
  3. Do you need a second keyboard?
  4. Is this your computer or your company computer?
  5. What Wifi network do you want to join?
  6. What Microsoft account will you sign in with?
  7. What user account do you want to create?
  8. What’s your super memorable password?
  9. What three questions do you want me to ask you when you forget your super memorable password? What are the answers to the three questions?
  10. Do you want to use Cortana?
  11. Do you want to buy Microsoft Office?
  12. Do you want to store all your data in OneDrive?
  13. Is your device primarily used for gaming?

This method does NOT support Microsoft EntraID join. If your Windows device needs to join Microsoft EntraID this method can NOT be used. Instead consider Microsoft AutoPilot or Omnissa Drop-Ship Provisioning OFFLINE covered in the next section.

The remainder of this section goes into detail on how Dell implemented the solution as part of their OEM offering. The purpose is to show Omnissa Administrators how they can re-create this flow in their own environment.

In the UEM Console this configuration is found by navigating to Devices > LifeCycle > Drop Ship Provisioning.

  • Only available for brand new computers
  • Only available when ordered from Dell Direct (no 3rd party hardware purchases)
  • Only available through Dell’s Tech Direct Portal
  • Only available in the USA
The DSP Online provisioning process starts with Dell manufacturing the computer in their factory where Windows Professional is installed on the device. This install does not include any of Dell’s bloatware that is found in their consumer computer process, it’s a vanilla Windows Professional install.

During this install the computer has no access to the Internet. Post OS Install, the computer is rebooted into Microsoft Audit Mode and Dell applies a customer generic (but Workspace ONE UEM specific) .PPKG file and unattend.xml file.

In the UEM Console this option is configured from Devices > Staging > Desktop Staging.

In all of these tools there is some form of automated boot process usually based on PXE. The computer boots into PXE, receives Windows PE, then either launches what amounts to glorified copy-and-paste job, or they download and run through the Windows OS installation process. The end result is usually a duplicate of the source computer where the OS, the apps, and any other configuration items are now replicated to the new device.

The argument for continuing to Image a computer is based on time of completion. It’s faster. Most of the time. To copy-and-paste (over simplified, but true) an entire OS + Apps + configuration is often much faster than downloading an OS, installing the OS, then downloading and installing all the apps, then waiting for app configuration. Speeds and times vary and modern hardware with SSD and/or NVME make this less of a problem today but as a general rule of thumb

As Imaging is not a solution provided by Workspace ONE UEM no further details about this method will be discussed as part of this blog.

With the exception of Imaging, none of the methods discussed above install the OS or prep the OS for what is required to use each method. For testing and demonstration purposes I’ve found using a USB-Key to be the most effective method to try out each method. What follows is the process I follow each time Microsoft release’s a new version of Windows.

To get started grab a USB key with at least 32GB of space available. It will be ERASED as part of this process.

Download the latest ISO from Microsoft for the Windows 11 installation media you plan to use. In all of the scenarios above it is expected that your OS is the Professional Edition. You can upgrade to the Enterprise SKU as part of the provisioning task, but the base OS is always recommended to be Windows Professional Edition.

From a Windows 11 computer, MOUNT the Windows ISO. Insert the USB Key. Run the following Powershell script. The end result will be a bootable USB Key that will silently install the Windows OS to the device.

Here is the script, save it as createmedia.ps1

# Windows 10/11 USB Media Creator Last updated 06/17/2026
# Results:
# - Single FAT32 USB partition
# - Split install.wim into install.swm files
# - Recovery partition increased to 1024 MB
# - InstallTo = Disk <target> Partition 4

$ErrorActionPreference = "Stop"

function Test-IsAdmin {
    $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
    $principal = [Security.Principal.WindowsPrincipal]::new($identity)
    return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}

function New-AutounattendXml {
    param (
        [Parameter(Mandatory)]
        [string]$OutputPath,

        [Parameter(Mandatory)]
        [int]$ImageIndex,

        [Parameter(Mandatory)]
        [int]$TargetDiskId
    )

$xmlContent = @"
<?xml version='1.0' encoding='utf-8'?>

<!-- This XML is for EFI partitioning only -->

<unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">

  <settings pass="windowsPE">

    <component name="Microsoft-Windows-Setup" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" processorArchitecture="amd64">

      <UserData>
        <AcceptEula>true</AcceptEula>
      </UserData>

      <DiskConfiguration>

        <Disk wcm:action="add">
          <DiskID>$TargetDiskId</DiskID>
          <WillWipeDisk>true</WillWipeDisk>

          <CreatePartitions>

            <!-- Recovery partition -->
            <CreatePartition wcm:action="add">
              <Order>1</Order>
              <Type>Primary</Type>
              <Size>1024</Size>
            </CreatePartition>

            <!-- EFI system partition ESP -->
            <CreatePartition wcm:action="add">
              <Order>2</Order>
              <Type>EFI</Type>
              <Size>100</Size>
            </CreatePartition>

            <!-- Microsoft reserved partition MSR -->
            <CreatePartition wcm:action="add">
              <Order>3</Order>
              <Type>MSR</Type>
              <Size>128</Size>
            </CreatePartition>

            <!-- Windows partition -->
            <CreatePartition wcm:action="add">
              <Order>4</Order>
              <Type>Primary</Type>
              <Extend>true</Extend>
            </CreatePartition>

          </CreatePartitions>

          <ModifyPartitions>

            <!-- Recovery partition -->
            <ModifyPartition wcm:action="add">
              <Order>1</Order>
              <PartitionID>1</PartitionID>
              <Label>Recovery</Label>
              <Format>NTFS</Format>
              <TypeID>de94bba4-06d1-4d40-a16a-bfd50179d6ac</TypeID>
            </ModifyPartition>

            <!-- EFI system partition ESP -->
            <ModifyPartition wcm:action="add">
              <Order>2</Order>
              <PartitionID>2</PartitionID>
              <Label>System</Label>
              <Format>FAT32</Format>
            </ModifyPartition>

            <!-- MSR partition does not need to be modified -->

            <!-- Windows partition -->
            <ModifyPartition wcm:action="add">
              <Order>3</Order>
              <PartitionID>4</PartitionID>
              <Label>Windows</Label>
              <Format>NTFS</Format>
            </ModifyPartition>

          </ModifyPartitions>

        </Disk>

        <WillShowUI>OnError</WillShowUI>

      </DiskConfiguration>

      <ComplianceCheck>
        <DisplayReport>OnError</DisplayReport>
      </ComplianceCheck>

      <ImageInstall>
        <OSImage>

          <InstallFrom>
            <MetaData wcm:action="add">
              <Key>/IMAGE/INDEX</Key>
              <Value>$ImageIndex</Value>
            </MetaData>
          </InstallFrom>

          <InstallTo>
            <DiskID>$TargetDiskId</DiskID>
            <PartitionID>4</PartitionID>
          </InstallTo>

          <WillShowUI>OnError</WillShowUI>
          <InstallToAvailablePartition>false</InstallToAvailablePartition>

        </OSImage>
      </ImageInstall>

    </component>

    <component name="Microsoft-Windows-International-Core-WinPE" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" processorArchitecture="amd64">
      <InputLocale>en-us</InputLocale>
      <SystemLocale>en-us</SystemLocale>
      <UILanguage>en-us</UILanguage>
      <UserLocale>en-us</UserLocale>
    </component>

  </settings>

</unattend>
"@

    Set-Content -Path $OutputPath -Value $xmlContent -Encoding UTF8 -Force
}

if (-not (Test-IsAdmin)) {
    $psExe = (Get-Process -Id $PID).Path
    Start-Process -FilePath $psExe -ArgumentList "-ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
    exit
}

Write-Host "================================================================================="
Write-Host "======================= Windows 10/11 USB Media Creator ========================="
Write-Host "============= Single FAT32 / Split WIM / VMware XML Structure ==================="
Write-Host "=================================================================================`n"

Pause

Write-Host "Scanning for mounted ISO..." -ForegroundColor Yellow

$ISO = Get-Volume |
    Where-Object { $_.DriveType -eq "CD-ROM" -and $_.OperationalStatus -eq "OK" -and $_.Size -gt 0 } |
    Select-Object -First 1

if ($ISO) {
    $isoletter = "$($ISO.DriveLetter):"
    Write-Host "Mounted ISO found."
    Write-Host "Drive letter: $isoletter"
    Write-Host "Friendly Name: $($ISO.FileSystemLabel)"
    Write-Host "Is this correct? (y/n)" -ForegroundColor Yellow
    $confirmation = Read-Host
    if ($confirmation -ne 'y') { exit }
}
else {
    Write-Host "Mounted ISO not found. Enter the mounted ISO drive letter. Example: G:" -ForegroundColor Yellow
    $manualIso = Read-Host
    $manualIso = $manualIso.TrimEnd('\')

    if ($manualIso -notmatch '^[A-Za-z]:$') {
        throw "Invalid ISO drive format. Use a format like G:"
    }

    $isoletter = $manualIso
}

$sourcesPath = Join-Path $isoletter "sources"
$sourceInstallWim = Join-Path $sourcesPath "install.wim"
$sourceInstallEsd = Join-Path $sourcesPath "install.esd"

if (Test-Path $sourceInstallWim) {
    $installImagePath = $sourceInstallWim
    $installImageType = "WIM"
}
elseif (Test-Path $sourceInstallEsd) {
    $installImagePath = $sourceInstallEsd
    $installImageType = "ESD"
}
else {
    throw "Could not find install.wim or install.esd in $sourcesPath"
}

Write-Host "Detected Windows image: $installImagePath" -ForegroundColor Yellow

Write-Host "Detecting USB drives..." -ForegroundColor Yellow

Get-Disk |
    Where-Object { $_.BusType -eq 'USB' } |
    Select-Object Number, FriendlyName, Model, PartitionStyle, @{ Name = "TotalSizeGB"; Expression = { "{0:N2}" -f ($_.Size / 1GB) } } |
    Out-Host

Write-Host "Enter the USB drive number to format. Example: 2" -ForegroundColor Yellow
$drivenumber = Read-Host

while ($drivenumber -eq "0") {
    Write-Host "You selected drive 0, which is generally the internal disk. Select a USB drive." -ForegroundColor Red
    $drivenumber = Read-Host
}

$selectedDisk = Get-Disk -Number $drivenumber -ErrorAction Stop

if ($selectedDisk.BusType -ne 'USB') {
    throw "Selected disk $drivenumber is not detected as USB. Aborting."
}

Write-Host "You selected the following USB drive to format:"
Write-Host "This drive will be completely erased." -ForegroundColor Red

$selectedDisk |
    Select-Object Number, FriendlyName, Model, PartitionStyle, @{ Name = "TotalSizeGB"; Expression = { "{0:N2}" -f ($_.Size / 1GB) } } |
    Out-Host

Write-Host "Is this correct? (y/n)" -ForegroundColor Yellow
$confirmation = Read-Host
if ($confirmation -ne 'y') { exit }

Write-Host "Would you like to generate autounattend.xml for zero-touch install? (y/n)" -ForegroundColor Yellow
$addAutounattend = Read-Host

$targetInstallDiskNumber = 0

if ($addAutounattend -eq 'y') {
    Write-Host ""
    Write-Host "Enter the TARGET INSTALL disk number Windows Setup should wipe and install to." -ForegroundColor Yellow
    Write-Host "Most physical machines use Disk 0, but verify this on multi-disk systems." -ForegroundColor Red
    Write-Host "Press Enter to use 0." -ForegroundColor Yellow

    $targetInstallDiskNumber = Read-Host

    if ([string]::IsNullOrWhiteSpace($targetInstallDiskNumber)) {
        $targetInstallDiskNumber = 0
    }

    if ($targetInstallDiskNumber -notmatch '^\d+$') {
        throw "Invalid target install disk number."
    }
}

Write-Host "Formatting USB drive as single FAT32 partition..." -ForegroundColor Yellow

Clear-Disk -Number $drivenumber -RemoveData -RemoveOEM -Confirm:$false

Start-Sleep -Seconds 2

$disk = Get-Disk -Number $drivenumber -ErrorAction Stop

if ($disk.PartitionStyle -eq 'RAW') {
    Initialize-Disk -Number $drivenumber -PartitionStyle MBR
}

$partition = New-Partition `
    -DiskNumber $drivenumber `
    -Size 32GB `
    -IsActive `
    -AssignDriveLetter

Format-Volume `
    -Partition $partition `
    -FileSystem FAT32 `
    -NewFileSystemLabel "WINSETUP" `
    -Confirm:$false `
    -Force

Start-Sleep -Seconds 3

$partition = Get-Partition `
    -DiskNumber $drivenumber `
    -PartitionNumber $partition.PartitionNumber

if (-not $partition.DriveLetter) {
    $availableLetter = ([char[]](68..90) | Where-Object {
        -not (Get-Volume -DriveLetter $_ -ErrorAction SilentlyContinue)
    } | Select-Object -First 1)

    if (-not $availableLetter) {
        throw "No available drive letter could be assigned to the USB partition."
    }

    Set-Partition `
        -DiskNumber $drivenumber `
        -PartitionNumber $partition.PartitionNumber `
        -NewDriveLetter $availableLetter

    Start-Sleep -Seconds 2

    $partition = Get-Partition `
        -DiskNumber $drivenumber `
        -PartitionNumber $partition.PartitionNumber
}

$USB_Boot = "$($partition.DriveLetter):"

if (-not (Test-Path $USB_Boot)) {
    throw "Could not access USB partition at $USB_Boot after formatting."
}

Write-Host "USB partition detected at $USB_Boot" -ForegroundColor Green

Write-Host "Copying Windows setup files to USB..." -ForegroundColor Yellow

robocopy $isoletter $USB_Boot /mir /xf install.wim install.esd /xd "System Volume Information" '$Recycle.Bin' /njh /njs

$usbSources = Join-Path $USB_Boot "sources"

if (-not (Test-Path $usbSources)) {
    throw "USB sources folder was not created."
}

if ($installImageType -eq "WIM") {
    Write-Host "Splitting install.wim into local temp folder..." -ForegroundColor Yellow

    $splitTemp = Join-Path $env:TEMP "WinSetupSplitWim"

    if (Test-Path $splitTemp) {
        Remove-Item $splitTemp -Recurse -Force
    }

    New-Item -Path $splitTemp -ItemType Directory -Force | Out-Null

    $tempSwmPath = Join-Path $splitTemp "install.swm"

    $dismArgs = @(
        "/Split-Image",
        "/ImageFile:$sourceInstallWim",
        "/SWMFile:$tempSwmPath",
        "/FileSize:3800",
        "/CheckIntegrity"
    )

    $process = Start-Process `
        -FilePath dism.exe `
        -ArgumentList $dismArgs `
        -Wait `
        -PassThru `
        -NoNewWindow

    if ($process.ExitCode -ne 0) {
        throw "DISM failed to split install.wim. Exit code: $($process.ExitCode)"
    }

    Write-Host "Copying split install.swm files to USB..." -ForegroundColor Yellow

    Copy-Item `
        -Path (Join-Path $splitTemp "install*.swm") `
        -Destination $usbSources `
        -Force

    if (-not (Test-Path (Join-Path $usbSources "install.swm"))) {
        throw "install.wim split failed. install.swm was not copied to USB."
    }

    Remove-Item $splitTemp -Recurse -Force

    Write-Host "install.wim split and copied successfully." -ForegroundColor Green
}
elseif ($installImageType -eq "ESD") {
    $esdInfo = Get-Item $sourceInstallEsd

    if ($esdInfo.Length -gt 3.8GB) {
        throw "install.esd is larger than FAT32 can safely support. Use media with install.wim or convert the ESD first."
    }

    Write-Host "Copying install.esd..." -ForegroundColor Yellow

    Copy-Item `
        -Path $sourceInstallEsd `
        -Destination (Join-Path $usbSources "install.esd") `
        -Force
}

$eiCfgPath = Join-Path $usbSources "ei.cfg"
Remove-Item $eiCfgPath -Force -ErrorAction SilentlyContinue
Set-Content -Path $eiCfgPath -Value "[CHANNEL]`r`nRetail" -Force

if ($addAutounattend -eq 'y') {
    Write-Host "Getting Windows image information..." -ForegroundColor Yellow

    $ISO_Image = Get-WindowsImage -ImagePath $installImagePath
    $ISO_Image | Out-Host

    Write-Host "Enter the image index number of the Windows edition to install." -ForegroundColor Yellow
    [string]$index = Read-Host

    $selectedImage = $ISO_Image | Where-Object { $_.ImageIndex -eq [int]$index }

    if (-not $selectedImage) {
        throw "Invalid image index selected: $index"
    }

    $autounattendPath = Join-Path $USB_Boot "autounattend.xml"

    New-AutounattendXml `
        -OutputPath $autounattendPath `
        -ImageIndex ([int]$index) `
        -TargetDiskId ([int]$targetInstallDiskNumber)

    Write-Host "Generated autounattend.xml at $autounattendPath" -ForegroundColor Yellow
    Write-Host "OS Image Index set to $index - $($selectedImage.ImageName)" -ForegroundColor Yellow
    Write-Host "Target install disk set to Disk $targetInstallDiskNumber" -ForegroundColor Yellow
}

Write-Host ""
Write-Host "USB media creation complete." -ForegroundColor Green

Pause

The next step is to boot the target computer from the USB-Key where the Windows OS will silently install.

Let the Windows OS setup complete the initial round of installation tasks including several reboots.

When OOBE launches, indicated with the question:

“Is this the right country or region?”

unplug the Ethernet Cable and/or disconnect the device from Wifi. This is because the DSP Online and Offline process will fail if the device has internet connectivity. Leave it connected if you are going to register the device with Microsoft AutoPilot.

Press Ctrl_Shift_F3 to reboot the device in Windows audit-mode. The machine will auto login to Audit Mode as the built-in administrator account.

What happens next is hardware dependent.

Right-click on the Windows Start menu and launch Device Manager.

If there are any missing drivers install those drivers before continuing. If you are using Dell hardware, checkout my blog on how to grab the drivers https://aftersixcomputers.com/using-dell-driver-packs-with-workspace-one-factory-provisioning/ – at a minium you want to ensure chipset, wifi, and or NIC drivers are installed.

The OS is now ready to do AutoPilot registration, or DSP Online, or DSP Offline.

1 thought on “A Beginner’s Guide to Windows Domain Join using Workspace ONE UEM

Leave a Reply