PowerShell调用InvokeSet报目录属性不在缓存、ADSI变量异常如何解决
问题原因
- 你观察到的
$User输出System.DirectoryServices.DirectoryEntry不属于异常,这是Write-Host输出DirectoryEntry类型对象的默认行为:Write-Host会直接调用对象的ToString()方法,而该类的ToString()默认返回类型全名,不会输出对象属性值。你可以直接输入$User不加Write-Host,或者调用$User.Name等具体属性验证对象是否正确绑定了AD用户。 - 真正触发
InvokeSet报错的原因是:EnableRemoteControl、TerminalServicesHomeDrive属于AD用户的终端服务扩展属性,默认不会被ADSI预加载到本地属性缓存中,因此调用InvokeSet时会提示找不到对应属性。
修复方案
方案1:调整现有ADSI写法
修改后代码如下:
# 设置远程控制权限 $LdapUser = "LDAP://" + (Get-ADUser $username).distinguishedName # 用可控方式绑定AD用户对象,启用安全认证 $User = New-Object System.DirectoryServices.DirectoryEntry($LdapUser, $null, $null, [System.DirectoryServices.AuthenticationTypes]::Secure) # 强制刷新属性缓存,加载所有用户扩展属性 $User.RefreshCache() # 修改终端服务属性 $User.InvokeSet("EnableRemoteControl",5) $User.InvokeSet("TerminalServicesHomeDrive","U:\") # 提交修改到AD $User.SetInfo()
方案2:使用ActiveDirectory模块原生方法(更稳定)
直接调用Set-ADUser操作属性,避免ADSI缓存问题:
# 导入AD模块(如已加载可省略) Import-Module ActiveDirectory # 批量替换用户属性 Set-ADUser -Identity $username -Replace @{ EnableRemoteControl = 5 TerminalServicesHomeDrive = "U:\" }
注意事项
- 确保运行脚本的账号拥有目标AD用户的属性写入权限,通常需要域管理员权限或被委派了用户属性编辑权限
- Windows Server 2008 R2及以上版本的域控默认已包含终端服务相关扩展属性,低版本域控需要先扩展AD架构
内容的提问来源于stack exchange,提问作者user16603959
相关产品推荐
相关产品推荐

