Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
932f123
Update assembly information
CodingWonders Apr 18, 2026
faf991b
[Fix] Handle possible uncaught exception
CodingWonders Mar 27, 2026
baba146
[Library] Update Markdig to version 1.1.2
CodingWonders Mar 27, 2026
01a9d6b
[Unattended answer file/ADDS] Add functionality to check presence of …
CodingWonders Mar 29, 2026
1064730
[PE Helper/PXE Helpers] Customize appearance of disabled buttons, dis…
CodingWonders Mar 31, 2026
e931313
[Enhance] Bring support for displaying driver information for Windows…
CodingWonders Apr 2, 2026
5faaf37
[Enhance] Improve reliability of online AppX removal
CodingWonders Apr 3, 2026
8be8dca
[Enhance] Improve online AppX removal
CodingWonders Apr 3, 2026
3c7fa24
[PE Helper] Don't show watermark twice
CodingWonders Apr 5, 2026
73ec060
Update server link (should no longer expire)
CodingWonders Apr 6, 2026
4851e7c
[PE Helper] WDS preparation script no more
CodingWonders Apr 6, 2026
09b459b
[PE Helper] Handle possible edge-case where it can bug out
CodingWonders Apr 9, 2026
4a583ea
[Fix] Fixed background worker exception
CodingWonders Apr 12, 2026
6520382
[Library] Update ManagedDism to version 6.0.0
CodingWonders Apr 17, 2026
253f1c7
[Unattended answer file/DTSS] Scripts from 0.8 previews backported
CodingWonders Apr 18, 2026
8cb8110
[Library] Update Markdig to version 1.1.3
CodingWonders Apr 20, 2026
c4012d9
[Library] Update Windows API Code Pack to version 8.0.15
CodingWonders Apr 20, 2026
1edfad4
[REL] Update What's New section
CodingWonders Apr 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 14 additions & 17 deletions DISMTools.vbproj
Original file line number Diff line number Diff line change
Expand Up @@ -81,28 +81,28 @@
<HintPath>packages\ini-parser.2.5.2\lib\net20\INIFileParser.dll</HintPath>
</Reference>
<Reference Include="Markdig, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\Markdig.1.1.1\lib\net462\Markdig.dll</HintPath>
<HintPath>packages\Markdig.1.1.3\lib\net462\Markdig.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Dism, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5bba90053b345501, processorArchitecture=MSIL">
<HintPath>packages\Microsoft.Dism.4.0.7\lib\net40\Microsoft.Dism.dll</HintPath>
<HintPath>packages\Microsoft.Dism.6.0.0\lib\net472\Microsoft.Dism.dll</HintPath>
</Reference>
<Reference Include="Microsoft.WindowsAPICodePack, Version=8.0.14.0, Culture=neutral, PublicKeyToken=8afb38e9204fc0a9, processorArchitecture=MSIL">
<HintPath>packages\WindowsAPICodePack.8.0.14\lib\net48\Microsoft.WindowsAPICodePack.dll</HintPath>
<Reference Include="Microsoft.WindowsAPICodePack, Version=8.0.15.1, Culture=neutral, PublicKeyToken=8afb38e9204fc0a9, processorArchitecture=MSIL">
<HintPath>packages\WindowsAPICodePack.8.0.15.1\lib\net48\Microsoft.WindowsAPICodePack.dll</HintPath>
</Reference>
<Reference Include="Microsoft.WindowsAPICodePack.Core, Version=8.0.14.0, Culture=neutral, PublicKeyToken=8afb38e9204fc0a9, processorArchitecture=MSIL">
<HintPath>packages\WindowsAPICodePack.8.0.14\lib\net48\Microsoft.WindowsAPICodePack.Core.dll</HintPath>
<Reference Include="Microsoft.WindowsAPICodePack.Core, Version=8.0.15.1, Culture=neutral, PublicKeyToken=8afb38e9204fc0a9, processorArchitecture=MSIL">
<HintPath>packages\WindowsAPICodePack.8.0.15.1\lib\net48\Microsoft.WindowsAPICodePack.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.WindowsAPICodePack.ExtendedLinguisticServices, Version=8.0.14.0, Culture=neutral, PublicKeyToken=8afb38e9204fc0a9, processorArchitecture=MSIL">
<HintPath>packages\WindowsAPICodePack.8.0.14\lib\net48\Microsoft.WindowsAPICodePack.ExtendedLinguisticServices.dll</HintPath>
<Reference Include="Microsoft.WindowsAPICodePack.ExtendedLinguisticServices, Version=8.0.15.1, Culture=neutral, PublicKeyToken=8afb38e9204fc0a9, processorArchitecture=MSIL">
<HintPath>packages\WindowsAPICodePack.8.0.15.1\lib\net48\Microsoft.WindowsAPICodePack.ExtendedLinguisticServices.dll</HintPath>
</Reference>
<Reference Include="Microsoft.WindowsAPICodePack.Sensors, Version=8.0.14.0, Culture=neutral, PublicKeyToken=8afb38e9204fc0a9, processorArchitecture=MSIL">
<HintPath>packages\WindowsAPICodePack.8.0.14\lib\net48\Microsoft.WindowsAPICodePack.Sensors.dll</HintPath>
<Reference Include="Microsoft.WindowsAPICodePack.Sensors, Version=8.0.15.1, Culture=neutral, PublicKeyToken=8afb38e9204fc0a9, processorArchitecture=MSIL">
<HintPath>packages\WindowsAPICodePack.8.0.15.1\lib\net48\Microsoft.WindowsAPICodePack.Sensors.dll</HintPath>
</Reference>
<Reference Include="Microsoft.WindowsAPICodePack.Shell, Version=8.0.14.0, Culture=neutral, PublicKeyToken=8afb38e9204fc0a9, processorArchitecture=MSIL">
<HintPath>packages\WindowsAPICodePack.8.0.14\lib\net48\Microsoft.WindowsAPICodePack.Shell.dll</HintPath>
<Reference Include="Microsoft.WindowsAPICodePack.Shell, Version=8.0.15.1, Culture=neutral, PublicKeyToken=8afb38e9204fc0a9, processorArchitecture=MSIL">
<HintPath>packages\WindowsAPICodePack.8.0.15.1\lib\net48\Microsoft.WindowsAPICodePack.Shell.dll</HintPath>
</Reference>
<Reference Include="Microsoft.WindowsAPICodePack.ShellExtensions, Version=8.0.14.0, Culture=neutral, PublicKeyToken=8afb38e9204fc0a9, processorArchitecture=MSIL">
<HintPath>packages\WindowsAPICodePack.8.0.14\lib\net48\Microsoft.WindowsAPICodePack.ShellExtensions.dll</HintPath>
<Reference Include="Microsoft.WindowsAPICodePack.ShellExtensions, Version=8.0.15.1, Culture=neutral, PublicKeyToken=8afb38e9204fc0a9, processorArchitecture=MSIL">
<HintPath>packages\WindowsAPICodePack.8.0.15.1\lib\net48\Microsoft.WindowsAPICodePack.ShellExtensions.dll</HintPath>
</Reference>
<Reference Include="PresentationCore">
<Private>True</Private>
Expand Down Expand Up @@ -1368,9 +1368,6 @@
<None Include="Helpers\extps1\PE_Helper\pxehelpers\PXEHelpers.Startup.ps1">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Helpers\extps1\PE_Helper\pxehelpers\wds\prepare_wds.ps1">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Helpers\extps1\PE_Helper\pxehelpers\wds\wdshelper.ps1">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
Expand Down
13 changes: 9 additions & 4 deletions Elements/AutoUnattend/ActiveDirectory/ADDSJoinDialog.vb
Original file line number Diff line number Diff line change
Expand Up @@ -266,15 +266,20 @@ Public Class ADDSJoinDialog
End If
If TextBox6.Text = "" Then
Try
If DomainServicesModule.DSAccountHasRequiredPassword(dsDomainName, initialUserName) Then
MsgBox("A password must be specified as per security policies imposed by the domain controller", vbOKOnly + vbCritical)
If DomainServicesModule.DSAccountRequiresPassword(dsDomainName, initialUserName) Then
MsgBox(String.Format("A password for the specified user, {0}{1}{0}, must be specified as per security policies imposed by the domain controller.", Quote, initialUserName), vbOKOnly + vbCritical)
Return False
End If
Catch ex As Exception
MsgBox("A password must be specified as per security policies imposed by the domain controller", vbOKOnly + vbCritical)
MsgBox(String.Format("A password for the specified user, {0}{1}{0}, must be specified as per security policies imposed by the domain controller.", Quote, initialUserName), vbOKOnly + vbCritical)
Return False
End Try

End If
If dsIsInDomain AndAlso Not DomainServicesModule.DSAccountExists(dsDomainName, initialUserName) Then
If MsgBox(String.Format("The specified user, {1}, does not appear to exist in the provided domain. You may not be able to sign in with this user unless you create it first.{0}{0}" &
"Do you want to continue?", Environment.NewLine, initialUserName), vbYesNo + vbExclamation, Text) = MsgBoxResult.No Then
Return False
End If
End If
Return MsgBox("Please verify the information that you typed. If you incorrectly typed a field, the client device may not join the domain." & CrLf & CrLf & "The client device will also not join the domain if it will run home editions of Windows." & CrLf & CrLf & "Are you sure that these settings are correct?", vbYesNo + vbQuestion, "Verify Settings") = MsgBoxResult.Yes
End Select
Expand Down
33 changes: 32 additions & 1 deletion Elements/AutoUnattend/ActiveDirectory/DomainServicesModule.vb
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ Module DomainServicesModule
''' done via Active Directory Users and Computers (dsa.msc) by enabling all advanced features first, then selecting a user and then selecting the
''' "Attribute Editor" tab.
''' </remarks>
Public Function DSAccountHasRequiredPassword(dsDomainDnsName As String, accName As String) As Boolean
Public Function DSAccountRequiresPassword(dsDomainDnsName As String, accName As String) As Boolean
DynaLog.LogMessage("Preparing to determine if the specified account requires a password...")
DynaLog.LogMessage("- Domain Name (DNS/Windows 2000+): " & dsDomainDnsName)
DynaLog.LogMessage("- SAM account name: " & accName)
Expand Down Expand Up @@ -328,4 +328,35 @@ Module DomainServicesModule
Return passwdReqdStatus
End Function

''' <summary>
''' Determines whether an account exists in a domain.
''' </summary>
''' <param name="dsDomainDnsName">The name of the domain in DNS (eg: dismtools.local)</param>
''' <param name="accName">The SAM (Windows NT) representation of the account</param>
''' <returns>Whether the account exists in the domain</returns>
''' <remarks></remarks>
Public Function DSAccountExists(dsDomainDnsName As String, accName As String) As Boolean
DynaLog.LogMessage("Preparing to determine if the specified account exists...")
DynaLog.LogMessage("- Domain Name (DNS/Windows 2000+): " & dsDomainDnsName)
DynaLog.LogMessage("- SAM account name: " & accName)
If dsDomainDnsName = "" Or accName = "" Then Return False
Dim dsaExists As Boolean = False

DynaLog.LogMessage("Getting LDAP representation of DNS name for query...")
Dim ldapPath As String = GetLdapPathFromDnsName(dsDomainDnsName)

Try
DynaLog.LogMessage("Beginning to search user...")
Dim startingPoint As DirectoryEntry = New DirectoryEntry(String.Format("LDAP://{0}", ldapPath))
Dim searcher As DirectorySearcher = New DirectorySearcher(startingPoint)
searcher.Filter = String.Format("(&(objectCategory=user)(objectClass=user)(samAccountName={0}))", accName)
dsaExists = searcher.FindAll().Cast(Of SearchResult)().Any()
searcher.Dispose()
Catch ex As Exception

End Try

Return dsaExists
End Function

End Module
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Language: Batch
Name: Disable Shutdown Event Tracker
Description: This script disables the shutdown event tracker on Windows Server

@echo off
REM This script disables Shutdown Event Tracker

reg add "HKLM\Software\Policies\Microsoft\Windows NT\Reliability" /f /v ShutdownReasonOn /t REG_DWORD /d 0
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Language: Batch
Name: Disable Unsigned RDP file Warnings
Description: This script turns off warnings for unsigned RDP files in the latest Windows updates. Only use this script if you work with RDP connections to your machines.
@ECHO OFF
REM This script turns off warnings for unsigned RDP files when attempting to connect to remote
REM hosts. These warnings were introduced with the latest Windows 10 (KB5082200) and Windows
REM 11 (KB5083769/KB5082052) updates and can cause convenience issues when working with RDP
REM sessions.

REM As this modifies security preferences in a Windows component, you need to be sure that
REM the hosts you connect to on your day-to-day basis are not malicious. All in all, any
REM "security" feature pales in comparison to common sense.

REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client" /F /V RedirectionWarningDialogVersion /T REG_DWORD /D 1

REM adding it to HKU\.DEFAULT does not seem to work; try loading default user NTUSER
REG LOAD HKLM\zNTUSER "%SYSTEMDRIVE%\Users\Default\NTUSER.DAT"
IF %ERRORLEVEL% EQU 0 (
REG ADD "HKLM\zNTUSER\Software\Microsoft\Terminal Server Client" /F /V RdpLaunchConsentAccepted /T REG_DWORD /D 1
REG UNLOAD HKLM\zNTUSER
)

REM Brought to you by "Los Piratillas"
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Language: Batch
Name: Disable Windows Admin Center/Azure Arc banner
Description: This script disables the initial Server Manager banner promoting Windows Admin Center and Azure Arc (Windows Server 2022 onwards.)

@echo off
REM This script disables banners in Server Manager

reg add "HKLM\Software\Microsoft\ServerManager" /f /v DoNotPopWACConsoleAtSMLaunch /t REG_DWORD /d 1
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
Language: Batch
Name: Configure Start Menu Appearance
Description: This script allows you to customize the default view used by the Start menu. This requires Windows 11 24H2 or newer, and the new Start menu to be present.

@ECHO OFF

REM This script lets you configure the default view used by the Start menu using one of the following
REM values:
REM 0 -- Category View
REM 1 -- Grid View
REM 2 -- List View
REM This script requires Windows 11, version 24H2 or later, plus the new Start menu, to function. The
REM new Start menu is still under gradual rollout. You can use this script even if your Windows image
REM still uses the old Start menu, but the setting will not take effect until it is replaced.

SET _StartMenuView=2

REM leave the rest of the script as is
IF NOT DEFINED _StartMenuView SET _StartMenuView=2

IF %_StartMenuView% LSS 0 SET _StartMenuView=0 ELSE IF %_StartMenuView% GTR 2 SET _StartMenuView=2
REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Start" /F /V AllAppsViewMode /T REG_DWORD /D %_StartMenuView%
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Language: PowerShell
Name: Refresh Windows Explorer
Description: This starter script automatically reloads the Windows Explorer workspace to apply certain user settings without fully restarting it. Use this script as many times as you need, making sure you use it immediately after a script.
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class Shell32 {
[DllImport("shell32.dll")]
public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
}
"@

$SHCNE_ASSOCCHANGED = 0x8000000
$SHCNF_IDLIST = 0x0

[Shell32]::SHChangeNotify($SHCNE_ASSOCCHANGED, $SHCNF_IDLIST, [IntPtr]::Zero, [IntPtr]::Zero)
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
Language: Batch
Name: Set File Explorer Launch Folder
Description: This script configures the folder, or view, that is automatically loaded by the File Explorer on startup. This works on Windows 10 and 11

@echo off
REM This script configures the folder that is automatically loaded
REM by the File Explorer on startup, based on what you choose from
REM this list:
REM 0 -- Quick Access (Windows 10)/Home (Windows 11)
REM 1 -- This PC

SET _LaunchTo=1

REM leave the rest of the script as is
IF NOT DEFINED _LaunchTo SET _LaunchTo=1

IF %_LaunchTo% LSS 0 SET _LaunchTo=0
IF %_LaunchTo% GTR 1 SET _LaunchTo=1

reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /f /v LaunchTo /t REG_DWORD /d %_LaunchTo%
4 changes: 2 additions & 2 deletions Helpers/extps1/PE_Helper/files/scripts/imagecapture.bat
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ if /i "%sourcedrive%" equ "NET" (

set /p "destip=Please enter the UNC path (e.g. \\192.168.1.10\Share): "
if not defined destip (goto :main)
set /p destuser=Please enter the username:
set /p destpassword=Please enter the password:
set /p "destuser=Please enter the username: "
set /p "destpassword=Please enter the password: "

echo Connecting to network share...
IF %_DEBUG% EQU 1 echo Running net use...
Expand Down
7 changes: 6 additions & 1 deletion Helpers/extps1/PE_Helper/files/startup/startnet.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,12 @@ if !ERRORLEVEL! equ 1 (
)
)
if exist "%sysdrive%\ShowWatermark.ps1" (
start /b powershell -file "%sysdrive%\ShowWatermark.ps1"
SET ShowWatermark=0
reg query "HKLM\SOFTWARE\DISMTools\Preinstallation Environment" /v DRY_Watermark >nul 2>&1
IF !ERRORLEVEL! NEQ 0 (
start /b powershell -file "%sysdrive%\ShowWatermark.ps1"
reg add "HKLM\SOFTWARE\DISMTools\Preinstallation Environment" /f /v DRY_Watermark /t REG_DWORD /d 1 >nul 2>&1
)
)
if %debug% lss 2 if exist "%sysdrive%\SysprepPrepTool" (
if exist "%sysdrive%\scripts\imagecapture.bat" (
Expand Down
8 changes: 8 additions & 0 deletions Helpers/extps1/PE_Helper/pxehelpers/fog/foghelper_server.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,10 @@ try {
font-size: 1.125em;
font-family: "Trebuchet MS", "Arial", "Helvetica", sans-serif;
}
button:disabled {
background-color: darkgray;
color: white;
}
.important_tab {
font-weight: bold;
}
Expand Down Expand Up @@ -518,6 +522,10 @@ try {
function invokeExit() {
fetch('/api/exit', { method: "GET" });
alert("The server has stopped. Close this tab now.");
let buttons = document.getElementsByTagName("button");
for (let i = 0; i < buttons.length; i++) {
buttons[i].disabled = true;
}
}

function invokeLogViewer() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,10 @@ try {
font-size: 1.125em;
font-family: "Trebuchet MS", "Arial", "Helvetica", sans-serif;
}
button:disabled {
background-color: darkgray;
color: white;
}
.important_tab {
font-weight: bold;
}
Expand Down Expand Up @@ -456,6 +460,10 @@ try {
function invokeExit() {
fetch('/api/exit', { method: "GET" });
alert("The server has stopped. Close this tab now.");
let buttons = document.getElementsByTagName("button");
for (let i = 0; i < buttons.length; i++) {
buttons[i].disabled = true;
}
}

function invokeLogViewer() {
Expand Down
Loading