修改远程桌面服务主目录PowerShell脚本异常问题求助
解决AD用户RDS主目录路径变量引用错误的问题
这是PowerShell字符串变量解析的典型小坑——你在拼接路径时没正确处理对象属性的引用,导致脚本把整个AD用户对象转换成了可分辨名称(DistinguishedName),再生硬加上.SamAccountName后缀,才出现了那个不符合预期的奇怪路径。
问题根源
在双引号字符串中,直接写$_.SamAccountName时,PowerShell会先把$_(当前遍历的AD用户对象)默认转换成字符串(也就是用户的DistinguishedName),再拼接.SamAccountName,最终路径就变成了\\SERVERNAME\ts-CN=Testuser,OU=Test,...SamAccountName,完全偏离了你的需求。
修正后的ADSI版本脚本
只需要用子表达式$()包裹属性引用,确保PowerShell正确解析SamAccountName的实际值:
Get-ADUser -Filter * -SearchBase 'OU=Test,OU=Users,DC=contoso,DC=com' | ForEach-Object { $user = [ADSI]"LDAP://$($_.DistinguishedName)" $user.psbase.InvokeSet("TerminalServicesHomeDirectory", "\\SERVERNAME\ts-$($_.SamAccountName)") $user.SetInfo() }
更简洁的推荐方案
其实不用借助ADSI这么繁琐,直接用Set-ADUser cmdlet就能完成操作,代码更简洁也更贴合PowerShell的最佳实践:
Get-ADUser -Filter * -SearchBase 'OU=Test,OU=Users,DC=contoso,DC=com' | Set-ADUser -TerminalServicesHomeDirectory {"\\SERVERNAME\ts-$($_.SamAccountName)"}
这里用脚本块作为参数值,动态为每个用户生成对应的主目录路径,同样通过$()确保属性被正确解析。
运行修正后的脚本,AD里的路径就会正常显示为\\SERVERNAME\ts-你的SamAccountName了。
内容的提问来源于stack exchange,提问作者Gerald
相关产品推荐
相关产品推荐

