diff --git a/DISMTools.vbproj b/DISMTools.vbproj
index 89e26f4f..e58046b8 100644
--- a/DISMTools.vbproj
+++ b/DISMTools.vbproj
@@ -158,6 +158,8 @@
+
+
diff --git a/Elements/AutoUnattend/Component.xml b/Elements/AutoUnattend/Component.xml
new file mode 100644
index 00000000..54595791
--- /dev/null
+++ b/Elements/AutoUnattend/Component.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Elements/AutoUnattend/Components/Component.vb b/Elements/AutoUnattend/Components/Component.vb
new file mode 100644
index 00000000..e84cd55f
--- /dev/null
+++ b/Elements/AutoUnattend/Components/Component.vb
@@ -0,0 +1,59 @@
+Imports System.Xml.Serialization
+Imports System.Xml
+Imports System.IO
+
+Namespace Elements
+
+
+ Public Class Component
+
+
+ Public Property Id As String
+
+ Public Property Passes As New List(Of Pass)
+
+ Public Shared Function LoadItems(filePath As String) As List(Of Component)
+ Dim componentList As New List(Of Component)
+ Try
+ Using fs As FileStream = New FileStream(filePath, FileMode.Open)
+ Dim xs As New XmlReaderSettings()
+ xs.IgnoreWhitespace = True
+ Using reader As XmlReader = XmlReader.Create(fs, xs)
+ While reader.Read()
+ If reader.NodeType = XmlNodeType.Element AndAlso reader.Name = "Component" Then
+ Dim sysComponent As New Component()
+ sysComponent.Id = reader.GetAttribute("Id")
+ Dim PassList As String = reader.GetAttribute("Passes")
+ Dim passListTemp As New List(Of String)
+ passListTemp = PassList.Split(",").ToList()
+
+ Dim knownPasses As New Dictionary(Of String, Boolean)
+ knownPasses.Add("offlineServicing", False)
+ knownPasses.Add("windowsPE", False)
+ knownPasses.Add("generalize", False)
+ knownPasses.Add("specialize", False)
+ knownPasses.Add("auditSystem", False)
+ knownPasses.Add("auditUser", False)
+ knownPasses.Add("oobeSystem", False)
+
+ For Each systemPass In knownPasses.Keys
+ Dim sysPass As New Pass(systemPass)
+ sysPass.Compatible = (passListTemp.Contains(systemPass))
+ sysComponent.Passes.Add(sysPass)
+ Next
+ componentList.Add(sysComponent)
+ End If
+ End While
+ End Using
+ End Using
+ Return componentList
+ Catch ex As Exception
+ If Debugger.IsAttached Then Debugger.Break()
+ Return Nothing
+ End Try
+ Return Nothing
+ End Function
+
+ End Class
+
+End Namespace
\ No newline at end of file
diff --git a/Elements/AutoUnattend/Components/Pass.vb b/Elements/AutoUnattend/Components/Pass.vb
new file mode 100644
index 00000000..8c37a6c2
--- /dev/null
+++ b/Elements/AutoUnattend/Components/Pass.vb
@@ -0,0 +1,18 @@
+Namespace Elements
+
+ Public Class Pass
+
+ Public Property Name As String
+
+ Public Property Compatible As Boolean
+
+ Public Property Enabled As Boolean
+
+ Public Sub New(passName As String)
+ Me.Name = passName
+ Me.Compatible = False
+ End Sub
+
+ End Class
+
+End Namespace
\ No newline at end of file
diff --git a/Installer/Nightly/dt_setup.exe b/Installer/Nightly/dt_setup.exe
index 354694ec..7336a7b2 100644
Binary files a/Installer/Nightly/dt_setup.exe and b/Installer/Nightly/dt_setup.exe differ
diff --git a/Panels/Unattend_Files/Addition/NewUnattendWiz.Designer.vb b/Panels/Unattend_Files/Addition/NewUnattendWiz.Designer.vb
index 95602def..ea5db2d7 100644
--- a/Panels/Unattend_Files/Addition/NewUnattendWiz.Designer.vb
+++ b/Panels/Unattend_Files/Addition/NewUnattendWiz.Designer.vb
@@ -23,19 +23,19 @@ Partial Class NewUnattendWiz
_
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
- Dim TreeNode66 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Welcome")
- Dim TreeNode67 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Regional Configuration")
- Dim TreeNode68 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Basic System Configuration")
- Dim TreeNode69 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Time Zone")
- Dim TreeNode70 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Disk Configuration")
- Dim TreeNode71 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Product Key")
- Dim TreeNode72 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("User Accounts")
- Dim TreeNode73 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Virtual Machine Support")
- Dim TreeNode74 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Wireless Networking")
- Dim TreeNode75 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("System Telemetry")
- Dim TreeNode76 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Post-Installation Scripts")
- Dim TreeNode77 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Component Settings")
- Dim TreeNode78 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Finish")
+ Dim TreeNode1 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Welcome")
+ Dim TreeNode2 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Regional Configuration")
+ Dim TreeNode3 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Basic System Configuration")
+ Dim TreeNode4 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Time Zone")
+ Dim TreeNode5 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Disk Configuration")
+ Dim TreeNode6 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Product Key")
+ Dim TreeNode7 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("User Accounts")
+ Dim TreeNode8 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Virtual Machine Support")
+ Dim TreeNode9 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Wireless Networking")
+ Dim TreeNode10 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("System Telemetry")
+ Dim TreeNode11 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Post-Installation Scripts")
+ Dim TreeNode12 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Component Settings")
+ Dim TreeNode13 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("Finish")
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(NewUnattendWiz))
Me.SidePanel = New System.Windows.Forms.Panel()
Me.ExpressModeSteps = New System.Windows.Forms.Panel()
@@ -51,6 +51,8 @@ Partial Class NewUnattendWiz
Me.StepsContainer = New System.Windows.Forms.Panel()
Me.FinishPanel = New System.Windows.Forms.Panel()
Me.Label59 = New System.Windows.Forms.Label()
+ Me.LinkLabel7 = New System.Windows.Forms.LinkLabel()
+ Me.LinkLabel6 = New System.Windows.Forms.LinkLabel()
Me.LinkLabel4 = New System.Windows.Forms.LinkLabel()
Me.LinkLabel3 = New System.Windows.Forms.LinkLabel()
Me.LinkLabel2 = New System.Windows.Forms.LinkLabel()
@@ -67,6 +69,22 @@ Partial Class NewUnattendWiz
Me.TextBox13 = New System.Windows.Forms.TextBox()
Me.FinalReviewHeader = New System.Windows.Forms.Label()
Me.ComponentPanel = New System.Windows.Forms.Panel()
+ Me.LinkLabel5 = New System.Windows.Forms.LinkLabel()
+ Me.SystemComponentPanel = New System.Windows.Forms.Panel()
+ Me.SplitContainer2 = New System.Windows.Forms.SplitContainer()
+ Me.ListBox2 = New System.Windows.Forms.ListBox()
+ Me.PassContainerPanel = New System.Windows.Forms.Panel()
+ Me.PassConfigurationPanel = New System.Windows.Forms.Panel()
+ Me.oobeSystem = New System.Windows.Forms.CheckBox()
+ Me.auditUser = New System.Windows.Forms.CheckBox()
+ Me.auditSystem = New System.Windows.Forms.CheckBox()
+ Me.generalize = New System.Windows.Forms.CheckBox()
+ Me.specialize = New System.Windows.Forms.CheckBox()
+ Me.offlineServicing = New System.Windows.Forms.CheckBox()
+ Me.windowsPE = New System.Windows.Forms.CheckBox()
+ Me.Label61 = New System.Windows.Forms.Label()
+ Me.NoComponentSelectedPanel = New System.Windows.Forms.Panel()
+ Me.Label60 = New System.Windows.Forms.Label()
Me.Label52 = New System.Windows.Forms.Label()
Me.ComponentHeader = New System.Windows.Forms.Label()
Me.PostInstallPanel = New System.Windows.Forms.Panel()
@@ -157,6 +175,7 @@ Partial Class NewUnattendWiz
Me.CheckBox11 = New System.Windows.Forms.CheckBox()
Me.TextBox4 = New System.Windows.Forms.TextBox()
Me.ComboBox7 = New System.Windows.Forms.ComboBox()
+ Me.UserListOverviewLabel = New System.Windows.Forms.Label()
Me.GroupBox1 = New System.Windows.Forms.GroupBox()
Me.AutoLogonSettingsPanel = New System.Windows.Forms.Panel()
Me.TextBox5 = New System.Windows.Forms.TextBox()
@@ -297,7 +316,6 @@ Partial Class NewUnattendWiz
Me.UGNotify = New System.Windows.Forms.NotifyIcon(Me.components)
Me.EditorModeOFD = New System.Windows.Forms.OpenFileDialog()
Me.EditorModeSFD = New System.Windows.Forms.SaveFileDialog()
- Me.UserListOverviewLabel = New System.Windows.Forms.Label()
Me.SidePanel.SuspendLayout()
Me.ExpressModeSteps.SuspendLayout()
Me.EditorPanelTrigger.SuspendLayout()
@@ -311,6 +329,14 @@ Partial Class NewUnattendWiz
Me.UnattendProgressPanel.SuspendLayout()
Me.FinalReviewPanel.SuspendLayout()
Me.ComponentPanel.SuspendLayout()
+ Me.SystemComponentPanel.SuspendLayout()
+ CType(Me.SplitContainer2, System.ComponentModel.ISupportInitialize).BeginInit()
+ Me.SplitContainer2.Panel1.SuspendLayout()
+ Me.SplitContainer2.Panel2.SuspendLayout()
+ Me.SplitContainer2.SuspendLayout()
+ Me.PassContainerPanel.SuspendLayout()
+ Me.PassConfigurationPanel.SuspendLayout()
+ Me.NoComponentSelectedPanel.SuspendLayout()
Me.PostInstallPanel.SuspendLayout()
Me.SystemTelemetryPanel.SuspendLayout()
Me.TelemetryOptionsPanel.SuspendLayout()
@@ -407,33 +433,33 @@ Partial Class NewUnattendWiz
Me.StepsTreeView.ItemHeight = 24
Me.StepsTreeView.Location = New System.Drawing.Point(6, 6)
Me.StepsTreeView.Name = "StepsTreeView"
- TreeNode66.Name = "Nodo0"
- TreeNode66.Text = "Welcome"
- TreeNode67.Name = "Nodo1"
- TreeNode67.Text = "Regional Configuration"
- TreeNode68.Name = "Nodo2"
- TreeNode68.Text = "Basic System Configuration"
- TreeNode69.Name = "Nodo3"
- TreeNode69.Text = "Time Zone"
- TreeNode70.Name = "Nodo4"
- TreeNode70.Text = "Disk Configuration"
- TreeNode71.Name = "Nodo5"
- TreeNode71.Text = "Product Key"
- TreeNode72.Name = "Nodo6"
- TreeNode72.Text = "User Accounts"
- TreeNode73.Name = "Nodo9"
- TreeNode73.Text = "Virtual Machine Support"
- TreeNode74.Name = "Nodo10"
- TreeNode74.Text = "Wireless Networking"
- TreeNode75.Name = "Nodo11"
- TreeNode75.Text = "System Telemetry"
- TreeNode76.Name = "Nodo12"
- TreeNode76.Text = "Post-Installation Scripts"
- TreeNode77.Name = "Nodo13"
- TreeNode77.Text = "Component Settings"
- TreeNode78.Name = "Nodo14"
- TreeNode78.Text = "Finish"
- Me.StepsTreeView.Nodes.AddRange(New System.Windows.Forms.TreeNode() {TreeNode66, TreeNode67, TreeNode68, TreeNode69, TreeNode70, TreeNode71, TreeNode72, TreeNode73, TreeNode74, TreeNode75, TreeNode76, TreeNode77, TreeNode78})
+ TreeNode1.Name = "Nodo0"
+ TreeNode1.Text = "Welcome"
+ TreeNode2.Name = "Nodo1"
+ TreeNode2.Text = "Regional Configuration"
+ TreeNode3.Name = "Nodo2"
+ TreeNode3.Text = "Basic System Configuration"
+ TreeNode4.Name = "Nodo3"
+ TreeNode4.Text = "Time Zone"
+ TreeNode5.Name = "Nodo4"
+ TreeNode5.Text = "Disk Configuration"
+ TreeNode6.Name = "Nodo5"
+ TreeNode6.Text = "Product Key"
+ TreeNode7.Name = "Nodo6"
+ TreeNode7.Text = "User Accounts"
+ TreeNode8.Name = "Nodo9"
+ TreeNode8.Text = "Virtual Machine Support"
+ TreeNode9.Name = "Nodo10"
+ TreeNode9.Text = "Wireless Networking"
+ TreeNode10.Name = "Nodo11"
+ TreeNode10.Text = "System Telemetry"
+ TreeNode11.Name = "Nodo12"
+ TreeNode11.Text = "Post-Installation Scripts"
+ TreeNode12.Name = "Nodo13"
+ TreeNode12.Text = "Component Settings"
+ TreeNode13.Name = "Nodo14"
+ TreeNode13.Text = "Finish"
+ Me.StepsTreeView.Nodes.AddRange(New System.Windows.Forms.TreeNode() {TreeNode1, TreeNode2, TreeNode3, TreeNode4, TreeNode5, TreeNode6, TreeNode7, TreeNode8, TreeNode9, TreeNode10, TreeNode11, TreeNode12, TreeNode13})
Me.StepsTreeView.ShowLines = False
Me.StepsTreeView.ShowPlusMinus = False
Me.StepsTreeView.ShowRootLines = False
@@ -549,6 +575,8 @@ Partial Class NewUnattendWiz
'FinishPanel
'
Me.FinishPanel.Controls.Add(Me.Label59)
+ Me.FinishPanel.Controls.Add(Me.LinkLabel7)
+ Me.FinishPanel.Controls.Add(Me.LinkLabel6)
Me.FinishPanel.Controls.Add(Me.LinkLabel4)
Me.FinishPanel.Controls.Add(Me.LinkLabel3)
Me.FinishPanel.Controls.Add(Me.LinkLabel2)
@@ -569,6 +597,30 @@ Partial Class NewUnattendWiz
Me.Label59.TabIndex = 16
Me.Label59.Text = "NOTE: you will return to this wizard after applying the answer file"
'
+ 'LinkLabel7
+ '
+ Me.LinkLabel7.AutoSize = True
+ Me.LinkLabel7.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline
+ Me.LinkLabel7.LinkColor = System.Drawing.Color.DodgerBlue
+ Me.LinkLabel7.Location = New System.Drawing.Point(157, 316)
+ Me.LinkLabel7.Name = "LinkLabel7"
+ Me.LinkLabel7.Size = New System.Drawing.Size(80, 13)
+ Me.LinkLabel7.TabIndex = 15
+ Me.LinkLabel7.TabStop = True
+ Me.LinkLabel7.Text = "Edit answer file"
+ '
+ 'LinkLabel6
+ '
+ Me.LinkLabel6.AutoSize = True
+ Me.LinkLabel6.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline
+ Me.LinkLabel6.LinkColor = System.Drawing.Color.DodgerBlue
+ Me.LinkLabel6.Location = New System.Drawing.Point(157, 291)
+ Me.LinkLabel6.Name = "LinkLabel6"
+ Me.LinkLabel6.Size = New System.Drawing.Size(218, 13)
+ Me.LinkLabel6.TabIndex = 15
+ Me.LinkLabel6.TabStop = True
+ Me.LinkLabel6.Text = "Open with Windows System Image Manager"
+ '
'LinkLabel4
'
Me.LinkLabel4.AutoSize = True
@@ -740,6 +792,8 @@ Partial Class NewUnattendWiz
'
'ComponentPanel
'
+ Me.ComponentPanel.Controls.Add(Me.LinkLabel5)
+ Me.ComponentPanel.Controls.Add(Me.SystemComponentPanel)
Me.ComponentPanel.Controls.Add(Me.Label52)
Me.ComponentPanel.Controls.Add(Me.ComponentHeader)
Me.ComponentPanel.Dock = System.Windows.Forms.DockStyle.Fill
@@ -748,15 +802,195 @@ Partial Class NewUnattendWiz
Me.ComponentPanel.Size = New System.Drawing.Size(752, 449)
Me.ComponentPanel.TabIndex = 13
'
+ 'LinkLabel5
+ '
+ Me.LinkLabel5.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
+ Me.LinkLabel5.AutoSize = True
+ Me.LinkLabel5.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline
+ Me.LinkLabel5.LinkColor = System.Drawing.Color.DodgerBlue
+ Me.LinkLabel5.Location = New System.Drawing.Point(53, 413)
+ Me.LinkLabel5.Name = "LinkLabel5"
+ Me.LinkLabel5.Size = New System.Drawing.Size(112, 13)
+ Me.LinkLabel5.TabIndex = 15
+ Me.LinkLabel5.TabStop = True
+ Me.LinkLabel5.Text = "Component reference"
+ '
+ 'SystemComponentPanel
+ '
+ Me.SystemComponentPanel.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
+ Or System.Windows.Forms.AnchorStyles.Left) _
+ Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
+ Me.SystemComponentPanel.Controls.Add(Me.SplitContainer2)
+ Me.SystemComponentPanel.Location = New System.Drawing.Point(53, 148)
+ Me.SystemComponentPanel.Name = "SystemComponentPanel"
+ Me.SystemComponentPanel.Size = New System.Drawing.Size(645, 253)
+ Me.SystemComponentPanel.TabIndex = 14
+ '
+ 'SplitContainer2
+ '
+ Me.SplitContainer2.Dock = System.Windows.Forms.DockStyle.Fill
+ Me.SplitContainer2.Location = New System.Drawing.Point(0, 0)
+ Me.SplitContainer2.Name = "SplitContainer2"
+ '
+ 'SplitContainer2.Panel1
+ '
+ Me.SplitContainer2.Panel1.Controls.Add(Me.ListBox2)
+ '
+ 'SplitContainer2.Panel2
+ '
+ Me.SplitContainer2.Panel2.Controls.Add(Me.PassContainerPanel)
+ Me.SplitContainer2.Size = New System.Drawing.Size(645, 253)
+ Me.SplitContainer2.SplitterDistance = 412
+ Me.SplitContainer2.TabIndex = 14
+ '
+ 'ListBox2
+ '
+ Me.ListBox2.Dock = System.Windows.Forms.DockStyle.Fill
+ Me.ListBox2.Font = New System.Drawing.Font("Segoe UI", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+ Me.ListBox2.FormattingEnabled = True
+ Me.ListBox2.IntegralHeight = False
+ Me.ListBox2.ItemHeight = 15
+ Me.ListBox2.Location = New System.Drawing.Point(0, 0)
+ Me.ListBox2.Name = "ListBox2"
+ Me.ListBox2.Size = New System.Drawing.Size(412, 253)
+ Me.ListBox2.TabIndex = 0
+ '
+ 'PassContainerPanel
+ '
+ Me.PassContainerPanel.Controls.Add(Me.PassConfigurationPanel)
+ Me.PassContainerPanel.Controls.Add(Me.NoComponentSelectedPanel)
+ Me.PassContainerPanel.Dock = System.Windows.Forms.DockStyle.Fill
+ Me.PassContainerPanel.Location = New System.Drawing.Point(0, 0)
+ Me.PassContainerPanel.Name = "PassContainerPanel"
+ Me.PassContainerPanel.Size = New System.Drawing.Size(229, 253)
+ Me.PassContainerPanel.TabIndex = 0
+ '
+ 'PassConfigurationPanel
+ '
+ Me.PassConfigurationPanel.Controls.Add(Me.oobeSystem)
+ Me.PassConfigurationPanel.Controls.Add(Me.auditUser)
+ Me.PassConfigurationPanel.Controls.Add(Me.auditSystem)
+ Me.PassConfigurationPanel.Controls.Add(Me.generalize)
+ Me.PassConfigurationPanel.Controls.Add(Me.specialize)
+ Me.PassConfigurationPanel.Controls.Add(Me.offlineServicing)
+ Me.PassConfigurationPanel.Controls.Add(Me.windowsPE)
+ Me.PassConfigurationPanel.Controls.Add(Me.Label61)
+ Me.PassConfigurationPanel.Dock = System.Windows.Forms.DockStyle.Fill
+ Me.PassConfigurationPanel.Location = New System.Drawing.Point(0, 0)
+ Me.PassConfigurationPanel.Name = "PassConfigurationPanel"
+ Me.PassConfigurationPanel.Size = New System.Drawing.Size(229, 253)
+ Me.PassConfigurationPanel.TabIndex = 0
+ Me.PassConfigurationPanel.Visible = False
+ '
+ 'oobeSystem
+ '
+ Me.oobeSystem.AutoSize = True
+ Me.oobeSystem.Location = New System.Drawing.Point(25, 184)
+ Me.oobeSystem.Name = "oobeSystem"
+ Me.oobeSystem.Size = New System.Drawing.Size(85, 17)
+ Me.oobeSystem.TabIndex = 1
+ Me.oobeSystem.Text = "oobeSystem"
+ Me.oobeSystem.UseVisualStyleBackColor = True
+ '
+ 'auditUser
+ '
+ Me.auditUser.AutoSize = True
+ Me.auditUser.Location = New System.Drawing.Point(25, 161)
+ Me.auditUser.Name = "auditUser"
+ Me.auditUser.Size = New System.Drawing.Size(72, 17)
+ Me.auditUser.TabIndex = 1
+ Me.auditUser.Text = "auditUser"
+ Me.auditUser.UseVisualStyleBackColor = True
+ '
+ 'auditSystem
+ '
+ Me.auditSystem.AutoSize = True
+ Me.auditSystem.Location = New System.Drawing.Point(25, 138)
+ Me.auditSystem.Name = "auditSystem"
+ Me.auditSystem.Size = New System.Drawing.Size(85, 17)
+ Me.auditSystem.TabIndex = 1
+ Me.auditSystem.Text = "auditSystem"
+ Me.auditSystem.UseVisualStyleBackColor = True
+ '
+ 'generalize
+ '
+ Me.generalize.AutoSize = True
+ Me.generalize.Location = New System.Drawing.Point(25, 116)
+ Me.generalize.Name = "generalize"
+ Me.generalize.Size = New System.Drawing.Size(75, 17)
+ Me.generalize.TabIndex = 1
+ Me.generalize.Text = "generalize"
+ Me.generalize.UseVisualStyleBackColor = True
+ '
+ 'specialize
+ '
+ Me.specialize.AutoSize = True
+ Me.specialize.Location = New System.Drawing.Point(25, 93)
+ Me.specialize.Name = "specialize"
+ Me.specialize.Size = New System.Drawing.Size(71, 17)
+ Me.specialize.TabIndex = 1
+ Me.specialize.Text = "specialize"
+ Me.specialize.UseVisualStyleBackColor = True
+ '
+ 'offlineServicing
+ '
+ Me.offlineServicing.AutoSize = True
+ Me.offlineServicing.Location = New System.Drawing.Point(25, 70)
+ Me.offlineServicing.Name = "offlineServicing"
+ Me.offlineServicing.Size = New System.Drawing.Size(99, 17)
+ Me.offlineServicing.TabIndex = 1
+ Me.offlineServicing.Text = "offlineServicing"
+ Me.offlineServicing.UseVisualStyleBackColor = True
+ '
+ 'windowsPE
+ '
+ Me.windowsPE.AutoSize = True
+ Me.windowsPE.Location = New System.Drawing.Point(25, 46)
+ Me.windowsPE.Name = "windowsPE"
+ Me.windowsPE.Size = New System.Drawing.Size(79, 17)
+ Me.windowsPE.TabIndex = 1
+ Me.windowsPE.Text = "windowsPE"
+ Me.windowsPE.UseVisualStyleBackColor = True
+ '
+ 'Label61
+ '
+ Me.Label61.AutoSize = True
+ Me.Label61.Location = New System.Drawing.Point(11, 10)
+ Me.Label61.Name = "Label61"
+ Me.Label61.Size = New System.Drawing.Size(94, 13)
+ Me.Label61.TabIndex = 0
+ Me.Label61.Text = "Configure passes:"
+ '
+ 'NoComponentSelectedPanel
+ '
+ Me.NoComponentSelectedPanel.Controls.Add(Me.Label60)
+ Me.NoComponentSelectedPanel.Dock = System.Windows.Forms.DockStyle.Fill
+ Me.NoComponentSelectedPanel.Location = New System.Drawing.Point(0, 0)
+ Me.NoComponentSelectedPanel.Name = "NoComponentSelectedPanel"
+ Me.NoComponentSelectedPanel.Size = New System.Drawing.Size(229, 253)
+ Me.NoComponentSelectedPanel.TabIndex = 0
+ '
+ 'Label60
+ '
+ Me.Label60.AutoEllipsis = True
+ Me.Label60.Dock = System.Windows.Forms.DockStyle.Fill
+ Me.Label60.Location = New System.Drawing.Point(0, 0)
+ Me.Label60.Name = "Label60"
+ Me.Label60.Size = New System.Drawing.Size(229, 253)
+ Me.Label60.TabIndex = 0
+ Me.Label60.Text = "Select a component to configure passes"
+ Me.Label60.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
+ '
'Label52
'
+ Me.Label52.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
+ Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.Label52.AutoEllipsis = True
- Me.Label52.Location = New System.Drawing.Point(107, 156)
+ Me.Label52.Location = New System.Drawing.Point(52, 67)
Me.Label52.Name = "Label52"
- Me.Label52.Size = New System.Drawing.Size(558, 66)
+ Me.Label52.Size = New System.Drawing.Size(656, 69)
Me.Label52.TabIndex = 12
- Me.Label52.Text = "This action will be added in the future. For now, you can use the editor mode to " & _
- "add more components. You can continue."
+ Me.Label52.Text = resources.GetString("Label52.Text")
'
'ComponentHeader
'
@@ -1775,6 +2009,17 @@ Partial Class NewUnattendWiz
Me.ComboBox7.TabIndex = 19
Me.ComboBox7.Text = "Administrators"
'
+ 'UserListOverviewLabel
+ '
+ Me.UserListOverviewLabel.Dock = System.Windows.Forms.DockStyle.Fill
+ Me.UserListOverviewLabel.Font = New System.Drawing.Font("Tahoma", 8.25!, System.Drawing.FontStyle.Bold)
+ Me.UserListOverviewLabel.Location = New System.Drawing.Point(4, 1)
+ Me.UserListOverviewLabel.Name = "UserListOverviewLabel"
+ Me.UserListOverviewLabel.Size = New System.Drawing.Size(141, 24)
+ Me.UserListOverviewLabel.TabIndex = 25
+ Me.UserListOverviewLabel.Text = "User accounts:"
+ Me.UserListOverviewLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
+ '
'GroupBox1
'
Me.GroupBox1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
@@ -3270,17 +3515,6 @@ Partial Class NewUnattendWiz
'
Me.EditorModeSFD.Filter = "Answer files|*.xml"
'
- 'UserListOverviewLabel
- '
- Me.UserListOverviewLabel.Dock = System.Windows.Forms.DockStyle.Fill
- Me.UserListOverviewLabel.Font = New System.Drawing.Font("Tahoma", 8.25!, System.Drawing.FontStyle.Bold)
- Me.UserListOverviewLabel.Location = New System.Drawing.Point(4, 1)
- Me.UserListOverviewLabel.Name = "UserListOverviewLabel"
- Me.UserListOverviewLabel.Size = New System.Drawing.Size(141, 24)
- Me.UserListOverviewLabel.TabIndex = 25
- Me.UserListOverviewLabel.Text = "User accounts:"
- Me.UserListOverviewLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
- '
'NewUnattendWiz
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
@@ -3316,6 +3550,16 @@ Partial Class NewUnattendWiz
Me.FinalReviewPanel.ResumeLayout(False)
Me.FinalReviewPanel.PerformLayout()
Me.ComponentPanel.ResumeLayout(False)
+ Me.ComponentPanel.PerformLayout()
+ Me.SystemComponentPanel.ResumeLayout(False)
+ Me.SplitContainer2.Panel1.ResumeLayout(False)
+ Me.SplitContainer2.Panel2.ResumeLayout(False)
+ CType(Me.SplitContainer2, System.ComponentModel.ISupportInitialize).EndInit()
+ Me.SplitContainer2.ResumeLayout(False)
+ Me.PassContainerPanel.ResumeLayout(False)
+ Me.PassConfigurationPanel.ResumeLayout(False)
+ Me.PassConfigurationPanel.PerformLayout()
+ Me.NoComponentSelectedPanel.ResumeLayout(False)
Me.PostInstallPanel.ResumeLayout(False)
Me.PostInstallPanel.PerformLayout()
Me.SystemTelemetryPanel.ResumeLayout(False)
@@ -3679,4 +3923,22 @@ Partial Class NewUnattendWiz
Friend WithEvents EditorModeOFD As System.Windows.Forms.OpenFileDialog
Friend WithEvents EditorModeSFD As System.Windows.Forms.SaveFileDialog
Friend WithEvents UserListOverviewLabel As System.Windows.Forms.Label
+ Friend WithEvents SystemComponentPanel As Panel
+ Friend WithEvents SplitContainer2 As System.Windows.Forms.SplitContainer
+ Friend WithEvents PassContainerPanel As System.Windows.Forms.Panel
+ Friend WithEvents PassConfigurationPanel As System.Windows.Forms.Panel
+ Friend WithEvents oobeSystem As System.Windows.Forms.CheckBox
+ Friend WithEvents auditUser As System.Windows.Forms.CheckBox
+ Friend WithEvents auditSystem As System.Windows.Forms.CheckBox
+ Friend WithEvents generalize As System.Windows.Forms.CheckBox
+ Friend WithEvents specialize As System.Windows.Forms.CheckBox
+ Friend WithEvents offlineServicing As System.Windows.Forms.CheckBox
+ Friend WithEvents windowsPE As System.Windows.Forms.CheckBox
+ Friend WithEvents Label61 As System.Windows.Forms.Label
+ Friend WithEvents NoComponentSelectedPanel As System.Windows.Forms.Panel
+ Friend WithEvents Label60 As System.Windows.Forms.Label
+ Friend WithEvents ListBox2 As System.Windows.Forms.ListBox
+ Friend WithEvents LinkLabel5 As System.Windows.Forms.LinkLabel
+ Friend WithEvents LinkLabel6 As System.Windows.Forms.LinkLabel
+ Friend WithEvents LinkLabel7 As System.Windows.Forms.LinkLabel
End Class
diff --git a/Panels/Unattend_Files/Addition/NewUnattendWiz.resx b/Panels/Unattend_Files/Addition/NewUnattendWiz.resx
index 28e49ea8..6ab4bf5d 100644
--- a/Panels/Unattend_Files/Addition/NewUnattendWiz.resx
+++ b/Panels/Unattend_Files/Addition/NewUnattendWiz.resx
@@ -117,6 +117,11 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ In this screen you can add placeholders to additional components that you want to configure in your unattended answer file. Select the passes for the components you want to configure and click Next. Then, once your file is created, fill in the placeholder values with your settings in the Editor mode.
+
+To skip this process, click Next without configuring any component.
+
REM EXAMPLE SCRIPT. PLEASE MODIFY
REM -----------------------------------------
@@ -147,9 +152,6 @@ To begin creating your answer file, click Next.
17, 17
-
- 17, 17
-
150, 17
diff --git a/Panels/Unattend_Files/Addition/NewUnattendWiz.vb b/Panels/Unattend_Files/Addition/NewUnattendWiz.vb
index c948c6b6..d494706a 100644
--- a/Panels/Unattend_Files/Addition/NewUnattendWiz.vb
+++ b/Panels/Unattend_Files/Addition/NewUnattendWiz.vb
@@ -16,7 +16,7 @@ Public Class NewUnattendWiz
Dim DotNetRuntimeSupported As Boolean
Dim PreferSelfContained As Boolean
- Dim UnattendGenReleaseTag As String = "2491"
+ Dim UnattendGenReleaseTag As String = "2493"
' Regional Settings Page
Dim ImageLanguages As New List(Of ImageLanguage)
@@ -69,6 +69,10 @@ Public Class NewUnattendWiz
Dim SystemTelemetryInteractive As Boolean
Dim SelectedTelemetrySettings As New SystemTelemetry()
+ ' Component Panel
+ Dim SystemComponents As New List(Of Component)
+ Dim FinalComponents As New List(Of Component)
+
' Space for more pages
' Default Settings
@@ -82,6 +86,7 @@ Public Class NewUnattendWiz
Dim DefaultLockdownSettings As New AccountLockdownSettings()
Dim DefaultVMSettings As New VirtualMachineSettings()
Dim DefaultNetworkConfiguration As New WirelessSettings()
+ Dim DefaultSystemComponents As New List(Of Component)
' Progress info
Dim ProgressMessage As String = ""
@@ -395,6 +400,7 @@ Public Class NewUnattendWiz
ComboBox12.BackColor = BackColor
ComboBox13.BackColor = BackColor
ListBox1.BackColor = BackColor
+ ListBox2.BackColor = BackColor
TextBox1.BackColor = BackColor
TextBox2.BackColor = BackColor
TextBox3.BackColor = BackColor
@@ -435,6 +441,7 @@ Public Class NewUnattendWiz
ComboBox12.ForeColor = ForeColor
ComboBox13.ForeColor = ForeColor
ListBox1.ForeColor = ForeColor
+ ListBox2.ForeColor = ForeColor
TextBox1.ForeColor = ForeColor
TextBox2.ForeColor = ForeColor
TextBox3.ForeColor = ForeColor
@@ -531,6 +538,16 @@ Public Class NewUnattendWiz
If ComboBox5.SelectedItem = Nothing Then ComboBox5.SelectedItem = DefaultOffset.DisplayName
End If
End If
+ ' System components
+ If File.Exists(Application.StartupPath & "\AutoUnattend\Component.xml") Then
+ SystemComponents = Component.LoadItems(Application.StartupPath & "\AutoUnattend\Component.xml")
+ DefaultSystemComponents = Component.LoadItems(Application.StartupPath & "\AutoUnattend\Component.xml")
+ If SystemComponents IsNot Nothing Then
+ For Each SystemComponent As Component In SystemComponents
+ ListBox2.Items.Add(SystemComponent.Id)
+ Next
+ End If
+ End If
ListBox1.SelectedIndex = 1
ChangePage(UnattendedWizardPage.Page.WelcomePage)
VerifyInPages.AddRange(New UnattendedWizardPage.Page() {UnattendedWizardPage.Page.SysConfigPage, UnattendedWizardPage.Page.DiskConfigPage, UnattendedWizardPage.Page.ProductKeyPage, UnattendedWizardPage.Page.UserAccountsPage, UnattendedWizardPage.Page.NetworkConnectionsPage})
@@ -554,6 +571,14 @@ Public Class NewUnattendWiz
Else
UGNotify.Visible = False
End If
+
+ ' Detect presence of Windows SIM
+ If File.Exists(Path.Combine(Environment.GetFolderPath(If(Environment.Is64BitOperatingSystem, Environment.SpecialFolder.ProgramFilesX86, Environment.SpecialFolder.ProgramFiles)),
+ "Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\WSIM\x86\imgmgr.exe")) Then
+ LinkLabel6.Enabled = True
+ Else
+ LinkLabel6.Enabled = False
+ End If
End Sub
Sub SelectTreeNode(NodeIndex As Integer)
@@ -815,6 +840,22 @@ Public Class NewUnattendWiz
TextBox13.AppendText("- (Attempt to) disable telemetry? " & If(Not SelectedTelemetrySettings.Enabled, "Yes", "No") & CrLf)
End If
' Post Install Scripts and Component Manager will be added in a future release
+ ' 11. -- COMPONENTS
+ TextBox13.AppendText("Additional components: " & If(Not AreComponentListsEqual(SystemComponents, DefaultSystemComponents), "", "none") & CrLf)
+ If Not AreComponentListsEqual(SystemComponents, DefaultSystemComponents) Then
+ FinalComponents = GetComponentDifferences(SystemComponents, DefaultSystemComponents)
+ If FinalComponents.Count > 0 Then
+ For Each systemComponent As Component In FinalComponents
+ TextBox13.AppendText("- Component name: " & Quote & systemComponent.Id & Quote & CrLf &
+ " - Passes:" & CrLf)
+ If systemComponent.Passes.Count > 0 Then
+ For Each systemPass As Pass In systemComponent.Passes
+ TextBox13.AppendText(" - " & Quote & systemPass.Name & Quote & CrLf)
+ Next
+ End If
+ Next
+ End If
+ End If
End Sub
Private Sub ExpressPanelTrigger_MouseEnter(sender As Object, e As EventArgs) Handles ExpressPanelTrigger.MouseEnter
@@ -1535,6 +1576,24 @@ Public Class NewUnattendWiz
UnattendGen.StartInfo.Arguments &= " /telem=no"
End If
End If
+ If FinalComponents.Count > 0 Then
+ ReportMessage("Saving user settings...", 24.75)
+ UnattendGen.StartInfo.Arguments &= " /customcomponents"
+ Dim customComponentContents As String = "" & CrLf &
+ "" & CrLf
+ For Each systemComponent As Component In FinalComponents
+ Dim passName As String = ""
+ If systemComponent.Passes.Count > 0 Then
+ For Each systemPass As Pass In systemComponent.Passes
+ passName &= systemPass.Name & ","
+ Next
+ passName = passName.TrimEnd(",")
+ End If
+ customComponentContents &= " " & CrLf
+ Next
+ customComponentContents &= ""
+ File.WriteAllText(Path.Combine(UnattendGen.StartInfo.WorkingDirectory, "components.xml"), customComponentContents, UTF8)
+ End If
ReportMessage("Generating unattended answer file...", 25)
UnattendGen.Start()
UnattendGen.WaitForExit()
@@ -1747,4 +1806,202 @@ Public Class NewUnattendWiz
UserAccountListing.Width = ManualAccountPanel.Width - (UserAccountListing.Margin.Left * 2) - 4
WirelessNetworkSettingsPanel.Width = ManualNetworkConfigPanel.Width - (WirelessNetworkSettingsPanel.Margin.Left * 2) - 4
End Sub
+
+ Private Sub ListBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox2.SelectedIndexChanged
+ PassConfigurationPanel.Visible = (ListBox2.SelectedItems.Count = 1)
+ If ListBox2.SelectedItems.Count = 1 Then
+ For Each configurationPass As Pass In SystemComponents(ListBox2.SelectedIndex).Passes
+ Select Case configurationPass.Name
+ Case "windowsPE"
+ windowsPE.Enabled = configurationPass.Compatible
+ windowsPE.Checked = If(configurationPass.Compatible, configurationPass.Enabled, False)
+ Case "offlineServicing"
+ offlineServicing.Enabled = configurationPass.Compatible
+ offlineServicing.Checked = If(configurationPass.Compatible, configurationPass.Enabled, False)
+ Case "specialize"
+ specialize.Enabled = configurationPass.Compatible
+ specialize.Checked = If(configurationPass.Compatible, configurationPass.Enabled, False)
+ Case "generalize"
+ generalize.Enabled = configurationPass.Compatible
+ generalize.Checked = If(configurationPass.Compatible, configurationPass.Enabled, False)
+ Case "auditSystem"
+ auditSystem.Enabled = configurationPass.Compatible
+ auditSystem.Checked = If(configurationPass.Compatible, configurationPass.Enabled, False)
+ Case "auditUser"
+ auditUser.Enabled = configurationPass.Compatible
+ auditUser.Checked = If(configurationPass.Compatible, configurationPass.Enabled, False)
+ Case "oobeSystem"
+ oobeSystem.Enabled = configurationPass.Compatible
+ oobeSystem.Checked = If(configurationPass.Compatible, configurationPass.Enabled, False)
+ End Select
+ Next
+ End If
+ End Sub
+
+ Private Sub LinkLabel5_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel5.LinkClicked
+ Process.Start("https://learn.microsoft.com/en-us/windows-hardware/customize/desktop/unattend/components-b-unattend")
+ End Sub
+
+ Sub ConfigureComponent(componentName As String, componentPass As String, componentPassEnabled As Boolean)
+ If String.IsNullOrWhiteSpace(componentName) Then Exit Sub
+ If String.IsNullOrWhiteSpace(componentPass) Then Exit Sub
+ Dim componentNames As New List(Of String)
+ Dim knownPasses As New Dictionary(Of String, Boolean)
+ knownPasses.Add("offlineServicing", False)
+ knownPasses.Add("windowsPE", False)
+ knownPasses.Add("generalize", False)
+ knownPasses.Add("specialize", False)
+ knownPasses.Add("auditSystem", False)
+ knownPasses.Add("auditUser", False)
+ knownPasses.Add("oobeSystem", False)
+ For Each systemComponent As Component In SystemComponents
+ componentNames.Add(systemComponent.Id)
+ Next
+ ' Determine if the passed component ID "componentName" exists in the grabbed components
+ If componentNames.Contains(componentName) Then
+ Dim placementIndex As Integer = componentNames.IndexOf(componentName)
+ ' Grab pass to configure and configure it
+ If Not knownPasses.ContainsKey(componentPass) Then
+ MsgBox("The component pass " & componentPass & " does not exist in the pass list", vbOKOnly + vbCritical, Text)
+ Exit Sub
+ End If
+ Dim editedPass As Pass = SystemComponents(placementIndex).Passes.FirstOrDefault(Function(p) p.Name = componentPass)
+ If editedPass IsNot Nothing Then
+ editedPass.Enabled = componentPassEnabled
+ Debug.WriteLine("The pass " & Quote & componentPass & Quote & " of the component " & Quote & SystemComponents(placementIndex).Id & Quote & " has been " & If(SystemComponents(placementIndex).Passes.FirstOrDefault(Function(p) p.Name = componentPass).Enabled, "enabled", "disabled"))
+ Else
+
+ End If
+ Else
+ MsgBox("The component " & componentName & " does not exist in the component list", vbOKOnly + vbCritical, Text)
+ Exit Sub
+ End If
+ End Sub
+
+ Private Sub oobeSystem_CheckedChanged(sender As Object, e As EventArgs) Handles oobeSystem.CheckedChanged
+ ConfigureComponent(ListBox2.SelectedItem, "oobeSystem", oobeSystem.Checked)
+ End Sub
+
+ Private Sub auditUser_CheckedChanged(sender As Object, e As EventArgs) Handles auditUser.CheckedChanged
+ ConfigureComponent(ListBox2.SelectedItem, "auditUser", auditUser.Checked)
+ End Sub
+
+ Private Sub auditSystem_CheckedChanged(sender As Object, e As EventArgs) Handles auditSystem.CheckedChanged
+ ConfigureComponent(ListBox2.SelectedItem, "auditSystem", auditSystem.Checked)
+ End Sub
+
+ Private Sub generalize_CheckedChanged(sender As Object, e As EventArgs) Handles generalize.CheckedChanged
+ ConfigureComponent(ListBox2.SelectedItem, "generalize", generalize.Checked)
+ End Sub
+
+ Private Sub specialize_CheckedChanged(sender As Object, e As EventArgs) Handles specialize.CheckedChanged
+ ConfigureComponent(ListBox2.SelectedItem, "specialize", specialize.Checked)
+ End Sub
+
+ Private Sub offlineServicing_CheckedChanged(sender As Object, e As EventArgs) Handles offlineServicing.CheckedChanged
+ ConfigureComponent(ListBox2.SelectedItem, "offlineServicing", offlineServicing.Checked)
+ End Sub
+
+ Private Sub windowsPE_CheckedChanged(sender As Object, e As EventArgs) Handles windowsPE.CheckedChanged
+ ConfigureComponent(ListBox2.SelectedItem, "windowsPE", windowsPE.Checked)
+ End Sub
+
+ Function AreComponentListsEqual(list1 As List(Of Component), list2 As List(Of Component)) As Boolean
+ ' Check if the counts of both lists are the same
+ If list1.Count <> list2.Count Then Return False
+
+ ' Iterate through components in both lists
+ For i As Integer = 0 To list1.Count - 1
+ Dim component1 As Component = list1(i)
+ Dim component2 As Component = list2(i)
+
+ ' Compare component IDs
+ If component1.Id <> component2.Id Then Return False
+
+ ' Compare the number of passes in each component
+ If component1.Passes.Count <> component2.Passes.Count Then Return False
+
+ ' Compare each pass
+ For j As Integer = 0 To component1.Passes.Count - 1
+ Dim pass1 As Pass = component1.Passes(j)
+ Dim pass2 As Pass = component2.Passes(j)
+
+ ' Compare pass names and compatible states
+ If pass1.Name <> pass2.Name OrElse pass1.Enabled <> pass2.Enabled Then
+ Return False
+ End If
+ Next
+ Next
+
+ ' If all comparisons pass, the lists are equal
+ Return True
+ End Function
+
+ Function GetComponentDifferences(list1 As List(Of Component), list2 As List(Of Component)) As List(Of Component)
+ Dim differences As New List(Of Component)
+
+ ' Combine both lists to check for differences in either
+ Dim allComponents As List(Of Component) = list1.Concat(list2).GroupBy(Function(c) c.Id).Select(Function(g) g.First()).ToList()
+
+ For Each component In allComponents
+ ' Find the component in both lists
+ Dim component1 As Component = list1.FirstOrDefault(Function(c) c.Id = component.Id)
+ Dim component2 As Component = list2.FirstOrDefault(Function(c) c.Id = component.Id)
+
+ If component1 Is Nothing OrElse component2 Is Nothing Then
+ ' If a component is missing in one of the lists, it's different
+ differences.Add(component)
+ Else
+ ' Compare passes if the component exists in both lists
+ Dim differingComponent As New Component() With {.Id = component.Id}
+ For Each pass1 In component1.Passes
+ ' Find corresponding pass in component2
+ Dim pass2 As Pass = component2.Passes.FirstOrDefault(Function(p) p.Name = pass1.Name)
+
+ If pass2 Is Nothing OrElse pass1.Enabled <> pass2.Enabled Then
+ ' If pass is missing or its status is different, mark it as different
+ differingComponent.Passes.Add(pass1)
+ End If
+ Next
+
+ ' Only add the component if there are differing passes
+ If differingComponent.Passes.Count > 0 Then
+ differences.Add(differingComponent)
+ End If
+ End If
+ Next
+
+ Return differences
+ End Function
+
+ Private Sub LinkLabel6_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel6.LinkClicked
+ If File.Exists(Path.Combine(Environment.GetFolderPath(If(Environment.Is64BitOperatingSystem, Environment.SpecialFolder.ProgramFilesX86, Environment.SpecialFolder.ProgramFiles)),
+ "Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\WSIM\x86\imgmgr.exe")) Then
+ Process.Start(Path.Combine(Environment.GetFolderPath(If(Environment.Is64BitOperatingSystem, Environment.SpecialFolder.ProgramFilesX86, Environment.SpecialFolder.ProgramFiles)), "Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\WSIM\x86\imgmgr.exe"), Quote & SaveTarget & Quote)
+ End If
+ End Sub
+
+ Private Sub LinkLabel7_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel7.LinkClicked
+ Try
+ Scintilla1.Text = File.ReadAllText(SaveTarget)
+ Catch ex As Exception
+ MsgBox("Could not open file: " & ex.Message, vbOKOnly + vbCritical, Text)
+ Exit Sub
+ End Try
+
+ IsInExpress = False
+ StepsTreeView.Enabled = False
+ EditorPanelContainer.Visible = True
+ ExpressPanelContainer.Visible = False
+ ExpressPanelTrigger.BackColor = SidePanel.BackColor
+ ExpressPanelTrigger.ForeColor = If(MainForm.BackColor = Color.FromArgb(48, 48, 48), Color.LightGray, Color.Black)
+ PictureBox1.Image = If(MainForm.BackColor = Color.FromArgb(48, 48, 48), My.Resources.express_mode_select, My.Resources.express_mode)
+ EditorPanelTrigger.BackColor = Color.FromKnownColor(KnownColor.Highlight)
+ EditorPanelTrigger.ForeColor = Color.White
+ PictureBox2.Image = My.Resources.editor_mode_select
+ PictureBox3.Image = My.Resources.editor_mode_fc
+ Label3.Text = "Editor mode"
+ Label4.Text = "Create your unattended answer files from scratch and save them anywhere"
+ FooterContainer.Visible = False
+ End Sub
End Class
\ No newline at end of file
diff --git a/Tools/UnattendGen/win-x64/UnattendGen.dll b/Tools/UnattendGen/win-x64/UnattendGen.dll
index 9807517c..245ffc50 100644
Binary files a/Tools/UnattendGen/win-x64/UnattendGen.dll and b/Tools/UnattendGen/win-x64/UnattendGen.dll differ
diff --git a/Tools/UnattendGen/win-x64/UnattendGen.exe b/Tools/UnattendGen/win-x64/UnattendGen.exe
index e2ae08e8..ea725fdb 100644
Binary files a/Tools/UnattendGen/win-x64/UnattendGen.exe and b/Tools/UnattendGen/win-x64/UnattendGen.exe differ
diff --git a/Tools/UnattendGen/win-x64/UnattendGenerator.dll b/Tools/UnattendGen/win-x64/UnattendGenerator.dll
index 70bb90bc..e84e679c 100644
Binary files a/Tools/UnattendGen/win-x64/UnattendGenerator.dll and b/Tools/UnattendGen/win-x64/UnattendGenerator.dll differ
diff --git a/Tools/UnattendGen/win-x86/UnattendGen.dll b/Tools/UnattendGen/win-x86/UnattendGen.dll
index dd860101..614a6de1 100644
Binary files a/Tools/UnattendGen/win-x86/UnattendGen.dll and b/Tools/UnattendGen/win-x86/UnattendGen.dll differ
diff --git a/Tools/UnattendGen/win-x86/UnattendGen.exe b/Tools/UnattendGen/win-x86/UnattendGen.exe
index 5f876603..3a68c58c 100644
Binary files a/Tools/UnattendGen/win-x86/UnattendGen.exe and b/Tools/UnattendGen/win-x86/UnattendGen.exe differ
diff --git a/Tools/UnattendGen/win-x86/UnattendGenerator.dll b/Tools/UnattendGen/win-x86/UnattendGenerator.dll
index 70bb90bc..e84e679c 100644
Binary files a/Tools/UnattendGen/win-x86/UnattendGenerator.dll and b/Tools/UnattendGen/win-x86/UnattendGenerator.dll differ