You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OU路径下多个安全组成员导出至CSV的实现问题

解决AD安全组成员导出到CSV的条件实现问题

我看你已经搭好了脚本的基础框架,接下来就帮你补全功能,同时搞定那些条件实现的难题。下面是完整的解决方案,覆盖了常见的需求场景:

基础版:导出指定OU下所有安全组的用户成员到CSV

先把你现有的脚本完善成可直接运行的版本,实现最核心的导出功能:

Import-Module ActiveDirectory

Write-Host 'This script is used to check what users have access to a particular network drive.' `n 'Please wait...'
Start-Sleep 4

# 替换成你的完整OU路径,比如DC=yourdomain,DC=com
$ouPath = "OU=Network Drives,OU=DJ Security Groups,OU=Security Groups,DC=yourdomain,DC=com"
Write-Host "Below is a list of the available DJ network drive security groups:"
Start-Sleep 3

# 获取指定OU下的所有安全组,同时拉取组名称和描述属性
$securityGroups = Get-ADGroup -Filter * -SearchBase $ouPath -Properties Name, Description

# 初始化数组存储最终结果
$exportResults = @()

foreach ($group in $securityGroups) {
    Write-Host "正在处理组: $($group.Name)"
    # 递归获取组内所有用户成员(排除嵌套的组对象)
    $groupUsers = Get-ADGroupMember -Identity $group -Recursive | Where-Object { $_.objectClass -eq 'user' }
    
    foreach ($user in $groupUsers) {
        # 获取用户的详细属性,可根据需求增减属性项
        $userDetails = Get-ADUser -Identity $user -Properties GivenName, Surname, EmailAddress, Enabled
        
        # 将组和用户信息封装成自定义对象
        $exportResults += [PSCustomObject]@{
            组名称           = $group.Name
            组描述           = $group.Description
            用户名           = $userDetails.SamAccountName
            全名             = "$($userDetails.GivenName) $($userDetails.Surname)"
            邮箱             = $userDetails.EmailAddress
            账号状态(启用) = $userDetails.Enabled
        }
    }
}

# 替换成你的输出路径,确保文件夹已存在
$outputCsvPath = "C:\Temp\NetworkDrive_GroupMembers.csv"
$exportResults | Export-Csv -Path $outputCsvPath -NoTypeInformation -Encoding UTF8

Write-Host "导出完成!文件已保存至: $outputCsvPath"

常见条件的实现方法

针对你可能遇到的各种条件需求,这里给出具体的修改方案:

1. 只导出名称包含特定关键词的安全组

比如只处理名称里带"Drive"的组,修改Get-ADGroup的过滤条件即可:

$securityGroups = Get-ADGroup -Filter { Name -like "*Drive*" } -SearchBase $ouPath -Properties Name, Description

2. 只导出启用状态的用户

如果不需要包含禁用账号,在获取用户成员后添加过滤:

$groupUsers = Get-ADGroupMember -Identity $group -Recursive | Where-Object { $_.objectClass -eq 'user' }
$enabledUsers = $groupUsers | ForEach-Object { Get-ADUser -Identity $_ -Properties Enabled } | Where-Object { $_.Enabled -eq $true }

3. 不处理嵌套组(只取直接成员)

去掉Get-ADGroupMember的-Recursive参数即可:

$groupUsers = Get-ADGroupMember -Identity $group | Where-Object { $_.objectClass -eq 'user' }

4. 每个组单独导出一个CSV文件

如果需要按组拆分输出,把导出逻辑放到组循环里:

foreach ($group in $securityGroups) {
    # ... 处理该组成员的逻辑 ...
    $groupCsvPath = "C:\Temp\$($group.Name)_成员列表.csv"
    $groupResults | Export-Csv -Path $groupCsvPath -NoTypeInformation -Encoding UTF8
}

5. 只导出特定用户属性

如果不需要太多字段,精简Get-ADUser的属性列表:

$userDetails = Get-ADUser -Identity $user -Properties EmailAddress

注意事项

  • 确保运行脚本的账号拥有Active Directory读取权限,否则会出现权限不足的报错。
  • 替换脚本中的$ouPath和$outputCsvPath为你的实际路径,提前创建好输出文件夹。
  • 处理大量组和用户时,建议添加进度提示,或者用批量查询优化性能(比如用Get-ADUser一次性查询多个用户)。

内容的提问来源于stack exchange,提问作者Reece Alqotaibi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:33:36