@@ -2342,6 +2342,59 @@ trim() {
23422342 sed -e ' s/^[[:space:]]*//' -e ' s/[[:space:]]*$//'
23432343}
23442344
2345+ assert_username_valid () {
2346+ if ! msg=$( is_username_valid) ; then
2347+ error_and_exit " $msg "
2348+ fi
2349+ }
2350+
2351+ is_username_valid () {
2352+ # https://learn.microsoft.com/windows-hardware/customize/desktop/unattend/microsoft-windows-shell-setup-useraccounts-localaccounts-localaccount-name
2353+ # 不能为 none [ ] / \ : | < > + = ; , ? * % @
2354+
2355+ # 账号为空,则使用 Administrator
2356+ if [ -z " $username " ]; then
2357+ echo " Username: Will use the built-in Administrator account in ISO language."
2358+ return 0
2359+ fi
2360+
2361+ if [ " $( to_lower <<< " $username" ) " = none ]; then
2362+ echo " Username: Do not use the name \" NONE\" , this is a restricted username."
2363+ return 1
2364+ fi
2365+
2366+ if grep -q ' [][/\:|<>+=;,?*%@]' <<< " $username" ; then
2367+ echo " Username: Do not use any of the following characters: / \ [ ] : | < > + = ; , ? * % @"
2368+ return 1
2369+ fi
2370+
2371+ # 如果输入以下用户名则忽略,并使用系统内置的 Administrator 账号
2372+ # 防止系统有两个不同语言的 Administrator 账号而造成困扰
2373+ for builtin_username in \
2374+ administrator \
2375+ administrador \
2376+ administrateur \
2377+ administratör \
2378+ администратор \
2379+ järjestelmänvalvoja \
2380+ rendszergazda; do
2381+ if [ " $( to_lower <<< " $username" ) " = " $builtin_username " ]; then
2382+ echo " Username: Will use the built-in Administrator account in ISO language."
2383+ unset username
2384+ return 0
2385+ fi
2386+ done
2387+ }
2388+
2389+ prompt_username () {
2390+ info " prompt username"
2391+ warn false " Leave blank to use Administrator"
2392+ warn false " 不填写则使用 Administrator"
2393+ IFS= read -r -p " Username: " username
2394+ username=" $( printf " %s" " $username " | trim) "
2395+ assert_username_valid
2396+ }
2397+
23452398prompt_password () {
23462399 info " prompt password"
23472400 warn false " Leave blank to use a random password."
@@ -3118,7 +3171,7 @@ build_extra_cmdline() {
31183171 # https://salsa.debian.org/installer-team/rootskel/-/blob/master/src/lib/debian-installer-startup.d/S02module-params?ref_type=heads
31193172 for key in confhome hold force_boot_mode force_cn force_old_windows_setup cloud_image main_disk \
31203173 elts deb_mirror \
3121- ssh_port rdp_port web_port allow_ping; do
3174+ username ssh_port rdp_port web_port allow_ping; do
31223175 value=${! key}
31233176 if [ -n " $value " ]; then
31243177 is_need_quote " $value " &&
@@ -4312,6 +4365,7 @@ for o in ci installer debug minimal allow-ping force-cn help \
43124365 img: \
43134366 cloud-data: \
43144367 lang: \
4368+ user: username: \
43154369 passwd: password: \
43164370 ssh-port: \
43174371 ssh-key: public-key: \
@@ -4446,6 +4500,14 @@ while true; do
44464500 force_boot_mode=$2
44474501 shift 2
44484502 ;;
4503+ --user | --username)
4504+ if ! [ " $distro " = windows ]; then
4505+ error_and_exit " $1 is only supported for installing Windows."
4506+ fi
4507+ username=" $( printf " %s" " $2 " | trim) "
4508+ assert_username_valid
4509+ shift 2
4510+ ;;
44494511 --passwd | --password)
44504512 [ -n " $2 " ] || error_and_exit " Need value for $1 "
44514513 password=$2
@@ -4621,6 +4683,11 @@ done
46214683# 检查必须的参数
46224684verify_os_args
46234685
4686+ # 用户名
4687+ if [ " $distro " = windows ] && [ -z " $username " ]; then
4688+ prompt_username
4689+ fi
4690+
46244691# 密码
46254692if ! is_netboot_xyz && [ -z " $ssh_keys " ] && [ -z " $password " ]; then
46264693 if is_use_dd; then
@@ -4900,7 +4967,7 @@ info 'info'
49004967echo " $distro $releasever "
49014968
49024969case " $distro " in
4903- windows) username=administrator ;;
4970+ windows) username=${username :- administrator} ;;
49044971netboot.xyz) username= ;;
49054972dd | * ) username=root ;;
49064973esac
0 commit comments