【Office 365】계층형 주소록의 계층구조를 리스트에 출력하는 PowerShell 스크립트를 작성했다

소개



Office 365(Exchange Online)의 계층형 주소록의 계층 구조를 목록에 출력하는 PowerShell 스크립트를 작성했으므로 메모.
가공 용이성 중시의 리스트를 출력하는 스크립트와 확실히 알기 쉬움 중시의 리스트를 출력하는 스크립트의 2 패턴으로 작성해 보았다.

절차 작성은 다음과 같은 계층적 주소록에 대해 수행되었다. (작성 환경의 라이센스가 부족했기 때문에 사용자 대신에 연락처를 사용하고 있다)


스크립트



가공 용이성 중심 스크립트



스크립트는 다음과 같습니다.

GetGalStructure.ps1
#getGroupTree関数定義
function getGroupTree($targetRecipient, $upperHierarchy){

    #$Datasに現在の$targetRecipientの情報を追記
    $Data = New-Object PSObject | Select-Object upperHierarchy, DisplayName, PrimarySmtpAddress, Title, RecipientType
    $Data.upperHierarchy = $upperHierarchy -join " - "
    $Data.DisplayName = $targetRecipient.DisplayName
    $Data.PrimarySmtpAddress = $targetRecipient.PrimarySmtpAddress
    $Data.Title = $targetRecipient.Title
    $Data.RecipientType = $targetRecipient.RecipientType
    [void]$Datas.Add($Data)

    #$targetRecipientがグループの場合
    if($targetRecipient.RecipientType -eq "MailUniversalSecurityGroup"){

        #$upperHierarchyに$targetRecipientを追加       
        $upperHierarchy += @($targetRecipient.DisplayName)

        #$targetRecipientのメンバー取得
        Get-DistributionGroupMember $targetRecipient.Alias |
            #取得したメンバーをユーザー、連絡先、グループの順で並び替え
            Select-Object Alias, DisplayName, PrimarySmtpAddress, Title, RecipientType, @{L="SortIndex"; E={switch($_.RecipientType){
                "UserMailBox"{0}
                "MailContact"{1}
                "MailUniversalSecurityGroup"{2}
            }}} |
            Sort-Object -Property SortIndex, DisplayName |
            #取得したメンバーに対してgetGroupTree関数を再帰実行
            ForEach-Object {getGroupTree $_ $upperHierarchy}

    }
}

#取得したGAL構造を格納するオブジェクト$Datasを定義
$global:Datas = New-Object System.Collections.ArrayList

#GALルート取得、チェック
$treeRootName = (Get-OrganizationConfig).HierarchicalAddressBookRoot
if([string]::IsNullOrEmpty($treeRootName)){"HierarchicalAddressBookRoot未指定。スクリプトの実行を中断します。";exit}

#GALルートに対してgetGroupTree関数を実行
getGroupTree (Get-DistributionGroup $treeRootName)

Exchange Online PowerShell에 원격으로 연결한 후 GetGalStructure.ps1
PS > .\GetGalStructure.ps1
$Datas 에 계층 구조의 리스트가 저장되므로 Out-GridView 이나 Export-Csv 로 리스트를 출력하면 된다.
Out-GridView 로 출력하는 경우.
PS > $Datas | Out-GridView

Excel 등으로 가공해 2차 이용은 하기 쉽지만, 확실히 보면 계층 구조를 알기 어려울지도.



확실히 알기 쉬움 중시 스크립트



스크립트는 다음과 같습니다.

GetGalStructure2.ps1
#getGroupTree関数定義
function getGroupTree($targetRecipient, $upperHierarchy){

    #現在の$targetRecipientを格納するオブジェクト$Dataを定義
    $Data = New-Object PSObject | Select-Object upperHierarchy, DisplayName, PrimarySmtpAddress, Title, RecipientType
    $Data.PrimarySmtpAddress = $targetRecipient.PrimarySmtpAddress
    $Data.RecipientType = $targetRecipient.RecipientType

    #$targetRecipientがグループの場合
    if($targetRecipient.RecipientType -eq "MailUniversalSecurityGroup"){

        #$upperHierarchyに$targetRecipientを追加
        $upperHierarchy += @($targetRecipient.DisplayName)

        #$Datasに$targetRecipientの情報を追記
        $Data.upperHierarchy = $upperHierarchy -join " - "
        [void]$Datas.Add($Data)

        #$targetRecipientのメンバー取得
        Get-DistributionGroupMember $targetRecipient.Alias |
            #取得したメンバーをユーザー、連絡先、グループの順で並び替え
            Select-Object Alias, DisplayName, PrimarySmtpAddress, Title, RecipientType, @{L="SortIndex"; E={switch($_.RecipientType){
                "UserMailBox"{0}
                "MailContact"{1}
                "MailUniversalSecurityGroup"{2}
            }}} |
            Sort-Object -Property SortIndex, DisplayName |
            #取得したメンバーに対して関数を再帰実行
            ForEach-Object {getGroupTree $_ $upperHierarchy}

    #$targetRecipientがその他受信者の場合
    }else{

        #$Datasに$targetRecipientの情報を追記
        $Data.DisplayName = $targetRecipient.DisplayName
        $Data.Title = $targetRecipient.Title
        [void]$Datas.Add($Data)

    }

}

#取得したGAL構造を格納するオブジェクト$Datasを定義
$global:Datas = New-Object System.Collections.ArrayList

#GALルート取得、チェック
$treeRootName = (Get-OrganizationConfig).HierarchicalAddressBookRoot
if([string]::IsNullOrEmpty($treeRootName)){"HierarchicalAddressBookRoot未指定。スクリプトの実行を中断します。";exit}

#GALルートに対してgetGroupTree関数を実行
getGroupTree (Get-DistributionGroup $treeRootName)

Exchange Online PowerShell에 원격으로 연결한 후 GetGalStructure2.ps1
PS > .\GetGalStructure2.ps1

이쪽도 마찬가지로 $Datas 에 계층 구조의 리스트가 저장되므로 Out-GridView 이나 Export-Csv 로 리스트를 출력하면 된다.
Out-GridView 로 출력하는 경우.
PS > $Datas | Out-GridView

조금 전의 리스트에 비해 확실히 보아 계층 구조를 알기 쉽지만, 그 때문에 출력을 생략하고 있는 열이 있으므로, Excel등으로 가공은 하기 어려울지도.



결론



요청이 있으면 SeniorityIndex 도 포함한 리스트를 출력하는 스크립트도 만들어 소개할지도. ( Get-DistributionGroupMember 에서는 SeniorityIndex 속성을 얻을 수 없기 때문에 GAL에 포함된 각 개체에 대해 함수 내에서 추가 Get 명령을 실행해야 하며 런타임 부담이 상당히 크다.)

이상

좋은 웹페이지 즐겨찾기