如何转换PropertyValueCollection为字符串以导出RDS用户设置至CSV?
解决AD用户RDS属性导出CSV的类型转换问题
需求:获取特定OU中多个用户的Remote Desktop Services(RDS)设置并导出为CSV文件。遇到的问题是RDS相关属性属于PropertyValueCollection类型,无法直接用Export-Csv导出,尝试转换为字符串时触发如下错误:
+ ~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [], RuntimeException + FullyQualifiedErrorId : InvalidCastFromAnyTypeToString
错误原因
- 当用户未配置RDS属性时,
$UserInfo.TerminalServicesProfilePath这类属性本身为null,访问其.Value属性会引发异常 - 即使属性存在,直接对
.Value使用ForEach-Object { [string]$_ }的转换方式冗余且容易在空值场景下出错
解决方案
方案1:安全访问ADSI属性并转换字符串
直接对ADSI属性进行字符串转换,无需访问.Value——ADSI对象的属性本身支持直接强制转换为字符串,空属性会返回空字符串,避免空值报错:
$rows = @() $Accounts = Get-ADUser -Filter * -SearchBase $OU -Properties * $Accounts | ForEach-Object { $user = $_ $UserInfo = [ADSI]"LDAP://$($user.distinguishedName)" # 直接转换为字符串,空属性自动返回空值 $TSProfilePath = [string]$UserInfo.TerminalServicesProfilePath $TSHomeDir = [string]$UserInfo.TerminalServicesHomeDirectory $TSHomeDrive = [string]$UserInfo.TerminalServicesHomeDrive $rows += [PSCustomObject]@{ User = $user.Name TSProfilePath = $TSProfilePath TSHomeDir = $TSHomeDir TSHomeDrive = $TSHomeDrive } } $rows | Export-Csv -Path "C:\doc.csv" -NoTypeInformation -Encoding UTF8
方案2:直接用Get-ADUser获取RDS属性(更高效)
无需借助ADSI,直接通过Get-ADUser的Properties参数指定需要的RDS属性,然后直接提取值:
# 指定需要的RDS属性,避免获取所有属性提升效率 $rdsProperties = 'TerminalServicesProfilePath', 'TerminalServicesHomeDirectory', 'TerminalServicesHomeDrive' Get-ADUser -Filter * -SearchBase $OU -Properties Name, $rdsProperties | Select-Object @{Name='User'; Expression={$_.Name}}, @{Name='TSProfilePath'; Expression={[string]$_.TerminalServicesProfilePath}}, @{Name='TSHomeDir'; Expression={[string]$_.TerminalServicesHomeDirectory}}, @{Name='TSHomeDrive'; Expression={[string]$_.TerminalServicesHomeDrive}} | Export-Csv -Path "C:\doc.csv" -NoTypeInformation -Encoding UTF8
说明
- 方案2无需额外创建ADSI连接,执行效率更高,且避免类型转换问题
- 添加
-Encoding UTF8参数可避免CSV文件中文乱码问题
内容的提问来源于stack exchange,提问作者closedcasketfuneral
相关产品推荐
相关产品推荐

