导出嵌套组联系人是 memberOf
Export nested groups a contact is a memberOf
我正在使用 Exchange 2010 和 Powershell。
我希望导出交换联系人所属的所有 'nested' 通讯组。
例如,如果联系人是 A 和 B 两个 DG 的成员。并且 A 组也是 C 组的成员。我想要一个显示所有三个组的列表。
Group C
----|-----------|
Group A Group B
|
Contact
这是我的新手尝试。我想这需要递归完成吗?
$contact = get-contact email@domain.com.au
$members = Get-ADObject -Identity $contact.Guid -Properties 'MemberOf'
foreach ($group in $members.MemberOf) {
foreach ($_ in $group.memberof ){
get-distributiongroup $_
}
}
必须能够为 'contact' 而不是用户执行此操作。
提前致谢!
您并不真的需要 Exchange 来获取通讯组。
这是我检索组名称的示例,假设您的联系人是 AD 用户,邮件已填写 属性:
function Get-GroupsRec
{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline=$true)]
$Identity
)
BEGIN {}
PROCESS{
if($Identity -eq $null){return}
Write-Output $Identity | select -ExpandProperty samaccountname
$Identity | Get-ADPrincipalGroupMembership | ?{$_.GroupCategory -eq "Distribution"} | Get-GroupsRec}
END{}
}
Get-ADUser -Filter {mail -eq 'email@domain.com.au'} | Get-ADPrincipalGroupMembership | ?{$_.GroupCategory -eq "Distribution"} | Get-GroupsRec
但是只要能找回AD用户,这个方案就有效。
更新:
仅基于 Get-ADObject
的版本。 (相同的结构,只有不同的选择器。为了便于阅读,在过滤器中保留了 ObjectClass):
function Get-GroupsRec
{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline=$true)]
$Identity
)
BEGIN {}
PROCESS{
if($Identity -eq $null){return}
Write-Output $Identity | select -ExpandProperty Name
$Identity | select -ExpandProperty MemberOf | Get-ADObject -Properties GroupType,MemberOf |?{$_.GroupType -gt 0 -and $_.ObjectClass -eq 'group'} | Get-GroupsRec }
END{}
}
Get-ADObject -Filter {mail -eq 'email@domain.com.au'} -Properties MemberOf | select -ExpandProperty MemberOf | Get-ADObject -Properties GroupType,MemberOf |?{$_.GroupType -gt 0 -and $_.ObjectClass -eq 'group'} | Get-GroupsRec
如果您希望将组类型限制为特定类型,您可以使用 -band
运算符将代码中的 GroupType 修改为任意值。枚举器值位于:https://msdn.microsoft.com/en-us/library/aa772263(v=vs.85).aspx
你走在正确的轨道上。你确实需要递归。我很快将一些东西放在一起,应该可以回溯地解决成员资格问题。希望这对您有所帮助!
Function Get-Groups {
Param(
[string]$Identity
)
$members = Get-ADObject -Identity $Identity -Properties "MemberOf"
$members.MemberOf | % {
if($(Get-ADObject $_ -Properties "GroupType").grouptype -gt 0) {
Write-Host $_
}
Get-Nestedmember $_ "->"
}
}
Function Get-Nestedmember {
Param(
[String]$Identity,
[string]$Depth
)
$members = (Get-ADobject -Identity $Identity -Properties "MemberOf").memberof
$count = $members | measure
if($count -ne 0) {
$members | % {
if($(Get-ADObject $_ -Properties "GroupType").grouptype -gt 0) {
Write-host "$Depth $_"
}
Get-Nestedmember $_ "-$Depth"
}
}
}
Get-Groups -Identity '<Your Identity goes here>'
它获取 MemberOf 关系并为结果集再次执行此操作。如果 MemberOf returns 0 意味着没有更多的 MemberOf 关系,所以我们停止。
我正在使用 Exchange 2010 和 Powershell。
我希望导出交换联系人所属的所有 'nested' 通讯组。
例如,如果联系人是 A 和 B 两个 DG 的成员。并且 A 组也是 C 组的成员。我想要一个显示所有三个组的列表。
Group C
----|-----------|
Group A Group B
|
Contact
这是我的新手尝试。我想这需要递归完成吗?
$contact = get-contact email@domain.com.au
$members = Get-ADObject -Identity $contact.Guid -Properties 'MemberOf'
foreach ($group in $members.MemberOf) {
foreach ($_ in $group.memberof ){
get-distributiongroup $_
}
}
必须能够为 'contact' 而不是用户执行此操作。
提前致谢!
您并不真的需要 Exchange 来获取通讯组。 这是我检索组名称的示例,假设您的联系人是 AD 用户,邮件已填写 属性:
function Get-GroupsRec
{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline=$true)]
$Identity
)
BEGIN {}
PROCESS{
if($Identity -eq $null){return}
Write-Output $Identity | select -ExpandProperty samaccountname
$Identity | Get-ADPrincipalGroupMembership | ?{$_.GroupCategory -eq "Distribution"} | Get-GroupsRec}
END{}
}
Get-ADUser -Filter {mail -eq 'email@domain.com.au'} | Get-ADPrincipalGroupMembership | ?{$_.GroupCategory -eq "Distribution"} | Get-GroupsRec
但是只要能找回AD用户,这个方案就有效。
更新:
仅基于 Get-ADObject
的版本。 (相同的结构,只有不同的选择器。为了便于阅读,在过滤器中保留了 ObjectClass):
function Get-GroupsRec
{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline=$true)]
$Identity
)
BEGIN {}
PROCESS{
if($Identity -eq $null){return}
Write-Output $Identity | select -ExpandProperty Name
$Identity | select -ExpandProperty MemberOf | Get-ADObject -Properties GroupType,MemberOf |?{$_.GroupType -gt 0 -and $_.ObjectClass -eq 'group'} | Get-GroupsRec }
END{}
}
Get-ADObject -Filter {mail -eq 'email@domain.com.au'} -Properties MemberOf | select -ExpandProperty MemberOf | Get-ADObject -Properties GroupType,MemberOf |?{$_.GroupType -gt 0 -and $_.ObjectClass -eq 'group'} | Get-GroupsRec
如果您希望将组类型限制为特定类型,您可以使用 -band
运算符将代码中的 GroupType 修改为任意值。枚举器值位于:https://msdn.microsoft.com/en-us/library/aa772263(v=vs.85).aspx
你走在正确的轨道上。你确实需要递归。我很快将一些东西放在一起,应该可以回溯地解决成员资格问题。希望这对您有所帮助!
Function Get-Groups {
Param(
[string]$Identity
)
$members = Get-ADObject -Identity $Identity -Properties "MemberOf"
$members.MemberOf | % {
if($(Get-ADObject $_ -Properties "GroupType").grouptype -gt 0) {
Write-Host $_
}
Get-Nestedmember $_ "->"
}
}
Function Get-Nestedmember {
Param(
[String]$Identity,
[string]$Depth
)
$members = (Get-ADobject -Identity $Identity -Properties "MemberOf").memberof
$count = $members | measure
if($count -ne 0) {
$members | % {
if($(Get-ADObject $_ -Properties "GroupType").grouptype -gt 0) {
Write-host "$Depth $_"
}
Get-Nestedmember $_ "-$Depth"
}
}
}
Get-Groups -Identity '<Your Identity goes here>'
它获取 MemberOf 关系并为结果集再次执行此操作。如果 MemberOf returns 0 意味着没有更多的 MemberOf 关系,所以我们停止。