导出嵌套组联系人是 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 关系,所以我们停止。