PowerShell调用Set-ADUser时Identity参数绑定失败问题求助
问题描述
我编写了一个PowerShell脚本,遍历Active Directory(AD)中的每位用户并生成变量$variableResult,所有步骤的日志输出均正常。最后一步需要将$variableResult写入AD用户的POBox属性,仅当属性值与$variableResult不同时执行覆盖操作,但执行时出现如下错误:
Set-ADUser: Cannot bind parameter 'Identity'. Cannot convert value "CN=xxx,OU=Windows 10,OU=UserAccounts,OU=xxx,OU=xxx,DC=xxx,DC=xxx" to type "Microsoft.ActiveDirectory.Management.ADUser". Error: "Cannot convert the "CN=xxx,OU=Windows 10,OU=UserAccounts,OU=xxx,OU=xxx,DC=xxx,DC=net" value of type "Deserialized.Microsoft.ActiveDirectory.Management.ADUser" to type "Microsoft.ActiveDirectory.Management.ADUser"."
变量$variableResult的存储值为:
PS > $variableResult HQCSHOFF
我已修改脚本仅查询自身账号,故意将AD中该账号的POBox设为错误值,本应触发脚本修正操作,却仍出现上述错误,相关代码如下:
if( $user.POBox -ne $variableResult ) { set-aduser $user -Replace @{POBox="$variableResult"} }
解决方案
错误原因
$user是反序列化的ADUser对象(类型为Deserialized.Microsoft.ActiveDirectory.Management.ADUser),而Set-ADUser的Identity参数仅接受原生ADUser对象(直接由Get-ADUser本地返回的对象)或用户的唯一标识(如DistinguishedName、SamAccountName、SID等)。反序列化对象无法被Set-ADUser直接识别绑定。
修复方法
有两种简单的修复方式:
使用用户唯一标识作为Identity参数
直接传入用户的DistinguishedName或SamAccountName,这两种标识都能被Set-ADUser正确识别:if( $user.POBox -ne $variableResult ) { # 使用DistinguishedName set-aduser -Identity $user.DistinguishedName -Replace @{POBox=$variableResult} }或者更简洁的SamAccountName:
if( $user.POBox -ne $variableResult ) { # 使用SamAccountName set-aduser -Identity $user.SamAccountName -Replace @{POBox=$variableResult} }确保获取原生ADUser对象
检查脚本中获取$user对象的逻辑,避免产生反序列化对象:- 不要通过
Export-Clixml/Import-Clixml序列化/反序列化用户对象 - 如果是远程执行获取的用户对象,改用本地直接调用
Get-ADUser,或者在远程会话内完成修改操作
- 不要通过
内容的提问来源于stack exchange,提问作者Bash
相关产品推荐
相关产品推荐

