PowerShell自定义列输出:将AD组名设为列名展示活跃成员
实现AD组活跃用户按组列显示的解决方案
要实现将AD组名作为列名、活跃用户对应列下方显示的需求,你可以通过先收集各组活跃用户数据,再构造结构化表格对象的方式完成,替代原有的流式输出方式。以下是具体实现代码及说明:
代码实现
# 导入AD组列表CSV $adGroups = Import-Csv -Path C:\Source\Listofusers.csv # 初始化哈希表,存储每个组对应的活跃用户SamAccountName列表 $groupActiveUsers = @{} # 遍历每个AD组,收集活跃用户数据 foreach ($group in $adGroups) { $groupName = $group.ADGroups # 递归获取组内用户,筛选活跃状态并提取账号名 $activeUsers = Get-ADGroupMember -Identity $groupName -Recursive | Where-Object { $_.objectClass -eq 'user' } | Get-ADUser -Properties Enabled | Where-Object { $_.Enabled -eq $true } | Select-Object -ExpandProperty SamAccountName $groupActiveUsers[$groupName] = $activeUsers } # 确定表格行数(取成员最多的组的用户数) $maxRowCount = $groupActiveUsers.Values.Count | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum # 构建每行的表格数据,确保每个组的用户对应到列 $results = for ($i = 0; $i -lt $maxRowCount; $i++) { $rowProperties = [ordered]@{} foreach ($groupName in $groupActiveUsers.Keys) { # 当前行索引存在对应用户则取值,否则留空 $rowProperties[$groupName] = if ($i -lt $groupActiveUsers[$groupName].Count) { $groupActiveUsers[$groupName][$i] } else { '' } } # 转换为自定义对象,用于生成表格 [PSCustomObject]$rowProperties } # 在控制台输出格式化表格 $results | Format-Table -AutoSize # 可选:将结果导出为CSV文件 # $results | Export-Csv -Path "C:\Output\AD_Active_Users_by_Group.csv" -NoTypeInformation
代码说明
- 数据收集阶段:用哈希表
$groupActiveUsers存储每个AD组及其对应的活跃用户列表,避免重复查询,同时方便后续按组提取数据。 - 行数量确定:通过统计所有组的成员数最大值,确保所有组的用户都能在表格中对应到行,成员较少的组在后续行中留空。
- 表格构造:循环生成每行数据,为每个组列填充对应位置的用户账号,最终输出结构化的表格(或导出为CSV)。
这种方式能直接满足你“组名为列名,成员列在下方”的需求,输出结果比原有的分隔线形式更规整,也便于后续处理或导出。
内容的提问来源于stack exchange,提问作者Jay Bala
相关产品推荐
相关产品推荐

