You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:46:01