修改PowerShell脚本导出指定OU下的AD用户与计算机
修正后的PowerShell脚本:指定OU列表导出用户/计算机成员
问题分析
你提供的原始脚本存在两个核心问题:
- 输入的
$OUlist是域名/层级路径格式,无法直接作为Get-ADUser/Get-ADComputer的-SearchBase参数(该参数需要AD对象的DistinguishedName格式) - 直接导出AD对象会包含大量冗余字段,无法生成你需要的
Name,Type极简CSV结构
完整修正脚本
# 定义目标OU列表(保持你习惯的输入格式) $OUlist = @( "domain.com/Site-A/OU1" "domain.com/Site-A/OU2" "domain.com/Site-B/OU1" "domain.com/Site-B/OU2" # 可继续添加更多OU路径 ) # 定义函数:将域名/OU路径转换为AD识别的DistinguishedName function ConvertTo-OUdn { param([string]$Path) $parts = $Path -split "/" $dnParts = @() # 处理OU层级部分(从倒数第2位到第1位) for ($i = $parts.Count - 2; $i -ge 0; $i--) { $dnParts += "OU=$($parts[$i])" } # 处理域名部分(最后一位,拆分后转为DC=格式) $domainParts = $parts[-1] -split "\." $dnParts += $domainParts | ForEach-Object { "DC=$_" } # 拼接为完整DN return $dnParts -join "," } # 遍历OU列表,收集用户和计算机并构造自定义输出对象 $results = $OUlist | ForEach-Object { $ouDn = ConvertTo-OUdn -Path $_ # 获取当前OU下的所有用户 Get-ADUser -Filter * -SearchBase $ouDn -Properties Name | ForEach-Object { [PSCustomObject]@{ Name = $_.Name Type = "User" } } # 获取当前OU下的所有计算机 Get-ADComputer -Filter * -SearchBase $ouDn -Properties Name | ForEach-Object { [PSCustomObject]@{ Name = $_.Name Type = "Computer" } } } # 导出到指定CSV文件 $results | Export-CSV "Result.csv" -NoTypeInformation -Encoding UTF8
关键修改说明
- OU路径转DN:通过
ConvertTo-OUdn函数自动将你输入的domain.com/Site-A/OU1格式转换为AD要求的OU=OU1,OU=Site-A,DC=domain,DC=com格式,无需手动编写DN。 - 自定义输出对象:不再直接导出AD原生对象,而是构造仅包含
Name和Type的自定义对象,完全匹配你需要的CSV结构。 - 编码优化:添加
-Encoding UTF8参数确保CSV在不同系统下的兼容性。
注意事项
- 运行脚本前需确保已加载Active Directory模块(可通过
Import-Module ActiveDirectory手动加载) - 执行脚本的账户需具备目标OU的读取权限
内容的提问来源于stack exchange,提问作者Senior Systems Engineer
相关产品推荐
相关产品推荐

