无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 5433|回复: 43
打印 上一主题 下一主题

[分享] 使用SetupComplete.cmd代替unattend.xml实现无人值守安装系统

  [复制链接]
1#
发表于 2025-6-29 11:07:00 | 显示全部楼层
SetupComplete.cmd在系统安装完成后、首次登录前执行,按理说这时候修改SkipMachineOOBE和SkipUserOOBE为1已经晚了,如果自动应答文件和镜像注册表都没有SkipMachineOOBE和SkipUserOOBE的内容,是无法实现无人值守安装的。

点评

所言不错,但是确实可以这样做,实践出来的才是结论。  详情 回复 发表于 2025-6-29 23:21
回复

使用道具 举报

2#
发表于 2025-6-30 09:03:59 | 显示全部楼层
本帖最后由 hlowld 于 2025-6-30 09:45 编辑

如果楼主想要的是 “跳过OOBE,并自定义创建本地账户”,恰好前段时间也想过这个问题,分享一下我的方案
1、unattend.xml中跳过OOBE
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <unattend xmlns="urn:schemas-microsoft-com:unattend">
  3. <settings pass="oobeSystem">
  4. <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
  5. <InputLocale>zh-CN</InputLocale>
  6. <SystemLocale>zh-CN</SystemLocale>
  7. <UILanguage>zh-CN</UILanguage>
  8. <UserLocale>zh-CN</UserLocale>
  9. </component>
  10. <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
  11. <OOBE>
  12. <ProtectYourPC>3</ProtectYourPC>
  13. <HideEULAPage>true</HideEULAPage>
  14. <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
  15. <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
  16. <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
  17. <HideLocalAccountScreen>true</HideLocalAccountScreen>
  18. <SkipMachineOOBE>true</SkipMachineOOBE>
  19. <SkipUserOOBE>true</SkipUserOOBE>
  20. </OOBE>
  21. </component>
  22. </settings>
  23. </unattend>
复制代码

2、编写创建本地账户的批处理localaccount.cmd,倒计时10秒,若检测到按键,则交互界面创建账户后退出,否则创建admin空密码账户后退出
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. title 创建用户,请勿关闭本窗口

  4. for /l %%i in (10, -1, 1) do (
  5.     <nul set /p="将于 %%i 秒后自动创建 admin 空密码用户并退出,按任意键创建自定义用户 ..."
  6.     powershell.exe -noprofile -command "if ([console]::KeyAvailable) { $host.UI.RawUI.FlushInputBuffer(); exit 1 } else { exit 0 }" >nul 2>nul
  7.     if errorlevel 1 (cls & goto :want_uname)
  8.     ping 127.0.0.1 -n 1 -w 1000 >nul
  9.     cls
  10. )
  11. cls
  12. net user admin /add >nul 2>nul && (
  13.     net localgroup administrators admin /add >nul 2>nul && (echo 自动创建 admin 空密码用户成功,即将退出 & timeout /t 2 >nul & exit) || (net user admin /delete >nul 2>nul)
  14.     )
  15. echo 自动创建 admin 空密码用户失败,强制创建自定义用户
  16. :want_uname
  17. echo.
  18. set "uname="
  19. set /p uname=请键入用户名:
  20. if "%uname%" == "" goto want_uname
  21. :want_upass
  22. set "upass="
  23. for /f "delims=" %%P in ('powershell.exe -NoProfile -Command "$pwd = Read-Host ''请键入用户的密码'' -AsSecureString; [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd))"') do set "upass=%%P"
  24. set "upass2="
  25. for /f "delims=" %%P in ('powershell.exe -NoProfile -Command "$pwd = Read-Host ''请再键入一次密码以便确认'' -AsSecureString; [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd))"') do set "upass2=%%P"
  26. if "%upass%" neq "%upass2%" (echo 密码不匹配。 & goto want_upass)
  27. if "%upass%" equ "" (
  28.     net user %uname% /add >nul 2>nul && (
  29.         net localgroup administrators %uname% /add >nul 2>nul && (echo 创建 %uname% 用户成功,即将退出 & timeout /t 2 >nul & exit) || (echo 加入管理员群组失败 & net user %uname% /delete >nul 2>nul & goto want_uname)
  30.         ) || (echo 创建 %uname% 用户失败 & goto want_uname)
  31. ) else (
  32.     net user %uname% %upass% /add >nul 2>nul && (
  33.         net localgroup administrators %uname% /add >nul 2>nul && (echo 创建 %uname% 用户成功,即将退出 & timeout /t 2 >nul & exit) || (echo 加入管理员群组失败 & net user %uname% /delete >nul 2>nul & goto want_uname)
  34.         ) || (echo 创建 %uname% 用户失败 & goto want_uname)
  35. )
  36. exit
复制代码
3、SetupComplete.cmd中调用localaccount.cmd
  1. start /wait "localaccount" "%~dp0localaccount.cmd"
复制代码
4、挂载镜像Users\Default\ntuser.dat修改,禁止同意个人数据跨境传输界面
  1. reg load HKEY_USERS\uuu z:\Users\Default\ntuser.dat >nul 2>nul
  2. reg.exe add "HKEY_USERS\uuu\SOFTWARE\Microsoft\Windows\CurrentVersion\CloudExperienceHost\Intent\PersonalDataExport" /v "PDEShown" /t REG_DWORD /d "2" /f >nul 2>nul
  3. reg unload HKEY_USERS\uuu >nul 2>nul
复制代码
5、同理,可以编写修改计算机名的批处理computername.cmd并在SetupComplete.cmd中调用,倒计时10秒,若检测到按键,则交互界面修改计算机名后退出,否则修改为随机名称后退出。注意:修改计算机名重启后才能生效
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. title 设置计算机名,请勿关闭本窗口
  4. set "cname=WIN-%RANDOM%"
  5. for /l %%i in (10, -1, 1) do (
  6.     <nul set /p="将于 %%i 秒后自动设置计算机名为 %cname% 并退出,按任意键手工设置 ..."
  7.     powershell.exe -noprofile -command "if ([console]::KeyAvailable) { $host.UI.RawUI.FlushInputBuffer(); exit 1 } else { exit 0 }" >nul 2>nul
  8.     if errorlevel 1 (cls & goto :want_name)
  9.     ping 127.0.0.1 -n 1 -w 1000 >nul
  10.     cls
  11. )
  12. cls
  13. goto set_name
  14. :want_name
  15. echo.
  16. set "cname="
  17. set /p cname=请键入计算机名(字母、连字符和数字的组合):
  18. if "%cname%" == "" goto want_name
  19. :set_name
  20. powershell.exe -noprofile -command "Rename-Computer -NewName '%cname%'"  >nul 2>nul
  21. if errorlevel 0 (echo 设置计算机名为 %cname% 成功,即将退出 & timeout /t 2 >nul & exit)
  22. echo 设置计算机名为 %cname% 失败 & goto want_name
  23. exit
复制代码


当然,这些操作,都由一个批处理来自动实现,无需手动。


点评

SetupComplete无法和用户交互  详情 回复 发表于 2025-6-30 09:23
回复

使用道具 举报

3#
发表于 2025-6-30 09:35:18 | 显示全部楼层
nttwqz 发表于 2025-6-30 09:23
SetupComplete无法和用户交互

所以要另外写个批处理,SetupComplete.cmd用start /wait方式调用该批处理,就能界面交互。

点评

这个确实可以,我用过。  详情 回复 发表于 2025-6-30 09:39
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-12-23 17:05

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表