I normally deploy Windows version 1607 and just recently became acquainted with the post-1703 OOBE and Autologon settings regression.
OOBE will wipe autologon settings, if they are implemented during the same boot as setupcomplete.cmd. This nullifies scripted/touchless Windows 10 deployment methods.
Use setupcomplete.cmd and schtasks.exe to make a scheduled task that runs on the next start. Upon reboot, the scheduled task waits [an amount of time] before adding autologon settings, making a task to delete itself and reboot the computer, then running the task.
– Consolidate the solution implemented by others into one script/scheduledtask.
– Avoid unnecessarily long and inconsistent wait times.
– Designed to handle both windows 7 and windows 10 deployments.
– Use a secure method (as secure as possible with autologon)
@ECHO OFF :: Run this script as an onstart Scheduled Task created by setupcomplete.cmd, if implemented in a Windows 10 deployment :: Run this script directly from setupcomplete.cmd, if implemented in a Windows 7 deployment :: Include autologon.exe in the same directory as this script :: Account to use for autologon SET ACCOUNT=dummyuser SET PASSWORD=dummypassword PUSHD %~dp0 :: Check if windows 10 FOR /F "tokens=3" %%A IN ('REG QUERY "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /V "ReleaseId"') DO SET "RELEASEID=%%A" SET Key="HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" :: Avoid OOBE autologon regression, post win10 1703 IF 1%RELEASEID% GEQ 11703 ( REG ADD %KEY% /V AutoAdminLogon /T REG_SZ /D "1" /F :WAIT_FOR_CHANGE REG QUERY %KEY% /V AutoAdminLogon IF %ERRORLEVEL%==0 TIMEOUT /T 3 /NOBREAK>nul & GOTO WAIT_FOR_CHANGE ) :: Activate autologon REG DELETE %KEY% /V AutoLogonCount /F REG DELETE %KEY% /V DefaultUserName /F timeout /t 1 autologon -accepteula %ACCOUNT% . %PASSWORD% timeout /t 1 REG ADD %KEY% /V AutoAdminLogon /T REG_SZ /D "1" /F :: Cleanup scheduled task and restart, if win10 IF DEFINED RELEASEID ( START cmd /c TIMEOUT /T 1 & SCHTASKS /DELETE /TN Autologon /F & Shutdown /r /t 1 ) :: Delete itself (goto) 2>nul & del "%~f0"