基于CSV导入与AD Office属性通配符匹配批量迁移用户至多个OU
Active Directory Office属性通配符匹配及脚本修正方案
通配符匹配可行性
AD的office属性(LDAP原生属性名为physicalDeliveryOfficeName)完全支持LDAP通配符*做模糊查询:
- 匹配属性值包含
Remote关键词:(physicalDeliveryOfficeName=*Remote*) - 匹配属性值开头为
Remote:(physicalDeliveryOfficeName=Remote*) - 匹配属性值结尾为
Remote:(physicalDeliveryOfficeName=*Remote)
注意:编写LDAP查询语句时必须使用原生属性名physicalDeliveryOfficeName,不能直接用PowerShell AD模块显示的别名Office,否则查询会失效。
现有脚本问题修正
你当前脚本的核心逻辑是先定位单个用户,再根据用户的Office属性移动到对应OU,不需要在用户查询阶段加Office通配符,只需要修正Office值和映射表的匹配逻辑,就能处理包含Remote关键词的Office属性值。修正后的完整脚本如下:
$map = @{ 'China' = "China OU DistinguishedName" 'Russia' = "Russia OU DistinguishedName" 'US - Miami' = "Miami OU DistinguishedName" 'US - Tampa' = "Tampa OU DistinguishedName" 'US - Reno' = "Reno OU DistinguishedName" 'US - Charleston' = "Charleston OU DistinguishedName" # 如需将所有含Remote标识的用户统一移动到专属OU,保留该行配置即可 'Remote' = "Remote Users OU DistinguishedName" } foreach($line in Import-Csv "C:\Test\Test Files\AD_Test.csv") { $firstname = $line.'Legal First Name'.Trim() $preferred_firstname = $line.'Preferred First Name'.Trim() if($preferred_firstname){ $firstname = $preferred_firstname } $lastname = $line.'Last Name'.Trim() $displayname = $firstname + " " + $lastname $param = @{ # 按通用名、登录名、显示名三类标识匹配目标用户 LDAPFilter = "(|(cn=$displayName)(samAccountName=$displayName)(displayName=$displayName))" Properties = "Office" } if($user = Get-ADUser @param) { # 优先匹配Remote规则,处理Office值包含Remote关键词的场景 if($user.Office -match 'Remote') { $targetOU = $map['Remote'] } # 非Remote场景走原有精确匹配逻辑 elseif($map.ContainsKey($user.Office)) { $targetOU = $map[$user.Office] } else { Write-Warning "无法识别用户 $displayName 的Office值:$($user.Office),跳过移动操作" continue } $user | Move-ADObject -TargetPath $targetOU continue } Write-Warning "在AD中未找到用户:$displayName" }
补充:直接查询所有含Remote关键词的用户命令
如果需要批量拉取所有Office属性包含Remote的用户,直接运行以下命令即可:
Get-ADUser -LDAPFilter "(physicalDeliveryOfficeName=*Remote*)" -Properties Office
内容的提问来源于stack exchange,提问作者whitemagic
相关产品推荐
相关产品推荐

