从 Active Directory 导出所有组和组成员

从 Active Directory 导出所有组和组成员

我对 powershell 还比较陌生,正在尝试获取域中所有组及其各自成员的列表。以下是我现在正在处理的内容:

Import-Module ActiveDirectory
$OutPutFile = New-Item -type file -force "AllGroups.txt"

#Filters for Groups

# 2 Global distribution group
# 4 Domain local distribution group
# 8 Universal distribution group
# -2147483646 Global security group
# -2147483644 Domain local security group
# -2147483640 Universal security group

$D = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$Domain = [ADSI]"LDAP://$D"
$Searcher = New-Object System.DirectoryServices.DirectorySearcher
$Searcher.PageSize  = 10000

$Searcher.Filter = "(&(objectCategory=Group)(|(groupType=2)(groupType=4)(groupType=8)))"
$Searcher.SearchRoot = "LDAP://" + $Domain.Name

$Results = $Searcher.FindAll()
foreach ($Result in $Results)
{
    $Item = $Result.Properties

    foreach ($Member in $Item.member) 
    {
    $Name = Get-ADUser "$Member" -Properties DisplayName | select -expand displayname
    $Item.cn, "$Name" | Out-File $OutPutFile -encoding ASCII -append
    }
}

我希望输出为 Group;Displayname 或 Group-Displayname(这样我就可以将其放入 Excel 并从那里格式化),但是我似乎无法在同一行中获得输出。输出目前如下所示:

Group
DisplayName
Group
DisplayName

我做错了什么,或者我该如何调整代码才能在同一行上给出这两个项目?我还考虑过在 OU 中添加组,但还没有找到从结果中获取它的方法。

答案1

当您将列表传送到时Out-File -Append,它会将每个条目写入新行。

相反,从两个值构造一个字符串并传输:

$MemberLine = '"{0}","{1}"' -f $Item.CN,$Name 
$MemberLine | Out-File $OutPutFile -encoding ASCII -append

或者,使用Export-Csv,它会负责正确地用逗号分隔值:

$Members = foreach ($Result in $Results)
{
    $Item = $Result.Properties

    foreach ($Member in $Item.member) 
    {
        Get-ADUser "$Member" -Properties DisplayName |Select @{Name='Group';Expression={$Item.CN}},@{Name='Member',Expression={$_.displayname}}
    }
}
$Members | Export-Csv $OutPutFile -Encoding ASCII -NoTypeInformation

正如前面提到的,您可以[adsisearcher]Get-ADGroupcmdlet 替换您的,更加简洁:

$Groups = Get-ADGroup -Filter {GroupCategory -eq 'Distribution'}
$Groups | ForEach-Object {
  $Group = $_
  $Group.Member |ForEach-Object {
    Get-ADUser $_ -Properties displayName
  } | Select @{N='Group';E={$Group.Name}},@{N='Member';E={$_.displayName}}
} | Export-Csv $OutPutFile -Encoding ASCII -NoTypeInformation

答案2

只需使用以下 PowerShell 代码:

Get-ADGroup -filter "name -like 'CWS*'" | % {
$Group = $_.Name $_ | Get-ADGroupMember | select @{n="Group";e={$Group}}, 
@{n='Users';e={$_.Name}} | Export-CSV c:\temp\report.csv -NoTypeInformation -Append -Delimiter ";" }

相关内容