如何将$i值作为新属性添加到AD用户对象且避免覆盖?
解决PowerShell脚本中OOU属性被覆盖的问题
你的核心问题是每次循环都对整个$users集合操作,导致之前用户的OOU属性被最后一次循环的$i覆盖。正确的做法是:在每次循环中,先单独处理当前获取的用户,给他们添加对应$i的OOU属性,再合并到总集合里。
修正后的完整脚本
param([string[]]$Country="Norway,Denmark") # 初始化用户集合,避免第一次+=报错 $users = @() foreach ($i in $Country) { # 先获取当前国家OU下的用户,存到临时变量 $currentUsers = Get-ADUser -SearchBase "ou=$i,ou=FMS,dc=ce,dc=xxxx,dc=net" ` -LDAPFilter $ldapfilter ` -Properties CN,SamAccountName,mail,title,department,company,pager,employeeNumber,distinguishedName,extensionAttribute12 # 给当前这批用户单独添加OOU属性,值为当前的$i $currentUsers | ForEach-Object { $_ | Add-Member -MemberType NoteProperty -Name "OOU" -Value $i -Force } # 把处理好的用户加到总集合 $users += $currentUsers } # 后续的license属性处理保留 $users | Add-Member -MemberType NoteProperty -Name "license" -Force -Value "" $users | Where-Object extensionAttribute12 -Like "*EOP1*" | ForEach-Object {$_.license="EOP1"} $users | Where-Object extensionAttribute12 -Like "*E1*" | ForEach-Object {$_.license="E1"} $users | Where-Object extensionAttribute12 -Like "*E3*" | ForEach-Object {$_.license="E3"}
关键修改点说明
- 初始化
$users集合:提前声明$users = @(),避免第一次执行$users +=时因为变量未定义报错。 - 临时变量存储当前用户:每次循环用
$currentUsers单独存当前OU的用户,避免直接操作总集合。 - 针对性添加OOU属性:只给本次循环获取的用户添加OOU属性,值为当前的
$i,这样不会影响之前已经处理好的用户。 - 合并到总集合:把处理完的
$currentUsers加到$users里,确保每个用户的OOU属性都是对应自己所在OU的$i值。
另外,如果你想简化后续的license赋值逻辑,也可以用Switch语句优化,效率更高:
$users | ForEach-Object { switch ($_.extensionAttribute12) { { $_ -like "*EOP1*" } { $_.license = "EOP1" } { $_ -like "*E1*" } { $_.license = "E1" } { $_ -like "*E3*" } { $_.license = "E3" } default { $_.license = "" } } }
内容的提问来源于stack exchange,提问作者Morten Lunde
相关产品推荐
相关产品推荐

