{% extends "base.html" %} {% import '_ui.html' as ui %} {% block title %}{{ friendly_name }} - Unattend{% endblock %} {# Unattend tab. Rows carry data-orig = their index in the file as parsed, so a save can tell an edited or moved item from a new one (services/unattend.py, "Form edits"). All behaviour is in static/unattend-editor.js; class names are una-* so the old handlers in static/app.js never fire here. Command rows keep Move up / Move down / Remove (.una-up .una-down .una-remove) in their "..." menu; the save bar (Review changes, #unaReview) shows once something is edited. #} {% block extra_head %} {% endblock %} {% macro note(item) -%} {% if item.note %}
{{ item.note | join(' | ') }}
{% endif %} {%- endmacro %} {% macro row_menu(label) -%} {% call ui.more(label) %}
{% endcall %} {%- endmacro %} {% macro cmd_row(cmd, idx, field, limit) -%}
{{ idx + 1 }}
{{ note(cmd) }}
Order {{ cmd.order or '?' }}
{% if cmd.inner_note %} {{ cmd.inner_note | join(' | ') | truncate(160) }}{% endif %}
{{ row_menu('command ' ~ (idx + 1)) }}
{%- endmacro %} {% block content %} {% set header_subtitle = 'Deploy/FlatUnattendW10.xml' %} {% set header_actions %} {% if last_save %}
{% else %} Undo last save: nothing saved from this page yet {% endif %} {% endset %} {% include "_image_header.html" %}
{% if unattend_override %}
{{ unattend_override }} exists in this image. PESetup loads that file first, so edits to Deploy/FlatUnattendW10.xml here do not reach the PCs until it is removed.
{% endif %} {% if not file_exists %}
This image has no Deploy/FlatUnattendW10.xml yet. The form starts from an empty answer file; saving creates it.
{% endif %} {% set lint_errors = lint | selectattr('level', 'equalto', 'ERROR') | list %}
{% if file_exists %} Modified {{ file_mtime | local_dt }} {{ file_size | filesizeformat }} {{ backup_count }} backup{{ '' if backup_count == 1 else 's' }} {% endif %} {% if not lint %} Lint clean {% elif lint_errors %} {{ lint_errors | length }} lint error{{ '' if lint_errors | length == 1 else 's' }} {% else %} {% endif %}
{% if lint %}
The file as it is now: checks from scripts/lint-unattend.py. {% if lint_errors %}One ERROR invalidates the whole answer file for its pass; fix it before imaging.{% endif %}
    {% for f in lint %}
  • {{ ui.chip(f.level, 'err' if f.level == 'ERROR' else 'warn') }}{{ f.message }}
  • {% endfor %}
{% endif %}

System and regional

Machine settings

specialize pass, Microsoft-Windows-Shell-Setup
PESetup replaces %serialnumber%; * lets Windows pick a name.

International

oobeSystem pass, Microsoft-Windows-International-Core
{% for key, label in [("input_locale", "Input locale"), ("system_locale", "System locale"), ("ui_language", "UI language"), ("user_locale", "User locale")] %}
{% endfor %}

Driver paths

{{ data.driver_paths | length }}
Folders DISM searches for drivers while servicing the applied image (offlineServicing pass). W:\Drivers is where PESetup unpacks this model's driver pack.
{% for dp in data.driver_paths %}
{{ loop.index }}
{% endfor %}
No driver paths. Windows only uses the drivers in the image.

Accounts and sign-in

User accounts (local)

{{ data.user_accounts | length }}
{% for acct in data.user_accounts %}
{{ loop.index }}
{% endfor %}
No local accounts.
Passwords sit in the answer file as plain text. Treat this file as sensitive.

AutoLogon

clear the user name to remove AutoLogon

Out-of-box experience (OOBE)

OOBE settings

"Not set" = not in the file (Windows default)
{% set oobe_fields = [ ("HideEULAPage", "Hide EULA page", ["true", "false"]), ("HideOEMRegistrationScreen", "Hide OEM registration screen", ["true", "false"]), ("HideOnlineAccountScreens", "Hide online account screens", ["true", "false"]), ("HideWirelessSetupInOOBE", "Hide wireless setup", ["true", "false"]), ("HideLocalAccountScreen", "Hide local account screen", ["true", "false"]), ("SkipUserOOBE", "Skip user OOBE", ["true", "false"]), ("SkipMachineOOBE", "Skip machine OOBE", ["true", "false"]), ("NetworkLocation", "Network location", ["Home", "Work", "Other"]), ("ProtectYourPC", "ProtectYourPC", ["1", "2", "3"]), ] %} {% set oobe_hints = {"ProtectYourPC1": " (recommended)", "ProtectYourPC2": " (updates only)", "ProtectYourPC3": " (skip)"} %} {% for key, label, opts in oobe_fields %}
{% endfor %}

OOBE time zone

oobeSystem pass; separate from the specialize time zone above

Setup commands

Order matters. Each list runs top to bottom as a tested sequence.

Reorder with Move up and Move down in a command's menu, or by dragging its handle. Comments shown in italics are XML comments from the file; they move with the command below them. Limits (one over invalidates the whole pass): specialize command {{ limits.path }} characters, first logon command {{ limits.commandline }}, description {{ limits.description }}.

Specialize commands

{{ data.specialize_commands | length }}
RunSynchronous: run as SYSTEM during the specialize pass, before anyone signs in.
{% for cmd in data.specialize_commands %}{{ cmd_row(cmd, loop.index0, 'path', limits.path) }}{% endfor %}
No specialize commands.

First logon commands

{{ data.firstlogon_commands | length }}
FirstLogonCommands: run in the first user session (the AutoLogon account), oobeSystem pass.
{% for cmd in data.firstlogon_commands %}{{ cmd_row(cmd, loop.index0, 'commandline', limits.commandline) }}{% endfor %}
No first logon commands.

Raw XML

Review changes shows the diff of this text against the file

For what the form does not cover. This text is written exactly as it stands; edits made on the Form view are not part of a Raw XML save (and the other way round).

Unsaved changes Ctrl+S reviews
{# Row templates for Add #} {% endblock %} {% block extra_scripts %} {% endblock %}