PowerShell自动化AD用户创建脚本运行提示属性值不在可接受范围
报错根因分析
- 首要触发原因:AD用户的
Initials(姓名缩写)属性值超出限制。AD要求该属性最长仅支持2个字符,你代码中生成$Init变量的语法存在错误,导致生成的字符串远超过长度限制:
你写的$TwoLetter = "$Prenom.Substring(0,2)"、$FirstLetterName = "$Nom.Substring(0,1)"、$Init = "$TwoLetter$FirstLetterName.ToUpper()"存在统一逻辑错误:PowerShell双引号内直接写对象方法不会被执行,只会被当成普通字符串拼接。比如$Prenom输入为Jean时,$TwoLetter实际输出是Jean.Substring(0,2)而非预期的je,拼接后$Init的长度可达十几字符,完全超出AD限制。 - 其他可能触发该报错的原因:
- 生成的
$Username长度超过20字符:AD的SamAccountName属性最大长度限制为20个字符 - 输入的密码不符合域密码策略要求:长度、复杂度、历史重复等规则不满足
- 指定的OU路径
OU=LBC-USERS,DC=lbcdom,DC=local不存在,或者执行脚本的账号没有该OU的写权限
- 生成的
排查步骤
在New-ADUser代码前加入变量校验代码,确认参数合法性:
Write-Host "用户名:$Username,长度:$($Username.Length)" Write-Host "姓名缩写:$Init,长度:$($Init.Length)" Write-Host "OU路径是否存在:$([adsi]::Exists("LDAP://$Chemin"))"
执行后确认:
- $Username长度是否≤20
- $Init长度是否≤2
- OU路径校验是否返回True
修复后完整代码
修正变量生成逻辑,增加边界校验避免属性值超出范围:
Import-Module ActiveDirectory $Prenom = Read-Host "Merci de rentrer le prénom de l'utilisateur à créer " $Nom = Read-Host "Merci de rentrer le nom de l'utilisateur à créer " $Password = Read-Host "Merci de rentrer le mot de passe en respectant la politique actuel " $Description = Read-Host "Merci de rentrer l'intitulé du poste " # 修正变量生成逻辑,去掉多余双引号,增加长度限制 $FirstLetter = $Prenom.Substring(0,1).ToLower() # 兼容单字名字的取字符逻辑 $TwoLetter = $Prenom.Length -ge 2 ? $Prenom.Substring(0,2).ToLower() : $Prenom.Substring(0,1).ToLower() $FirstLetterName = $Nom.Substring(0,1).ToUpper() $NomMinuscule = $Nom.ToLower() # 用户名截断到20字符以内,符合SamAccountName限制 $Username = "$FirstLetter$NomMinuscule".Substring(0, [Math]::Min(20, "$FirstLetter$NomMinuscule".Length)) # 缩写控制在2字符以内,符合AD限制 $Init = "$($TwoLetter.Substring(0,1))$FirstLetterName" $Chemin = "OU=LBC-USERS,DC=lbcdom,DC=local" # 前置校验避免非法值 if (-not [adsi]::Exists("LDAP://$Chemin")) { Write-Error "指定的OU路径不存在,请检查路径配置" exit 1 } if ($Init.Length -gt 2) { $Init = $Init.Substring(0,2) } New-ADUser -SamAccountName $Username ` -UserPrincipalName "$Username@lbcdom.local" ` -Name "$Prenom $Nom" ` -GivenName $Prenom ` -Surname $Nom ` -Enabled $True ` -DisplayName "$Nom, $Prenom" ` -AccountPassword (convertto-securestring $Password -AsPlainText -Force) ` -Description $Description ` -Initials $Init ` -EmailAddress "$NomMinuscule@leboncandidat.fr" ` -ProfilePath "\\SRV-WINLBC\Profils_itinerants\$Username" ` -Path $Chemin ` -ChangePasswordAtLogon $false ` -PasswordNeverExpires $true ` -CannotChangePassword $true Write-Warning "Bravo! L'utilisateur : $Username est cree."
内容的提问来源于stack exchange,提问作者Yarka
相关产品推荐
相关产品推荐

