调用New-ADUser创建AD用户报“The parameter is incorrect”错误如何解决
AD批量创建用户报错解决方案
核心错误原因
- 多余的
Out-String调用:Import-Csv读取的CSV字段本身就是字符串类型,无需额外转换。Out-String会在每个字段值末尾添加换行符,AD用户属性不允许包含非法换行字符,这是触发参数错误的核心原因。 - 用户名(SamAccountName)未做长度校验:AD要求SamAccountName最大长度为20字符,若拼接后的用户名超出长度会触发报错。
Get-ADUser过滤语法不规范:使用脚本块作为过滤条件存在变量作用域异常风险,推荐使用字符串格式的过滤规则。- 若要启用Manager参数,不能直接传入CSV里的经理名称,需要先查询经理对应的AD对象标识(SamAccountName/可分辨名/SID)再赋值。
修正后的完整代码
# 存储CSV数据到变量 $ADUsers = Import-Csv C:\Users\username\Desktop\newusers.csv # 遍历CSV每一行 foreach ($User in $ADUsers) { # 直接读取字段,Trim清除可能的首尾空格 $fname = $User.fname.Trim() $lname = $User.lname.Trim() $jobtitle = $User.jobtitle.Trim() $department = $User.department.Trim() $manager = $User.manager.Trim() $pagernumber = $User.pagernumber.Trim() # 生成用户名,自动截断到20字符满足AD要求 $fn1 = $fname.Substring(0,1).ToLower() $username = "$fn1$lname".ToLower() if ($username.Length -gt 20) { $username = $username.Substring(0,20) } Write-Output "正在处理用户:$fname $lname,用户名:$username" # 检查用户是否已存在,使用字符串过滤规则 if (Get-ADUser -Filter "SamAccountName -eq '$username'" -ErrorAction SilentlyContinue) { Write-Warning "用户账号 $username 已在Active Directory中存在,跳过创建" continue } # 组装用户属性 $userProps = @{ SamAccountName = $username UserPrincipalName = "$username@你的实际域后缀.com" # 必须补全用户主体名,否则可能创建失败 Name = "$fname $lname" GivenName = $fname Surname = $lname Enabled = $True DisplayName = "$lname $fname" Company = "Companyname" AccountPassword = ConvertTo-SecureString "符合域复杂度要求的密码" -AsPlainText -Force HomeDrive = "X:" ScriptPath = "K32.exe" OtherAttributes = @{pager = $pagernumber} Title = $jobtitle Department = $department Description = $jobtitle # 若要启用经理字段,先查询经理AD对象,示例: # Manager = (Get-ADUser -Filter "Name -eq '$manager'").DistinguishedName # HomeDirectory = $folder } # 创建用户 New-ADUser @userProps Write-Output "用户 $username 创建成功" }
额外注意事项
- 请将代码中的
你的实际域后缀.com替换为真实域后缀,符合域复杂度要求的密码替换为满足域密码策略的密码,否则会因密码不符合要求创建失败。 - CSV的双引号是标准格式,
Import-Csv会自动处理,无需额外操作。
内容的提问来源于stack exchange,提问作者user16603959
相关产品推荐
相关产品推荐

