如何将所有电子邮件分发中所有用户的 Active Directory 列表保存到 .CSV?
How to save Active Directory list of all users in all e-mail distributions to .CSV?
我找到了这个示例,但不确定如何将输出正确保存到 .csv。
Import-Module ActiveDirectory
$Groups = Get-ADGroup -Filter {GroupCategory -eq "Distribution"} -Properties Members
ForEach ($g in $Groups) {
Write-Host $g.name
Write-Host $g.members `n
}
我试过如下:
Import-Module ActiveDirectory
$Groups = Get-ADGroup -Filter {GroupCategory -eq "Distribution"} -Properties Members
ForEach ($g in $Groups) {
$g.name | Export-CSV C:\log.csv -notypeinformation -Append
$g.members | Export-CSV C:\log.csv -notypeinformation -Append
}
它只将 1 列保存到 CSV 中,称为长度。
这也让我删除了 Write-Host $g.members `n
末尾的 'n
有什么方法可以抓取这些数据并将其正确保存为 .csv 格式?
更新
在 TheMadTechnician 和这个 link https://blogs.technet.microsoft.com/heyscriptingguy/2013/07/22/export-user-names-and-proxy-addresses-to-csv-file/ 的帮助下,我能够更接近我想要的东西。
Import-Module ActiveDirectory
$Groups = Get-ADGroup -Filter {GroupCategory -eq "Distribution"} -Properties Members
ForEach ($g in $Groups) {
$g.name | Export-CSV C:\log.csv -notypeinformation -Append
$g.members | Export-CSV C:\log.csv -notypeinformation -Append
}
$Groups | Select Name,@{L='Members_1'; E={$_.members[0]}}, @{L='Members_2';E={$_.Members[1]}}, @{L='Members_3';E={$_.Members[2]}}, @{L='Members_4';E={$_.Members[3gq]}} | Export-Csv C:\log.csv -notype
这会在我的 CSV 中输出以下内容:
Name Members_1 Members_2 ETC...
NameOfGroup CN=Stormy Daniels,OU=IT,DC=DomainName,DC=com CN=Joe Bob,OU=IT,DC=DomainName,DC=com
现在用户列表可能会很大,所以我必须继续创建 Members_3、Members_4 等...
我不确定是否可以指定所有用户或循环
@{L='Members_1'; E={$_.members[0]}}
并增加数字直到显示所有用户。
我也只需要有名字的CN。我不需要 Ou= 或 Dc=.
啊,事实证明这比我预期的要难 - 由于成员计数(您必须进行与整数相当的计数)。我添加了一个限制结果大小的可能性,因为对于大型查询,活动目录会产生超时。
$limit_result_size = 10
$group_name = Get-ADGroup -Filter {GroupCategory -eq "Distribution"} -Properties Name, Members -ResultSetSize:$limit_result_size | Select-object name
ForEach ($name in $group_name.name) {
If ((![String]::IsNullOrEmpty("$name")) -And ("$name" -notlike 'index')) {
$count_members = Get-ADGroupMember -Identity "$name" | Measure-Object | Select-Object Count
Write-Output "The AD group $name has $($count_members.Count) members.`n"
For($counter = 0; $counter -lt $count_members.Count; $counter++) {
$person = Get-ADGroup -Filter {Name -eq $name} -Properties Name, Members | Select-Object Name, @{N='Members';E={$_.Members[$counter]}}
$person.Members = $person.Members | Select-String 'CN=[0-9a-zA-Z]+' -AllMatches | % { $_.Matches } | % { $_.Value }
$person | export-csv -NoTypeInformation -Append -Path '<your_path>\log.csv'
}
}
}
简短描述:
(![String]::IsNullOrEmpty("$name")) -And ("$name" -notlike 'index'))
AD组需要满足的条件
Select-String 'CN=[0-9a-zA-Z]+' -AllMatches | % { $_.Matches } | % { $_.Value }
仅选择 CN=string_with_numbers
。如果您愿意,可以将其替换为 CN=\w+
。
该脚本在 CV AD group
和 CN=user_name
中生成一对。如果还有什么不清楚的请追问。
编辑
如果 Common Names (CN) 的名称中有空格,则必须将正则表达式调整为 CN=[0-9a-zA-Z\s]+
.
编辑 2 添加用户的电子邮件地址。
由于您的问题已包含在电子邮件的标题请求中,因此我将在此处回答而不提出新问题。请注意,此解决方案在正则表达式中使用 lookbehind 从输出中排除 CN=
,因此它可以用作用户查询的源。它还使用 PSCustomObject
将所有信息收集在一起。我重命名了一些变量,以便在用户详细信息的上下文中更好地理解。
$limit_result_size = 10
$group_name = Get-ADGroup -Filter {GroupCategory -eq "Distribution"} -Properties Name, Members -ResultSetSize:$limit_result_size | Select-object name
ForEach ($name in $group_name.name) {
If ((![String]::IsNullOrEmpty("$name")) -And ("$name" -notlike 'index')) {
$count_members = Get-ADGroupMember -Identity "$name" | Measure-Object | Select-Object Count
Write-Output "The AD group $name has $($count_members.Count) members.`n"
For($counter = 0; $counter -lt $count_members.Count; $counter++) {
$person = Get-ADGroup -Filter {Name -eq $name} -Properties Name, Members | Select-Object Name, @{N='Members';E={$_.Members[$counter]}}
$person.Members = $person.Members | Select-String '(?<=CN=)[0-9a-zA-Z\s]+' -AllMatches | % { $_.Matches } | % { $_.Value }
$person_details = Get-AdUser -filter {name -eq $member} -Properties mail | Select-Object mail
$person_additional_details = [PSCustomObject]@{ group_name = $group.Name
user_name = $group.Members
email = $person_details.mail
}
If ([String]::IsNullOrEmpty($($person_additional_details.email))) {
$person_additional_details.psobject.properties["email"].value = '<empty>'
}
# For user to see the written data
Write-Output "AD Group: $($person_additional_details.group_name) `
AD User: $($person_additional_details.user_name) `
Users`'s email: $($person_additional_details.email)`n"
# writing into the CSV file
$person_additional_details | export-csv -NoTypeInformation -Append -Path '<your_path>\log.csv'
}
}
}
我找到了这个示例,但不确定如何将输出正确保存到 .csv。
Import-Module ActiveDirectory
$Groups = Get-ADGroup -Filter {GroupCategory -eq "Distribution"} -Properties Members
ForEach ($g in $Groups) {
Write-Host $g.name
Write-Host $g.members `n
}
我试过如下:
Import-Module ActiveDirectory
$Groups = Get-ADGroup -Filter {GroupCategory -eq "Distribution"} -Properties Members
ForEach ($g in $Groups) {
$g.name | Export-CSV C:\log.csv -notypeinformation -Append
$g.members | Export-CSV C:\log.csv -notypeinformation -Append
}
它只将 1 列保存到 CSV 中,称为长度。
这也让我删除了 Write-Host $g.members `n
末尾的 'n有什么方法可以抓取这些数据并将其正确保存为 .csv 格式?
更新
在 TheMadTechnician 和这个 link https://blogs.technet.microsoft.com/heyscriptingguy/2013/07/22/export-user-names-and-proxy-addresses-to-csv-file/ 的帮助下,我能够更接近我想要的东西。
Import-Module ActiveDirectory
$Groups = Get-ADGroup -Filter {GroupCategory -eq "Distribution"} -Properties Members
ForEach ($g in $Groups) {
$g.name | Export-CSV C:\log.csv -notypeinformation -Append
$g.members | Export-CSV C:\log.csv -notypeinformation -Append
}
$Groups | Select Name,@{L='Members_1'; E={$_.members[0]}}, @{L='Members_2';E={$_.Members[1]}}, @{L='Members_3';E={$_.Members[2]}}, @{L='Members_4';E={$_.Members[3gq]}} | Export-Csv C:\log.csv -notype
这会在我的 CSV 中输出以下内容:
Name Members_1 Members_2 ETC...
NameOfGroup CN=Stormy Daniels,OU=IT,DC=DomainName,DC=com CN=Joe Bob,OU=IT,DC=DomainName,DC=com
现在用户列表可能会很大,所以我必须继续创建 Members_3、Members_4 等...
我不确定是否可以指定所有用户或循环
@{L='Members_1'; E={$_.members[0]}}
并增加数字直到显示所有用户。
我也只需要有名字的CN。我不需要 Ou= 或 Dc=.
啊,事实证明这比我预期的要难 - 由于成员计数(您必须进行与整数相当的计数)。我添加了一个限制结果大小的可能性,因为对于大型查询,活动目录会产生超时。
$limit_result_size = 10
$group_name = Get-ADGroup -Filter {GroupCategory -eq "Distribution"} -Properties Name, Members -ResultSetSize:$limit_result_size | Select-object name
ForEach ($name in $group_name.name) {
If ((![String]::IsNullOrEmpty("$name")) -And ("$name" -notlike 'index')) {
$count_members = Get-ADGroupMember -Identity "$name" | Measure-Object | Select-Object Count
Write-Output "The AD group $name has $($count_members.Count) members.`n"
For($counter = 0; $counter -lt $count_members.Count; $counter++) {
$person = Get-ADGroup -Filter {Name -eq $name} -Properties Name, Members | Select-Object Name, @{N='Members';E={$_.Members[$counter]}}
$person.Members = $person.Members | Select-String 'CN=[0-9a-zA-Z]+' -AllMatches | % { $_.Matches } | % { $_.Value }
$person | export-csv -NoTypeInformation -Append -Path '<your_path>\log.csv'
}
}
}
简短描述:
(![String]::IsNullOrEmpty("$name")) -And ("$name" -notlike 'index'))
AD组需要满足的条件
Select-String 'CN=[0-9a-zA-Z]+' -AllMatches | % { $_.Matches } | % { $_.Value }
仅选择 CN=string_with_numbers
。如果您愿意,可以将其替换为 CN=\w+
。
该脚本在 CV AD group
和 CN=user_name
中生成一对。如果还有什么不清楚的请追问。
编辑
如果 Common Names (CN) 的名称中有空格,则必须将正则表达式调整为 CN=[0-9a-zA-Z\s]+
.
编辑 2 添加用户的电子邮件地址。
由于您的问题已包含在电子邮件的标题请求中,因此我将在此处回答而不提出新问题。请注意,此解决方案在正则表达式中使用 lookbehind 从输出中排除 CN=
,因此它可以用作用户查询的源。它还使用 PSCustomObject
将所有信息收集在一起。我重命名了一些变量,以便在用户详细信息的上下文中更好地理解。
$limit_result_size = 10
$group_name = Get-ADGroup -Filter {GroupCategory -eq "Distribution"} -Properties Name, Members -ResultSetSize:$limit_result_size | Select-object name
ForEach ($name in $group_name.name) {
If ((![String]::IsNullOrEmpty("$name")) -And ("$name" -notlike 'index')) {
$count_members = Get-ADGroupMember -Identity "$name" | Measure-Object | Select-Object Count
Write-Output "The AD group $name has $($count_members.Count) members.`n"
For($counter = 0; $counter -lt $count_members.Count; $counter++) {
$person = Get-ADGroup -Filter {Name -eq $name} -Properties Name, Members | Select-Object Name, @{N='Members';E={$_.Members[$counter]}}
$person.Members = $person.Members | Select-String '(?<=CN=)[0-9a-zA-Z\s]+' -AllMatches | % { $_.Matches } | % { $_.Value }
$person_details = Get-AdUser -filter {name -eq $member} -Properties mail | Select-Object mail
$person_additional_details = [PSCustomObject]@{ group_name = $group.Name
user_name = $group.Members
email = $person_details.mail
}
If ([String]::IsNullOrEmpty($($person_additional_details.email))) {
$person_additional_details.psobject.properties["email"].value = '<empty>'
}
# For user to see the written data
Write-Output "AD Group: $($person_additional_details.group_name) `
AD User: $($person_additional_details.user_name) `
Users`'s email: $($person_additional_details.email)`n"
# writing into the CSV file
$person_additional_details | export-csv -NoTypeInformation -Append -Path '<your_path>\log.csv'
}
}
}