如何用PowerShell实现ADSI查询并导出用户属性到CSV
解决AD用户Terminal Services属性导出CSV的问题
你的代码核心问题是:foreach循环里先输出了仅包含Name和GivenName的对象,之后单独调用InvokeGet获取的属性值并没有被整合到输出对象中,最终CSV里只会有前两个字段,TS相关属性完全没被写入。
推荐方案:直接用Get-ADUser获取所有需要的属性
不需要借助ADSI,Get-ADUser可以直接读取这些Terminal Services相关的AD属性,只需在-Properties参数里指定对应的LDAP属性名即可:
AllowLogon对应LDAP属性名:allowLogonMaxConnectionTime对应LDAP属性名:maxConnectionTimeTerminalServicesWorkDirectory对应LDAP属性名:terminalServicesWorkDirectory
修正后的完整代码:
# 指定要查询的OU路径 $OU = "OU=Accounts,DC=domain,DC=local" # 一次性获取所有需要的属性,避免重复查询AD $Output = Get-ADUser -Filter * -SearchBase $OU -Properties allowLogon, maxConnectionTime, terminalServicesWorkDirectory | Select-Object Name, GivenName, @{Name='AllowLogon'; Expression={$_.allowLogon}}, @{Name='MaxConnectionTime'; Expression={$_.maxConnectionTime}}, @{Name='TerminalServicesWorkDirectory'; Expression={$_.terminalServicesWorkDirectory}} # 导出到CSV,添加-NoTypeInformation避免生成多余的类型头 $Output | Export-CSV C:\Temp\Output.csv -NoTypeInformation
方案优势
- 提升效率:原代码先批量获取用户,再逐个调用
Get-ADUser属于重复查询AD,此方案一次性完成所有查询,大幅减少AD请求次数。 - 属性映射清晰:通过计算属性将AD返回的LDAP属性名转换成你需要的显示名称,确保CSV列名符合预期。
- 输出更规范:加入
-NoTypeInformation参数,避免CSV开头生成多余的类型信息。
若坚持使用ADSI的修正版
如果必须用ADSI方式获取属性,需要将属性值整合到同一个输出对象中,示例代码如下:
$OU = "OU=Accounts,DC=domain,DC=local" $Accounts = Get-ADuser -Filter * -Searchbase $OU $Output = ForEach($Account in $Accounts){ # 获取基础用户信息 $adUser = Get-ADUser -Identity $Account -Properties Name, GivenName # 用ADSI绑定用户对象 $userADSI = [ADSI]("LDAP://" + $Account.distinguishedname) # 创建自定义对象整合所有属性 [PSCustomObject]@{ Name = $adUser.Name GivenName = $adUser.GivenName AllowLogon = $userADSI.psbase.InvokeGet("AllowLogon") MaxConnectionTime = $userADSI.psbase.InvokeGet("MaxConnectionTime") TerminalServicesWorkDirectory = $userADSI.psbase.InvokeGet("TerminalServicesWorkDirectory") } } $Output | Export-CSV C:\Temp\Output.csv -NoTypeInformation
此方式每个用户需两次查询AD,效率低于直接使用Get-ADUser,仅推荐在特殊场景下使用。
内容的提问来源于stack exchange,提问作者closedcasketfuneral
相关产品推荐
相关产品推荐

