どうもミツシマです。

今回はOffice365の各グループ(セキュリティ・メールが有効なセキュリティ・配布リスト・Office365)のメンバーを一括で追加するPowershellコマンドを検証してみました。
グループ自体の登録やユーザーの登録自体は出来ている前提です。
※グループ自体の一括登録は「(Office365)グループを一括で作成するPowershellコマンドを検証してみた」で検証してますので、気になる方はそちらをどうぞ。


検証環境は以下の通り
PC:Windows10


〜検証〜

まずそれぞれのグループ作成に使用するコマンドを確認。
グループコマンド
セキュリティAdd-MsolGroupMember
Add-AzureADGroupMember
メールが有効なセキュリティAdd-DistributionGroupMember
配布リストAdd-DistributionGroupMember
Office365Add-UnifiedGroupLinks


で実際に出来たスクリプトがこちら↓↓↓

〜Add-Office365GroupMember.ps1〜

#環境変数の設定
$CurrentFolder = Split-Path $MyInvocation.MyCommand.Path -Parent
$TxtFolderPath = $CurrentFolder + "\GroupMember\"
$OutputLogFilePath1 = $CurrentFolder + "\Add-Office365GroupMember.log"
$OutputLogFilePath2 = $CurrentFolder + "\Result-Office365GroupMember.log"
#今回操作したグループメンバーを確認するためのコマンド作成用配列
$ArrayGetGroupCMD = @();
$GeneratePScript = $CurrentFolder + "\Check-Office365GroupMember.ps1"

$ArrayGetGroupCMD += '$UserCredential = Get-Credential'
$ArrayGetGroupCMD += 'Connect-MsolService -Credential $UserCredential | Out-Null'
$ArrayGetGroupCMD += "Write-Host `"グループメンバーの確認をしています....`"" 

#「GroupMember」フォルダーがあるかどうかをチェックし、なければエラー表示で終了
If(-Not(Test-Path $TxtFolderPath)){
    Write-Output "「GroupMember」が同じフォルダにありません。処理を中断します。"
    pause
    Exit
}


###事前接続準備
#認証情報取得
$UserCredential = Get-Credential

#MSOへログイン
Connect-MsolService -Credential $UserCredential | Out-Null

#接続(リモートセッションの作成)
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection

#接続(リモートセッションの作成) プロキシ環境の場合
#$proxyOptions = New-PSSessionOption -ProxyAccessType IEConfig -ProxyAuthentication Negotiate
#$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection -SessionOption $proxyOptions

#Exchange Onlineコマンドレットのインポート
Import-PSSession $Session

#「GroupMember」配下のファイル一覧出力
$AllTxtInfo = Get-ChildItem $TxtFolderPath

#全ユーザー情報と全グループ情報を取得
$AllMsolUser = Get-MsolUser
$AllMsolGroup = Get-MsolGroup

#識別カウンタ
$i = 0
foreach($TxtInfo in $AllTxtInfo){

    #ファイル名(グループ名)を取得する
    $MsolGroupName = [String]$TxtInfo.BaseName
    
    #メンバーを追加する対象グループを取得
    $MsolGroup = $AllMsolGroup | Where-Object {$_.DisplayName -eq $MsolGroupName}

    #ファイルを読み込む
    $AllTxtContent = (Get-Content -Path $TxtInfo.PSPath) -as [string[]]
    
    #ファイルを1行ずつ読みこんでユーザーをグループに追加する
    foreach($TxtContent in $AllTxtContent){
        
        switch ($i){

            #1行目を確認してグループの種類を判別         
            0{
                switch -exact($TxtContent){
                
                    "##セキュリティ##"{$i = 1; break}

                    "##メールが有効なセキュリティ##"{$i = 2; break}

                    "##配布リスト##"{$i = 3; break}

                    "##Office365##"{$i = 4; break}

                }

                ;break
            }

            #セキュリティグループのメンバー追加
            1{
                
                #個別のユーザーオブジェクトIDを取得
                $MsolUser = $AllMsolUser | Where-Object {$_.DisplayName -eq $TxtContent}
                
                #出力確認
                [String]$strMessage = "セキュリティグループ「" + $MsolGroup.DisplayName + "」にユーザー「" + $MsolUser.DisplayName + "」を追加します."
                Write-Output $strMessage >> $OutputLogFilePath1
                
                #メンバー追加
                Add-MsolGroupMember -GroupObjectId $MsolGroup.ObjectId -GroupMemberType "User" -GroupMemberObjectId $MsolUser.ObjectId
                
                ;break
            
            }

            #メールが有効なセキュリティグループのメンバー追加
            2{
                #出力確認
                [String]$strMessage = "メールが有効なセキュリティグループ「" + $MsolGroup.DisplayName + "」にユーザー「" + $TxtContent + "」を追加します."
                Write-Output $strMessage >> $OutputLogFilePath1

                #メンバー追加
                Add-DistributionGroupMember -Identity $MsolGroup.DisplayName -Member $TxtContent

                ;break

            }

            #配布リストグループのメンバー追加
            3{
                #出力確認
                [String]$strMessage = "配布リストグループ「" + $MsolGroup.DisplayName + "」にユーザー「" + $TxtContent + "」を追加します."
                Write-Output $strMessage >> $OutputLogFilePath1

                #メンバー追加
                Add-DistributionGroupMember -Identity $MsolGroup.DisplayName -Member $TxtContent

                ;break

            }

            #Office365グループのメンバー追加
            4{
                #出力確認
                [String]$strMessage = "Office365グループ「" + $MsolGroup.DisplayName + "」にユーザー「" + $TxtContent + "」を追加します."
                Write-Output $strMessage >> $OutputLogFilePath1

                #メンバー追加
                Add-UnifiedGroupLinks -Identity $MsolGroup.DisplayName -LinkType Members -Links $TxtContent

                ;break

            }
        }

    }

    #ログに改行追加
    Write-Output `r`n >> $OutputLogFilePath1

    #カウンタ初期化
    $i = 0
    $GroupObjId = $MsolGroup.ObjectId
    $ArrayGetGroupCMD += "Write-Output `"${MsolGroupName}のメンバー一覧を表示します.`" >> ${OutputLogFilePath2}"
    $ArrayGetGroupCMD += "Get-MsolGroupMember -GroupObjectId ${GroupObjId} | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> ${OutputLogFilePath2}"
    
}


#今回追加したグループメンバーの一覧を確認するコマンドを作成
foreach($GetGroupCMD in $ArrayGetGroupCMD){
    
     $GetGroupCMD >> $GeneratePScript

}

#セッション切断
Remove-PSSession $Session

Write-Host "処理が完了しました."

pause


〜用意する定義ファイルの例(営業部Gr.txt)〜

##セキュリティ##
test 01
test 02
test 03


〜解説〜

まずは用意する準備するファイルの解説から。
Add-Office365GroupMember.ps1」と同じフォルダ階層に「GroupMember」を作成します。
01

その後、「GroupMember」フォルダ配下にそれぞれテキストファイルを準備します。
テキストファイルの作成ルールとしてはメンバーを追加したい「グループ名.txt」とします。
そして、テキストファイルの中身自体に追加したいメンバーを記載します。
※こんな感じになります↓↓↓
02
03
1行目にグループ種別を記載します。(ココ重要!!)
それぞれ「##セキュリティ##」・「##メールが有効なセキュリティ##」・「##配布リスト##」・「##Office365##
2行目移行に追加したいメンバーを記載します。
(注)文字コードは「UTF-8」で保存すること!!

これで準備はOK

では「Add-Office365GroupMember.ps1」の解説を。
  1. まずは「GroupMember」フォルダが同じ階層にあるかチェックをしてなければ、エラーでスクリプトを終了させます。
  2. Office365(ExchangeOnline含む)に接続した後、「GroupMember」フォルダ配下のファイルをすべて取得します。
  3. 現在Office365に存在するすべてのユーザーとグループを取得します。
  4. GroupMember」フォルダ配下のファイルを1つずつ見て、ファイル名を取得して実際のOffice365のグループと照らし合わせます。
  5. ファイルの中身を見て、グループ種別を確認して実際にユーザーを追加します。
  6. 「4」〜「5」を繰り返し処理しています。
  7. ログ結果として「Add-Office365GroupMember.log」をスクリプトがあるフォルダに出力します。
  8. 今回追加したグループメンバーの一覧を確認するコマンドを同じフォルダに作成します。

処理としては以上。
実行するとこんな感じ↓↓↓
04
05


出力したログ(Add-Office365GroupMember.log)の例
06


作成された確認コマンド(Check-Office365GroupMember.ps1)の例
$UserCredential = Get-Credential
Connect-MsolService -Credential $UserCredential | Out-Null
Write-Host "グループメンバーの確認をしています...."
Write-Output "営業部-Office365グループのメンバー一覧を表示します." >> D:\〜\Result-Office365GroupMember.log
Get-MsolGroupMember -GroupObjectId 8e372369-a14d-4f6e-8b1f-6e237cb1af36 | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> D:\〜\Result-Office365GroupMember.log
Write-Output "営業部Gr-Mailのメンバー一覧を表示します." >> D:\〜\Result-Office365GroupMember.log
Get-MsolGroupMember -GroupObjectId 61e6c0ca-22df-4d2e-8ae0-f5ce99303ce4 | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> D:\〜\Result-Office365GroupMember.log
Write-Output "営業部Grのメンバー一覧を表示します." >> D:\〜\Result-Office365GroupMember.log
Get-MsolGroupMember -GroupObjectId 51f68c46-0d36-40b0-bc21-3397a0139825 | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> D:\〜\Result-Office365GroupMember.log
Write-Output "営業部グループメールのメンバー一覧を表示します." >> D:\〜\Result-Office365GroupMember.log
Get-MsolGroupMember -GroupObjectId 0649b889-ca29-4e29-8787-f8d2b353d938 | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> D:\〜\Result-Office365GroupMember.log
Write-Output "総務部-Office365グループのメンバー一覧を表示します." >> D:\〜\Result-Office365GroupMember.log
Get-MsolGroupMember -GroupObjectId b095a44c-e3cf-4e22-97d1-1844feca6ff7 | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> D:\〜\Result-Office365GroupMember.log
Write-Output "総務部Gr-Mailのメンバー一覧を表示します." >> D:\〜\Result-Office365GroupMember.log
Get-MsolGroupMember -GroupObjectId cda5a8d2-b773-4554-95f2-d7cb3f08b81f | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> D:\〜\Result-Office365GroupMember.log
Write-Output "総務部Grのメンバー一覧を表示します." >> D:\〜\Result-Office365GroupMember.log
Get-MsolGroupMember -GroupObjectId 3419a5dc-9263-4a2a-9340-a8bbbe113f0c | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> D:\〜\Result-Office365GroupMember.log
Write-Output "総務部グループメールのメンバー一覧を表示します." >> D:\〜\Result-Office365GroupMember.log
Get-MsolGroupMember -GroupObjectId 9d786214-fc08-443c-9772-bdde8b95fa0f | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> D:\〜\Result-Office365GroupMember.log
Write-Output "開発部-Office365グループのメンバー一覧を表示します." >> D:\〜\Result-Office365GroupMember.log
Get-MsolGroupMember -GroupObjectId 8f6b5605-cd90-410d-9787-0bd8d1f74783 | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> D:\〜\Result-Office365GroupMember.log
Write-Output "開発部Gr-Mailのメンバー一覧を表示します." >> D:\〜\Result-Office365GroupMember.log
Get-MsolGroupMember -GroupObjectId 1dcf9eba-5d4d-4a8b-810e-0416aa2b1be4 | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> D:\〜\Result-Office365GroupMember.log
Write-Output "開発部Grのメンバー一覧を表示します." >> D:\〜\Result-Office365GroupMember.log
Get-MsolGroupMember -GroupObjectId 99d6a456-75d6-4e96-a918-37277ce3a288 | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> D:\〜\Result-Office365GroupMember.log
Write-Output "開発部グループメールのメンバー一覧を表示します." >> D:\〜\Result-Office365GroupMember.log
Get-MsolGroupMember -GroupObjectId 26994025-9677-4e66-911a-e6c42fb039b2 | Select-Object ObjectId,DisplayName,EmailAddress,GroupMemberType  | Sort-Object DisplayName | Format-Table -AutoSize >> D:\〜\Result-Office365GroupMember.log


今回なぜグループメンバー一覧を確認するコマンドを別にしているかというと、グループメンバー作成した直後だとまだ反映されていない場合があった為です。
最初はウェイトを入れたりしたのですが、安定しなかったのでそれであれば確認コマンドは別で作成して後で実行すればいいじゃん!!と考えたからです。
確認コマンドを実行するとこんな感じ↓↓↓
07

実行後のフォルダ状況
08


出力されたログ(Result-Office365GroupMember.log)
09


今回の検証はこれで終了。
スクリプトを実行して別のスクリプトを作成するのを今回始めて試してみたが、面白い試みだったと個人的に思いました(^^)
スポンサードリンク