Я относительно новичок в 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, в котором находятся группы, но мне не удалось найти способ получить это из моих результатов.
Когда вы передаете список 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-ADGroup
командлет, гораздо более краткий:
$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
Просто используйте следующий код 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 ";" }