如何通过PowerShell重命名AD用户并移除用户名前缀clean1_
代码错误点
现有代码无法正确传参完成重命名,核心问题有三个:
foreach循环内误用$_取当前对象值:foreach迭代的当前对象存在于定义的$Usr变量中,$_仅在管道执行上下文生效,此处取值为空- 查询AD用户时仅返回了
Name属性,没有保留AD对象的唯一标识字段,Rename-ADObject无法定位到需要修改的目标用户 - 用户筛选规则不严谨:
-match"clean1_*"的正则写法无法精准匹配「名称以clean1_开头」的规则,且先拉取全量用户再本地过滤的执行效率很低
修正后可直接运行的代码
$mydomain = $env:USERDNSDOMAIN $str="" $str+='W'+$mydomain[1] $ds = $mydomain.Split('.') $dcs1=$ds[0].Substring(1)+"92-CAP" $path = "OU=Accounts,OU=IT,OU=$dcs1,DC=z,DC=if,DC=at,DC=net" # 直接在AD查询阶段过滤目标用户,仅返回需要的属性 $targetUsers = Get-ADUser -Filter "Name -like 'clean1_*'" -SearchBase $path foreach($Usr in $targetUsers) { # 生成移除前缀后的新名称:^锚定字符串开头,仅移除开头的clean1_,避免误删名称中间的同名字符 $newName = $Usr.Name -replace '^clean1_', '' # 传入目标对象标识+新名称执行重命名 Rename-ADObject -Identity $Usr.DistinguishedName -NewName $newName }
关键逻辑说明
- 新名称生成逻辑:
$Usr.Name -replace '^clean1_', ''会把当前用户名称开头的clean1_替换为空字符串,得到的结果就是移除前缀后的正确名称,可以直接传给-NewName参数 - 重命名时必须通过
-Identity参数指定要修改的AD对象,这里用用户的DistinguishedName作为唯一标识,不会出现定位错误 - 把过滤逻辑放到
Get-ADUser的-Filter参数中,由AD域控直接返回符合条件的用户,比拉取全量用户到本地再过滤的执行效率高很多,适合用户量大的OU场景
内容的提问来源于stack exchange,提问作者Empty Coder
相关产品推荐
相关产品推荐

