如何用PowerShell获取AD中所有计算机的组归属并导出CSV?
导出AD所有计算机及其所属组到CSV的解决方案
你的问题主要出在两个点:
Get-ADComputer返回的MemberOf属性是组的LDAP路径(DistinguishedName),不是易读的组名,直接导出可读性极差;Get-ADPrincipalGroupMembership需要针对单个AD对象调用,不能直接跟Get-ADComputer -Filter *批量结合,必须遍历每台计算机处理。
下面提供两种满足需求的脚本,你可以根据报表格式选择:
方案1:每行对应一个“计算机-组”关系(推荐用于统计)
这个方案会把计算机的每个所属组单独占一行,方便后续筛选分析:
# 导入AD模块(部分环境可能需要手动加载) Import-Module ActiveDirectory # 初始化存储结果的数组 $output = @() # 遍历所有AD计算机 Get-ADComputer -Filter * -Properties Name, OperatingSystem, IPv4Address | ForEach-Object { $pc = $_ # 获取该计算机的所有所属组(包含直接组和嵌套组) $groups = Get-ADPrincipalGroupMembership -Identity $pc | Select-Object -ExpandProperty Name # 为每个组创建一条记录 if ($groups) { foreach ($group in $groups) { $output += [PSCustomObject]@{ 计算机名称 = $pc.Name 操作系统 = $pc.OperatingSystem IPv4地址 = $pc.IPv4Address 所属组名称 = $group } } } else { # 处理无所属组的计算机 $output += [PSCustomObject]@{ 计算机名称 = $pc.Name 操作系统 = $pc.OperatingSystem IPv4地址 = $pc.IPv4Address 所属组名称 = "无所属组" } } } # 导出到CSV,替换成你需要的路径 $output | Export-Csv -Path "C:\AD_计算机组报表.csv" -NoTypeInformation -Encoding UTF8
方案2:每行对应一台计算机,所有组名在同一列(用逗号分隔)
如果需要每台计算机只占一行,所有组名合并在同一列,用这个版本:
Import-Module ActiveDirectory Get-ADComputer -Filter * -Properties Name, OperatingSystem, IPv4Address, MemberOf | Select-Object @{Name='计算机名称'; Expression={$_.Name}}, @{Name='操作系统'; Expression={$_.OperatingSystem}}, @{Name='IPv4地址'; Expression={$_.IPv4Address}}, @{Name='所属组名称'; Expression={ # 将MemberOf中的LDAP路径转换为组名,并用逗号分隔 ($_.MemberOf | ForEach-Object { (Get-ADGroup $_).Name }) -join ', ' }} | Export-Csv -Path "C:\AD_计算机组_单行报表.csv" -NoTypeInformation -Encoding UTF8
注意事项
- 运行脚本需要AD模块权限,确保你有读取AD计算机和组的权限;
- 如果AD中计算机数量较多,方案1的执行时间会稍长,因为需要逐个查询组信息;
- 可以根据需求调整CSV的列名和导出路径。
内容的提问来源于stack exchange,提问作者Axeolito
相关产品推荐
相关产品推荐

