mirror of
https://github.com/rbalsleyMSFT/FFU.git
synced 2026-06-14 02:09:35 -06:00
Adds Prompt option to device naming mode
Introduces an explicit "Prompt" option for device naming to allow technicians to enter the device name during deployment. This replaces the implicit legacy behavior, providing clear UI controls and validation to ensure that Unattend.xml is copied, which is required for prompt-based naming. Relevant documentation is updated to reflect this new workflow capability.
This commit is contained in:
@@ -73,7 +73,7 @@ When set to $true, will copy the provisioning package from the $FFUDevelopmentPa
|
|||||||
When set to $true, will copy the $FFUDevelopmentPath\Unattend folder to the Deployment partition of the USB drive. Default is $false.
|
When set to $true, will copy the $FFUDevelopmentPath\Unattend folder to the Deployment partition of the USB drive. Default is $false.
|
||||||
|
|
||||||
.PARAMETER DeviceNamingMode
|
.PARAMETER DeviceNamingMode
|
||||||
Controls how device naming is handled when unattend content is copied to USB media or injected into the FFU. Supported values are Legacy, None, Template, and Prefixes.
|
Controls how device naming is handled when unattend content is copied to USB media or injected into the FFU. Supported values are Legacy, None, Prompt, Template, and Prefixes.
|
||||||
|
|
||||||
.PARAMETER DeviceNameTemplate
|
.PARAMETER DeviceNameTemplate
|
||||||
Sets the device name used when DeviceNamingMode is Template. Supports a static name or the %serial% token when CopyUnattend is used.
|
Sets the device name used when DeviceNamingMode is Template. Supports a static name or the %serial% token when CopyUnattend is used.
|
||||||
@@ -419,7 +419,7 @@ param(
|
|||||||
[bool]$AllowVHDXCaching,
|
[bool]$AllowVHDXCaching,
|
||||||
[bool]$CopyPPKG,
|
[bool]$CopyPPKG,
|
||||||
[bool]$CopyUnattend,
|
[bool]$CopyUnattend,
|
||||||
[ValidateSet('Legacy', 'None', 'Template', 'Prefixes')]
|
[ValidateSet('Legacy', 'None', 'Prompt', 'Template', 'Prefixes')]
|
||||||
[string]$DeviceNamingMode = 'Legacy',
|
[string]$DeviceNamingMode = 'Legacy',
|
||||||
[string]$DeviceNameTemplate,
|
[string]$DeviceNameTemplate,
|
||||||
[string[]]$DeviceNamePrefixes,
|
[string[]]$DeviceNamePrefixes,
|
||||||
@@ -557,7 +557,7 @@ function Save-StagedUnattendFile {
|
|||||||
[Parameter(Mandatory = $true)]
|
[Parameter(Mandatory = $true)]
|
||||||
[string]$DestinationPath,
|
[string]$DestinationPath,
|
||||||
[Parameter(Mandatory = $true)]
|
[Parameter(Mandatory = $true)]
|
||||||
[ValidateSet('Legacy', 'None', 'Template', 'Prefixes')]
|
[ValidateSet('Legacy', 'None', 'Prompt', 'Template', 'Prefixes')]
|
||||||
[string]$DeviceNamingMode,
|
[string]$DeviceNamingMode,
|
||||||
[string]$DeviceNameTemplate
|
[string]$DeviceNameTemplate
|
||||||
)
|
)
|
||||||
@@ -588,6 +588,9 @@ function Save-StagedUnattendFile {
|
|||||||
if ($DeviceNamingMode -eq 'None') {
|
if ($DeviceNamingMode -eq 'None') {
|
||||||
$computerNameComponent.ComputerName = '*'
|
$computerNameComponent.ComputerName = '*'
|
||||||
}
|
}
|
||||||
|
elseif ($DeviceNamingMode -eq 'Prompt') {
|
||||||
|
$computerNameComponent.ComputerName = 'MyComputer'
|
||||||
|
}
|
||||||
elseif ($DeviceNamingMode -eq 'Template') {
|
elseif ($DeviceNamingMode -eq 'Template') {
|
||||||
$computerNameComponent.ComputerName = $DeviceNameTemplate
|
$computerNameComponent.ComputerName = $DeviceNameTemplate
|
||||||
}
|
}
|
||||||
@@ -638,6 +641,11 @@ if ($DeviceNamingMode -eq 'Template') {
|
|||||||
throw 'The %serial% device name variable is only supported when CopyUnattend is used.'
|
throw 'The %serial% device name variable is only supported when CopyUnattend is used.'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
elseif ($DeviceNamingMode -eq 'Prompt') {
|
||||||
|
if (-not $CopyUnattend) {
|
||||||
|
throw 'DeviceNamingMode Prompt requires CopyUnattend. Prompt-based naming is not supported with InjectUnattend.'
|
||||||
|
}
|
||||||
|
}
|
||||||
elseif ($DeviceNamingMode -eq 'Prefixes') {
|
elseif ($DeviceNamingMode -eq 'Prefixes') {
|
||||||
if (-not $CopyUnattend) {
|
if (-not $CopyUnattend) {
|
||||||
throw 'DeviceNamingMode Prefixes requires CopyUnattend. Prefix-based naming is not supported with InjectUnattend.'
|
throw 'DeviceNamingMode Prefixes requires CopyUnattend. Prefix-based naming is not supported with InjectUnattend.'
|
||||||
@@ -4364,6 +4372,9 @@ Function New-DeploymentUSB {
|
|||||||
if ($DeviceNamingMode -eq 'None') {
|
if ($DeviceNamingMode -eq 'None') {
|
||||||
$computerNameComponent.ComputerName = '*'
|
$computerNameComponent.ComputerName = '*'
|
||||||
}
|
}
|
||||||
|
elseif ($DeviceNamingMode -eq 'Prompt') {
|
||||||
|
$computerNameComponent.ComputerName = 'MyComputer'
|
||||||
|
}
|
||||||
elseif ($DeviceNamingMode -eq 'Template') {
|
elseif ($DeviceNamingMode -eq 'Template') {
|
||||||
$computerNameComponent.ComputerName = $DeviceNameTemplate
|
$computerNameComponent.ComputerName = $DeviceNameTemplate
|
||||||
}
|
}
|
||||||
@@ -5706,10 +5717,10 @@ if ($CopyUnattend) {
|
|||||||
throw "-CopyUnattend is set to `$true, but the $UnattendFolder folder is missing a .XML file"
|
throw "-CopyUnattend is set to `$true, but the $UnattendFolder folder is missing a .XML file"
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($DeviceNamingMode -eq 'Prefixes') {
|
if ($DeviceNamingMode -in @('Prompt', 'Prefixes')) {
|
||||||
$unattendSourcePath = Get-UnattendSourcePath -UnattendFolder $UnattendFolder -WindowsArch $WindowsArch
|
$unattendSourcePath = Get-UnattendSourcePath -UnattendFolder $UnattendFolder -WindowsArch $WindowsArch
|
||||||
if (-not (Test-UnattendHasComputerNameElement -Path $unattendSourcePath)) {
|
if (-not (Test-UnattendHasComputerNameElement -Path $unattendSourcePath)) {
|
||||||
throw "DeviceNamingMode Prefixes requires a ComputerName element in $unattendSourcePath"
|
throw "DeviceNamingMode $DeviceNamingMode requires a ComputerName element in $unattendSourcePath"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -439,7 +439,15 @@ $script:uiState.Controls.btnRun.Add_Click({
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($config.DeviceNamingMode -eq 'Template') {
|
if ($config.DeviceNamingMode -eq 'Prompt') {
|
||||||
|
if (-not $config.CopyUnattend) {
|
||||||
|
[System.Windows.MessageBox]::Show("Select Copy Unattend.xml before using 'Prompt for Device Name'.", "Copy Unattend Required", "OK", "Warning") | Out-Null
|
||||||
|
$btnRun.IsEnabled = $true
|
||||||
|
$script:uiState.Controls.txtStatus.Text = "Build canceled: prompt naming requires Copy Unattend.xml."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif ($config.DeviceNamingMode -eq 'Template') {
|
||||||
if ([string]::IsNullOrWhiteSpace([string]$config.DeviceNameTemplate)) {
|
if ([string]::IsNullOrWhiteSpace([string]$config.DeviceNameTemplate)) {
|
||||||
[System.Windows.MessageBox]::Show("Specify a device name before using 'Specify Device Name'.", "Device Name Required", "OK", "Warning") | Out-Null
|
[System.Windows.MessageBox]::Show("Specify a device name before using 'Specify Device Name'.", "Device Name Required", "OK", "Warning") | Out-Null
|
||||||
$btnRun.IsEnabled = $true
|
$btnRun.IsEnabled = $true
|
||||||
|
|||||||
@@ -910,6 +910,7 @@
|
|||||||
<StackPanel Margin="0,8,0,0">
|
<StackPanel Margin="0,8,0,0">
|
||||||
<TextBlock Text="Choose how the device should be named when unattend is applied." Margin="0,0,0,12" TextWrapping="Wrap"/>
|
<TextBlock Text="Choose how the device should be named when unattend is applied." Margin="0,0,0,12" TextWrapping="Wrap"/>
|
||||||
<RadioButton x:Name="rbDeviceNamingNone" Content="No Device Name" GroupName="DeviceNamingMode" IsChecked="True" Margin="0,0,0,8" ToolTip="Apply unattend without setting a specific computer name."/>
|
<RadioButton x:Name="rbDeviceNamingNone" Content="No Device Name" GroupName="DeviceNamingMode" IsChecked="True" Margin="0,0,0,8" ToolTip="Apply unattend without setting a specific computer name."/>
|
||||||
|
<RadioButton x:Name="rbDeviceNamingPrompt" Content="Prompt for Device Name" GroupName="DeviceNamingMode" Margin="0,0,0,8" ToolTip="Prompt the technician to enter a device name during deployment. This option requires Copy Unattend.xml."/>
|
||||||
<RadioButton x:Name="rbDeviceNamingTemplate" Content="Specify Device Name" GroupName="DeviceNamingMode" Margin="0,0,0,8" ToolTip="Use a static device name or the %serial% variable when Copy Unattend.xml is selected."/>
|
<RadioButton x:Name="rbDeviceNamingTemplate" Content="Specify Device Name" GroupName="DeviceNamingMode" Margin="0,0,0,8" ToolTip="Use a static device name or the %serial% variable when Copy Unattend.xml is selected."/>
|
||||||
<StackPanel x:Name="deviceNameTemplatePanel" Margin="32,0,0,16" Visibility="Collapsed">
|
<StackPanel x:Name="deviceNameTemplatePanel" Margin="32,0,0,16" Visibility="Collapsed">
|
||||||
<TextBlock Text="Use static text, %serial%, or both together, for example Comp-%serial%." Margin="0,0,0,4" TextWrapping="Wrap"/>
|
<TextBlock Text="Use static text, %serial%, or both together, for example Comp-%serial%." Margin="0,0,0,4" TextWrapping="Wrap"/>
|
||||||
|
|||||||
@@ -472,7 +472,10 @@ function Update-UIFromConfig {
|
|||||||
if ($ConfigContent.PSObject.Properties.Name -contains 'DeviceNamingMode') {
|
if ($ConfigContent.PSObject.Properties.Name -contains 'DeviceNamingMode') {
|
||||||
$deviceNamingMode = [string]$ConfigContent.DeviceNamingMode
|
$deviceNamingMode = [string]$ConfigContent.DeviceNamingMode
|
||||||
}
|
}
|
||||||
if ($deviceNamingMode -notin @('None', 'Template', 'Prefixes')) {
|
if ($deviceNamingMode -eq 'Legacy') {
|
||||||
|
$deviceNamingMode = 'Prompt'
|
||||||
|
}
|
||||||
|
if ($deviceNamingMode -notin @('None', 'Prompt', 'Template', 'Prefixes')) {
|
||||||
$deviceNamingMode = 'None'
|
$deviceNamingMode = 'None'
|
||||||
}
|
}
|
||||||
Set-DeviceNamingMode -State $State -Mode $deviceNamingMode
|
Set-DeviceNamingMode -State $State -Mode $deviceNamingMode
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ function Update-VMNetworkingControls {
|
|||||||
function Get-SelectedDeviceNamingMode {
|
function Get-SelectedDeviceNamingMode {
|
||||||
param([PSCustomObject]$State)
|
param([PSCustomObject]$State)
|
||||||
|
|
||||||
|
if ($true -eq $State.Controls.rbDeviceNamingPrompt.IsChecked) {
|
||||||
|
return 'Prompt'
|
||||||
|
}
|
||||||
|
|
||||||
if ($true -eq $State.Controls.rbDeviceNamingTemplate.IsChecked) {
|
if ($true -eq $State.Controls.rbDeviceNamingTemplate.IsChecked) {
|
||||||
return 'Template'
|
return 'Template'
|
||||||
}
|
}
|
||||||
@@ -44,11 +48,12 @@ function Get-SelectedDeviceNamingMode {
|
|||||||
function Set-DeviceNamingMode {
|
function Set-DeviceNamingMode {
|
||||||
param(
|
param(
|
||||||
[PSCustomObject]$State,
|
[PSCustomObject]$State,
|
||||||
[ValidateSet('None', 'Template', 'Prefixes')]
|
[ValidateSet('None', 'Prompt', 'Template', 'Prefixes')]
|
||||||
[string]$Mode
|
[string]$Mode
|
||||||
)
|
)
|
||||||
|
|
||||||
$State.Controls.rbDeviceNamingNone.IsChecked = $Mode -eq 'None'
|
$State.Controls.rbDeviceNamingNone.IsChecked = $Mode -eq 'None'
|
||||||
|
$State.Controls.rbDeviceNamingPrompt.IsChecked = $Mode -eq 'Prompt'
|
||||||
$State.Controls.rbDeviceNamingTemplate.IsChecked = $Mode -eq 'Template'
|
$State.Controls.rbDeviceNamingTemplate.IsChecked = $Mode -eq 'Template'
|
||||||
$State.Controls.rbDeviceNamingPrefixes.IsChecked = $Mode -eq 'Prefixes'
|
$State.Controls.rbDeviceNamingPrefixes.IsChecked = $Mode -eq 'Prefixes'
|
||||||
}
|
}
|
||||||
@@ -132,9 +137,10 @@ function Update-UnattendSelectionControls {
|
|||||||
$isCopyUnattendSelected = $true -eq $State.Controls.chkCopyUnattend.IsChecked
|
$isCopyUnattendSelected = $true -eq $State.Controls.chkCopyUnattend.IsChecked
|
||||||
$isInjectUnattendSelected = $true -eq $State.Controls.chkInjectUnattend.IsChecked
|
$isInjectUnattendSelected = $true -eq $State.Controls.chkInjectUnattend.IsChecked
|
||||||
$deviceNameTemplateUsesSerialToken = Test-DeviceNameTemplateUsesSerialToken -State $State
|
$deviceNameTemplateUsesSerialToken = Test-DeviceNameTemplateUsesSerialToken -State $State
|
||||||
|
$requiresCopiedUnattend = ($selectedDeviceNamingMode -in @('Prompt', 'Prefixes')) -or $deviceNameTemplateUsesSerialToken
|
||||||
|
|
||||||
if ($isCopyUnattendSelected -and $isInjectUnattendSelected) {
|
if ($isCopyUnattendSelected -and $isInjectUnattendSelected) {
|
||||||
if (($selectedDeviceNamingMode -eq 'Prefixes') -or $deviceNameTemplateUsesSerialToken) {
|
if ($requiresCopiedUnattend) {
|
||||||
$State.Controls.chkInjectUnattend.IsChecked = $false
|
$State.Controls.chkInjectUnattend.IsChecked = $false
|
||||||
$isInjectUnattendSelected = $false
|
$isInjectUnattendSelected = $false
|
||||||
}
|
}
|
||||||
@@ -144,7 +150,7 @@ function Update-UnattendSelectionControls {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($selectedDeviceNamingMode -eq 'Prefixes') -or $deviceNameTemplateUsesSerialToken) {
|
if ($requiresCopiedUnattend) {
|
||||||
if (-not $isCopyUnattendSelected) {
|
if (-not $isCopyUnattendSelected) {
|
||||||
$State.Controls.chkCopyUnattend.IsChecked = $true
|
$State.Controls.chkCopyUnattend.IsChecked = $true
|
||||||
$isCopyUnattendSelected = $true
|
$isCopyUnattendSelected = $true
|
||||||
@@ -177,13 +183,14 @@ function Update-UnattendSelectionControls {
|
|||||||
function Update-DeviceNamingControls {
|
function Update-DeviceNamingControls {
|
||||||
param([PSCustomObject]$State)
|
param([PSCustomObject]$State)
|
||||||
|
|
||||||
if (($true -eq $State.Controls.chkInjectUnattend.IsChecked) -and ($true -eq $State.Controls.rbDeviceNamingPrefixes.IsChecked)) {
|
if (($true -eq $State.Controls.chkInjectUnattend.IsChecked) -and (($true -eq $State.Controls.rbDeviceNamingPrompt.IsChecked) -or ($true -eq $State.Controls.rbDeviceNamingPrefixes.IsChecked))) {
|
||||||
$State.Controls.rbDeviceNamingNone.IsChecked = $true
|
$State.Controls.rbDeviceNamingNone.IsChecked = $true
|
||||||
}
|
}
|
||||||
|
|
||||||
$selectedDeviceNamingMode = Get-SelectedDeviceNamingMode -State $State
|
$selectedDeviceNamingMode = Get-SelectedDeviceNamingMode -State $State
|
||||||
$State.Controls.deviceNameTemplatePanel.Visibility = if ($selectedDeviceNamingMode -eq 'Template') { 'Visible' } else { 'Collapsed' }
|
$State.Controls.deviceNameTemplatePanel.Visibility = if ($selectedDeviceNamingMode -eq 'Template') { 'Visible' } else { 'Collapsed' }
|
||||||
$State.Controls.deviceNamePrefixesPanel.Visibility = if ($selectedDeviceNamingMode -eq 'Prefixes') { 'Visible' } else { 'Collapsed' }
|
$State.Controls.deviceNamePrefixesPanel.Visibility = if ($selectedDeviceNamingMode -eq 'Prefixes') { 'Visible' } else { 'Collapsed' }
|
||||||
|
$State.Controls.rbDeviceNamingPrompt.IsEnabled = -not ($true -eq $State.Controls.chkInjectUnattend.IsChecked)
|
||||||
$State.Controls.rbDeviceNamingPrefixes.IsEnabled = -not ($true -eq $State.Controls.chkInjectUnattend.IsChecked)
|
$State.Controls.rbDeviceNamingPrefixes.IsEnabled = -not ($true -eq $State.Controls.chkInjectUnattend.IsChecked)
|
||||||
|
|
||||||
if ($selectedDeviceNamingMode -eq 'Prefixes') {
|
if ($selectedDeviceNamingMode -eq 'Prefixes') {
|
||||||
@@ -435,6 +442,11 @@ function Register-EventHandlers {
|
|||||||
$window = [System.Windows.Window]::GetWindow($eventSource)
|
$window = [System.Windows.Window]::GetWindow($eventSource)
|
||||||
Update-DeviceNamingControls -State $window.Tag
|
Update-DeviceNamingControls -State $window.Tag
|
||||||
})
|
})
|
||||||
|
$State.Controls.rbDeviceNamingPrompt.Add_Checked({
|
||||||
|
param($eventSource, $routedEventArgs)
|
||||||
|
$window = [System.Windows.Window]::GetWindow($eventSource)
|
||||||
|
Update-DeviceNamingControls -State $window.Tag
|
||||||
|
})
|
||||||
$State.Controls.rbDeviceNamingTemplate.Add_Checked({
|
$State.Controls.rbDeviceNamingTemplate.Add_Checked({
|
||||||
param($eventSource, $routedEventArgs)
|
param($eventSource, $routedEventArgs)
|
||||||
$window = [System.Windows.Window]::GetWindow($eventSource)
|
$window = [System.Windows.Window]::GetWindow($eventSource)
|
||||||
|
|||||||
@@ -221,6 +221,7 @@ function Initialize-UIControls {
|
|||||||
$State.Controls.chkCreateDeploymentMedia = $window.FindName('chkCreateDeploymentMedia')
|
$State.Controls.chkCreateDeploymentMedia = $window.FindName('chkCreateDeploymentMedia')
|
||||||
$State.Controls.chkInjectUnattend = $window.FindName('chkInjectUnattend')
|
$State.Controls.chkInjectUnattend = $window.FindName('chkInjectUnattend')
|
||||||
$State.Controls.rbDeviceNamingNone = $window.FindName('rbDeviceNamingNone')
|
$State.Controls.rbDeviceNamingNone = $window.FindName('rbDeviceNamingNone')
|
||||||
|
$State.Controls.rbDeviceNamingPrompt = $window.FindName('rbDeviceNamingPrompt')
|
||||||
$State.Controls.rbDeviceNamingTemplate = $window.FindName('rbDeviceNamingTemplate')
|
$State.Controls.rbDeviceNamingTemplate = $window.FindName('rbDeviceNamingTemplate')
|
||||||
$State.Controls.rbDeviceNamingPrefixes = $window.FindName('rbDeviceNamingPrefixes')
|
$State.Controls.rbDeviceNamingPrefixes = $window.FindName('rbDeviceNamingPrefixes')
|
||||||
$State.Controls.deviceNameTemplatePanel = $window.FindName('deviceNameTemplatePanel')
|
$State.Controls.deviceNameTemplatePanel = $window.FindName('deviceNameTemplatePanel')
|
||||||
|
|||||||
+13
-2
@@ -363,6 +363,17 @@ Use the **Device Naming** expander to decide whether `ComputerName` should be se
|
|||||||
|
|
||||||
This is the default option. The unattend file is still applied, but Windows generates a random computer name instead of forcing a prompt or a fixed name.
|
This is the default option. The unattend file is still applied, but Windows generates a random computer name instead of forcing a prompt or a fixed name.
|
||||||
|
|
||||||
|
The active `unattend_*.xml` files in `FFUDevelopment\Unattend` use `<ComputerName>*</ComputerName>` for this default behavior.
|
||||||
|
|
||||||
|
### Prompt for Device Name
|
||||||
|
|
||||||
|
Use this option when you want the technician to enter the computer name during deployment.
|
||||||
|
|
||||||
|
- This option requires **Copy Unattend.xml**.
|
||||||
|
- The source `unattend_*.xml` files can stay at `<ComputerName>*</ComputerName>`.
|
||||||
|
- During the build, FFU Builder rewrites only the staged deployment copy of `Unattend.xml` to the legacy prompt placeholder that `ApplyFFU.ps1` already recognizes.
|
||||||
|
- **Inject Unattend.xml** is not supported with this option.
|
||||||
|
|
||||||
### Specify Device Name
|
### Specify Device Name
|
||||||
|
|
||||||
Use this option when you want a static device name or a template such as `Comp-%serial%`.
|
Use this option when you want a static device name or a template such as `Comp-%serial%`.
|
||||||
@@ -399,9 +410,9 @@ Use **Prefixes File Path** to point the UI at the source text file for the prefi
|
|||||||
|
|
||||||
Use **Save Prefixes** to write the current multiline prefixes list back to the file specified in **Prefixes File Path**.
|
Use **Save Prefixes** to write the current multiline prefixes list back to the file specified in **Prefixes File Path**.
|
||||||
|
|
||||||
### Legacy Prompt Behavior
|
### Deployment Prompt Compatibility
|
||||||
|
|
||||||
Older deployment media that still has an unattend file with `ComputerName` set to the legacy placeholder value and no `prefixes.txt` file will still prompt for a device name during deployment.
|
Older deployment media that already has an unattend file with `ComputerName` set to the legacy placeholder value and no `prefixes.txt` file will still prompt for a device name during deployment.
|
||||||
|
|
||||||
{: .warning-title}
|
{: .warning-title}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ This table lists all top-level parameters in BuildFFUVM.ps1.
|
|||||||
| -CopyUnattend | bool | Copy Unattend.xml | When set to $true, will copy the $FFUDevelopmentPath\Unattend folder to the Deployment partition of the USB drive. Cannot be used together with -InjectUnattend. Default is $false. |
|
| -CopyUnattend | bool | Copy Unattend.xml | When set to $true, will copy the $FFUDevelopmentPath\Unattend folder to the Deployment partition of the USB drive. Cannot be used together with -InjectUnattend. Default is $false. |
|
||||||
| -CreateDeploymentMedia | bool | Create Deployment Media | When set to $true, this will create WinPE deployment media for use when deploying to a physical device. |
|
| -CreateDeploymentMedia | bool | Create Deployment Media | When set to $true, this will create WinPE deployment media for use when deploying to a physical device. |
|
||||||
| -CustomFFUNameTemplate | string | Custom FFU Name Template | Sets a custom FFU output name with placeholders. Allowed placeholders are: {WindowsRelease}, {WindowsVersion}, {SKU}, {BuildDate}, {yyyy}, {MM}, {dd}, {H}, {hh}, {mm}, {tt}. |
|
| -CustomFFUNameTemplate | string | Custom FFU Name Template | Sets a custom FFU output name with placeholders. Allowed placeholders are: {WindowsRelease}, {WindowsVersion}, {SKU}, {BuildDate}, {yyyy}, {MM}, {dd}, {H}, {hh}, {mm}, {tt}. |
|
||||||
| -DeviceNamingMode | string | Device Naming expander | Controls how device naming is handled when unattend content is copied to USB media or injected into the FFU. Accepted values are Legacy, None, Template, and Prefixes. The UI uses None, Template, and Prefixes. |
|
| -DeviceNamingMode | string | Device Naming expander | Controls how device naming is handled when unattend content is copied to USB media or injected into the FFU. Accepted values are Legacy, None, Prompt, Template, and Prefixes. The UI uses None, Prompt, Template, and Prefixes. Prompt rewrites the staged deployment unattend to the existing manual prompt placeholder and requires -CopyUnattend. |
|
||||||
| -DeviceNameTemplate | string | Specify Device Name | Sets the device name used when DeviceNamingMode is Template. Supports a static name or the %serial% token when -CopyUnattend is used. |
|
| -DeviceNameTemplate | string | Specify Device Name | Sets the device name used when DeviceNamingMode is Template. Supports a static name or the %serial% token when -CopyUnattend is used. |
|
||||||
| -DeviceNamePrefixesPath | string | Prefixes File Path | Path to the source prefixes file used for legacy copy or when -DeviceNamePrefixes is not supplied. Default is $FFUDevelopmentPath\Unattend\prefixes.txt. |
|
| -DeviceNamePrefixesPath | string | Prefixes File Path | Path to the source prefixes file used for legacy copy or when -DeviceNamePrefixes is not supplied. Default is $FFUDevelopmentPath\Unattend\prefixes.txt. |
|
||||||
| -DeviceNamePrefixes | string[] | Specify a list of Prefixes | Sets the prefixes used when DeviceNamingMode is Prefixes. Each entry becomes a line in prefixes.txt on the deployment media. |
|
| -DeviceNamePrefixes | string[] | Specify a list of Prefixes | Sets the prefixes used when DeviceNamingMode is Prefixes. Each entry becomes a line in prefixes.txt on the deployment media. |
|
||||||
|
|||||||
+6
-2
@@ -286,18 +286,22 @@ And the Unattend folder should have an unattend.xml file with the following cont
|
|||||||
<settings pass="specialize">
|
<settings pass="specialize">
|
||||||
<!--<ComputerName> must be in the first Component Element "Microsoft-Windows-Shell-Setup" . Do not change the order or remove it -->
|
<!--<ComputerName> must be in the first Component Element "Microsoft-Windows-Shell-Setup" . Do not change the order or remove it -->
|
||||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
<ComputerName>MyComputer</ComputerName>
|
<ComputerName>*</ComputerName>
|
||||||
</component>
|
</component>
|
||||||
<!--Place addtional Components Elements and settings below here. -->
|
<!--Place addtional Components Elements and settings below here. -->
|
||||||
</settings>
|
</settings>
|
||||||
</unattend>
|
</unattend>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Keep `*` if you want Windows to generate a random device name by default.
|
||||||
|
|
||||||
|
If you want the technician to be prompted for the device name during deployment, select **Prompt for Device Name** in the Build tab and enable **Copy Unattend.xml**. FFU Builder will rewrite only the staged deployment copy of `Unattend.xml` for that workflow.
|
||||||
|
|
||||||
Now you're ready to deploy the FFU to your device.
|
Now you're ready to deploy the FFU to your device.
|
||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
Deployment should be fairly straight forward: boot off the USB device, get prompted for a device name, and the deployment of the FFU and drivers should happen automatically.
|
Deployment should be fairly straight forward: boot off the USB device and the deployment of the FFU and drivers should happen automatically. If you selected **Prompt for Device Name** or another supported device naming option, that naming step will happen during deployment.
|
||||||
|
|
||||||
If you have any questions or run into any issues, [open a discussion in the Github repo](https://github.com/rbalsleyMSFT/FFU/discussions).
|
If you have any questions or run into any issues, [open a discussion in the Github repo](https://github.com/rbalsleyMSFT/FFU/discussions).
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user