如何使用PowerShell替换LDAP目录中多值属性的单个指定值
问题原因
你遇到的问题是LDAP协议中Replace操作的默认逻辑导致的:针对多值属性使用Replace操作时,如果你只传入了单个新值,LDAP服务端会直接清空该属性的所有现有值,再把你传入的新值设为该属性的唯一值,所以你的另一个department值才会被删除。
你代码里调用的Contains()方法没有实际作用,它只是检查你当前创建的DirectoryAttributeModification对象里有没有对应值,不会对服务端已存的属性值做过滤。
正确实现方式
要实现单值替换不影响其他同属性值,需要拆分两个操作:
- 先删除指定的旧值
Research & Development - 再添加新值
Something Else
修改后的代码如下:
$r = New-Object -TypeName System.DirectoryServices.Protocols.ModifyRequest $r.DistinguishedName = "uid=e145871,ou=identities,ou=users,o=items,dc=company,dc=domain,dc=com" # 第一步:删除要替换的旧值 $delOldAttr = New-Object "System.DirectoryServices.Protocols.DirectoryAttributeModification" $delOldAttr.Name = "department" $delOldAttr.Operation = [System.DirectoryServices.Protocols.DirectoryAttributeOperation]::Delete $delOldAttr.Add("Research & Development") $r.Modifications.Add($delOldAttr) # 第二步:添加新的替换值 $addNewAttr = New-Object "System.DirectoryServices.Protocols.DirectoryAttributeModification" $addNewAttr.Name = "department" $addNewAttr.Operation = [System.DirectoryServices.Protocols.DirectoryAttributeOperation]::Add $addNewAttr.Add("SomethingElse") $r.Modifications.Add($addNewAttr) $result = $connection.SendRequest($r)
操作说明
- 针对多值属性的
Delete操作如果指定了具体值,只会删除匹配的单个值,不会清空整个属性 - 两个修改操作会在同一个LDAP修改请求里原子执行,不会出现中间状态
内容的提问来源于stack exchange,提问作者m4xh
相关产品推荐
相关产品推荐

