Microsoft Planner を PowerShell を使用して一括で有効化、無効化する方法について

※ 2016 年 7 月 22 日に内容を更新しました

こんにちは、SharePoint サポートの森村です。
本記事では Office 365 にて公開中の Microsoft Planner (以下 Planner) について、PowerShell スクリプトを使用して一括でその時点のテナント全体のユーザーのライセンスを有効化、無効化し、アプリケーション ランチャー上のタイルを追加、削除する方法をご案内いたします。
既に Sway 等の別のサービスを無効化いただいている場合などもあるかと思いますが、本方法をご利用いただくことで、別サービスの無効化状況には影響せずに、アプリケーション ランチャー上に表示される Planner 製品のタイルを追加、削除することが可能です。

なお、現時点の Planner 製品の動作では、ライセンスを無効化した場合、アプリケーション ランチャー上から Planner のタイルが削除される動作となりますが、直接 Planner のサイトへアクセスすることは可能となっております。
Planner 上で新規プランの作成を制限する場合は、併せてこちらのブログ記事を参照いただき、プランの作成を制限することもご検討ください。

目次
1. Planner のライセンスについて 2. PowerShell を使用して一括で有効化、無効化する方法 3. 補足情報 (2016/7/22 追加) 4. 関連情報 1. Planner のライセンスについて
Planner 製品のライセンスは Office 365 E1/E3/E5、Office 365 Business Premium、Office 365 Business Essentials、および Office 365 Education に含まれております。
例えば、Office 365 E3 の場合は下記の様に Office 365 管理センターのユーザー管理のページにてライセンスの詳細項目を表示することで、確認可能できます。
テナント上で Planner 製品が利用可能になった時点で、既定でオンの状態で追加されます。

MicrosoftPlannerLicense

手動でライセンスの変更を行う場合は、上記にて Microsoft Planner をオン、もしくはオフにすることで、該当ユーザーの Planner の有効化、無効化を行うことができます。
しかしながら、テナント全体でオン、オフにする、といったような設定方法はないため、下記 2. にて、PowerShell を使用して一括で実行する方法をご案内いたします。

2. PowerShell を使用して一括で有効化、無効化する方法
例えば、「当初は Planner 製品を使用する予定が無いが、一定期間後に再度使用するようにしたい」、という場合は、下記手順にて一括してテナント全体のユーザーに対し、ライセンスをオン、オフすることが可能となります。
なお、下記の PowerShell スクリプトでは、それぞれのユーザーに対して Planner のライセンスのみオン/オフにする編集を行うため、その他のライセンス (Sway、Yammer 等) を既に無効化している場合でも、その他のライセンスの状態に変化はありません。

※注意点※
下記手順を使用することで、テナント全体のユーザーのライセンス情報を確認し、逐次 Planner ライセンスのみを対象にオン/オフにする処理が実施されます。
テナントに含まれるユーザー数が多い場合などは処理完了までに時間がかかることが予想されますので、業務時間外などに実行いただくか、あるいはスクリプトの内容を変更し、一部ユーザーのみに適用する、等をご検討ください。
また、ユーザー数が非常に多い場合、スクリプトの実行完了前に認証タイムアウトになり、エラーとなる場合がございます。この場合は数千人ずつ分けて実行する、等も併せてご検討ください。

  1. 64 Bit OS が動作している Windows 10/8.1/8/7 PC を準備します。

  2. Windows 7 PC で使用する場合は、前提条件を満たすために、最新の Windows Update をすべて適用します。Windows Update 適用後に再起動を行い、その後下記リンクから Windows Management Framework 3.0 をインストールし、 Windows PowerShell 3.0 を使用可能とします。(Windows 8 以降の場合は 2. の手順は不要です。)

     タイトル : Windows Management Framework 3.0
    アドレス : https://www.microsoft.com/en-us/download/details.aspx?id=34595
    
  3. 下記弊社 TechNet ページを参照し、Microsoft Online Services サインイン アシスタント、Windows PowerShell 用 Microsoft Azure Active Directory モジュール (64 ビット バージョン) のインストールを行います。

     タイトル : Connect to Office 365 PowerShell
    アドレス : https://technet.microsoft.com/ja-jp/library/dn975125.aspx
    
  4. PowerShell の実行ポリシーを変更していない場合は、インストールした Windows PowerShell の Microsoft Azure Active Directory モジュール を管理者権限で起動し、下記コマンドを実行します。(すでに変更済みの場合は 4. の手順は不要です。)

     Set-ExecutionPolicy RemoteSigned
    
  5. インストールした Windows PowerShell の Microsoft Azure Active Directory モジュール を起動します。

  6. 有効化を行う場合は、下記の有効化のスクリプト内容をコピーし、ps1 ファイルとして保存します。(例 : EnablePlannerLicense.ps1)
    また、無効化を行う場合は、下記の無効化のスクリプト内容をコピーし、ps1 ファイルとして保存します。(例 : DisablePlannerLicense.ps1)

  7. EnablePlannerLicense.ps1 ファイル、あるいは DisablePlannerLicense.ps1 ファイルを保存したフォルダーに移動し、下記の様に実行します。(下記は c:\temp 以下に ps1 ファイルを保存した場合の例となります。)

      ・有効化を行う場合
    cd c:\temp
    .\EnablePlannerLicense.ps1
    
     ・無効化を行う場合
    cd c:\temp
    .\DisablePlannerLicense.ps1
    
  8. 認証ダイアログが表示されますので、ご利用中のテナントの管理者アカウント (adminuser@tenant.onmicrosoft.com 等) およびパスワード情報を入力します。

  9. 処理中の内容が表示されますので、プロンプトが戻るまで待ちます。

  10. 処理完了後、ブラウザーにて Office 365 を表示していた場合は一度ブラウザーを終了させ、再度 Office 365 にサインインします。

  11. ユーザーのライセンス付与状況を確認し、Planner 製品のライセンスが期待通りとなっていることを確認します。また、アプリケーション ランチャー上の Planner のタイルの表示が期待通りとなっていることを確認します。

有効化を行う場合のスクリプト内容

 # Planner のサービス名
$service_name = "PROJECTWORKMANAGEMENT"

connect-msolservice -credential $msolcred

# ライセンスが割り当てられた全ユーザーの列挙 (この例では -All を指定しています。必要に応じて変更ください。)
$users = Get-MsolUser -All | where {$_.isLicensed -eq "True"}

# *********************************************************************
# 記述変更 例
# *********************************************************************
# 特定のライセンス保有者 (AccountSkuId は Get-MsolAccountSku で確認した値を指定します。)
# $users = Get-MsolUser -All | Where-Object {$_.Licenses[0].AccountSkuId -eq "testtenant:STANDARDPACK" -and $_.isLicensed -eq $True}
# $users = Get-MsolUser -All | Where-Object {$_.Licenses.AccountSkuId -eq "testtenant:STANDARDPACK" -and $_.isLicensed -eq $True}

# 特定ユーザーの指定
# $users = Get-MsolUser -UserPrincipalName "test@testtenant.onmicrosoft.com"

<#
# 改行単位で UPN が記述されたユーザー一覧から取得
# $users.Clear() 
$users = New-Object System.Collections.ArrayList
$list = Get-Content "UserList.txt"
foreach ($temp in $list)
{
    $users = $users + (Get-MsolUser -UserPrincipalName $temp)
}
#>

# ユーザー毎のライセンス/サービスの確認と変更
foreach ($user in $users)
{
    write-host ("Processing " + $user.UserPrincipalName)
    $licensetype = $user | Select-Object -ExpandProperty Licenses | Sort-Object { $_.Licenses }
    
    
    foreach ($license in $user.Licenses) 
    {
        write-host (" " + $license.accountskuid)

        $includeService = $false
        $disableplan = @()

        foreach ($row in $($license.ServiceStatus)) {
            if ( $row.ServicePlan.ServiceName -eq $service_name ) { $includeService=$true }
            if ( $row.ProvisioningStatus -eq "Disabled" -and $row.ServicePlan.ServiceName -ne $service_name) {
                $disableplan += $row.ServicePlan.ServiceName
            }
        }
<#
        # 指定したサービス が含まれる SKU の場合、現在の設定に加え、指定したサービス を無効化 (Disable)
        if ($includeService){
            $disableplan += $service_name
            write-host ("      found Target service in " + $license.accountskuid)
            write-host ("      disabled services : " + $disableplan )
            $x = New-MsolLicenseOptions -AccountSkuId $license.accountskuid -DisabledPlans $disableplan
            Set-MsolUserLicense -UserPrincipalName $user.UserPrincipalName -LicenseOptions $x
        }
#>
        
        # 指定したサービス が含まれる SKU の場合、現在の設定に加え、指定したサービス を有効化 (Enable)
        if ($includeService){
            write-host ("      found Target service in " + $license.accountskuid)
            write-host ("      current disabled services : " + $disableplan )
            $x = New-MsolLicenseOptions -AccountSkuId $license.accountskuid -DisabledPlans $disableplan
            Set-MsolUserLicense -UserPrincipalName $user.UserPrincipalName -LicenseOptions $x
        }
        
        
    }
}

無効化を行う場合のスクリプト内容

 # Planner のサービス名
$service_name = "PROJECTWORKMANAGEMENT"

connect-msolservice -credential $msolcred

# ライセンスが割り当てられた全ユーザーの列挙 (この例では -All を指定しています。必要に応じて変更ください。)
$users = Get-MsolUser -All | where {$_.isLicensed -eq "True"}

# *********************************************************************
# 記述変更 例
# *********************************************************************
# 特定のライセンス保有者 (AccountSkuId は Get-MsolAccountSku で確認した値を指定します。)
# $users = Get-MsolUser -All | Where-Object {$_.Licenses[0].AccountSkuId -eq "testtenant:STANDARDPACK" -and $_.isLicensed -eq $True}
# $users = Get-MsolUser -All | Where-Object {$_.Licenses.AccountSkuId -eq "testtenant:STANDARDPACK" -and $_.isLicensed -eq $True}

# 特定ユーザーの指定
# $users = Get-MsolUser -UserPrincipalName "test@testtenant.onmicrosoft.com"

<#
# 改行単位で UPN が記述されたユーザー一覧から取得
# $users.Clear() 
$users = New-Object System.Collections.ArrayList
$list = Get-Content "UserList.txt"
foreach ($temp in $list)
{
    $users = $users + (Get-MsolUser -UserPrincipalName $temp)
}
#>

# ユーザー毎のライセンス/サービスの確認と変更
foreach ($user in $users)
{
    write-host ("Processing " + $user.UserPrincipalName)
    $licensetype = $user | Select-Object -ExpandProperty Licenses | Sort-Object { $_.Licenses }
    
    
    foreach ($license in $user.Licenses) 
    {
        write-host (" " + $license.accountskuid)

        $includeService = $false
        $disableplan = @()

        foreach ($row in $($license.ServiceStatus)) {
            if ( $row.ServicePlan.ServiceName -eq $service_name ) { $includeService=$true }
            if ( $row.ProvisioningStatus -eq "Disabled" -and $row.ServicePlan.ServiceName -ne $service_name) {
                $disableplan += $row.ServicePlan.ServiceName
            }
        }

        # 指定したサービス が含まれる SKU の場合、現在の設定に加え、指定したサービス を無効化 (Disable)
        if ($includeService){
            $disableplan += $service_name
            write-host ("      found Target service in " + $license.accountskuid)
            write-host ("      disabled services : " + $disableplan )
            $x = New-MsolLicenseOptions -AccountSkuId $license.accountskuid -DisabledPlans $disableplan
            Set-MsolUserLicense -UserPrincipalName $user.UserPrincipalName -LicenseOptions $x
        }

        <#
        # 指定したサービス が含まれる SKU の場合、現在の設定に加え、指定したサービス を有効化 (Enable)
        if ($includeService){
            write-host ("      found Target service in " + $license.accountskuid)
            write-host ("      current disabled services : " + $disableplan )
            $x = New-MsolLicenseOptions -AccountSkuId $license.accountskuid -DisabledPlans $disableplan
            Set-MsolUserLicense -UserPrincipalName $user.UserPrincipalName -LicenseOptions $x
        }
        #>
        
    }
}

3. 補足情報
冒頭に記載いたしましたように、現時点の Planner 製品の動作では、ライセンスを無効化した場合、アプリケーション ランチャー上から Planner のタイルが削除される動作となりますが、直接 Planner のサイトへアクセスすることは可能となっております。
下記のような通知機能によって、一般ユーザーが Planner のサイトへアクセスすることも想定されるため、Planner 上で新規プランの作成を制限する場合は、併せてこちらのブログ記事を参照いただき、プランの作成を制限することもご検討ください。

また、テナントに対して Planner ライセンスの無効化処理を実施した場合でも、それ以降に新規に作成した Office 365 ユーザーに Office 365 Enterprise E3 等の (Planner を含む) ライセンスを付与すると、Planner が有効な状態で Office 365 ユーザーが作成されます。 このため、追加した Office 365 ユーザーに対して再度 Planner ライセンスの無効化を実施する等の運用をご検討いただくか、こちらのブログ記事を参照いただき、プランの作成を制限することもご検討ください。

・Office 365 の通知機能
Office 365 では、アプリケーション ランチャー上に Planner 等の新製品のタイルが追加された場合、右上の [ベル] のアイコン部分に通知が表示され、[個人用アプリ] の通知部分に通知が追加されます。
通知されたアプリが Planner のみの場合は、該当の通知部分をクリックすると Planner のサイトに移動する動作となります。
Planner 以外に複数のアプリの追加が存在した場合、[個人用アプリ] のページに遷移し、表示されているアプリケーション ランチャー上のタイル一覧が表示される動作となります。

このため、例えば Planner の機能が先にテナントで有効になり、その後上記の方法でライセンスの無効化を行った場合は、アプリケーション ランチャー上から Planner のタイルが削除されるものの、Planner に関する通知のみが残る動作となります。
また、通知されたアプリが Planner のみであった場合は、通知をクリックすることで Planner サイトが表示される動作となります。

一方、複数のアプリに関する通知が表示されている場合は、アプリケーション ランチャー上のタイル一覧が表示される [個人用アプリ] のページに遷移しますが、既に Planner のタイルは削除済みのため、ここから Planner のサイトに遷移することはできません。
また、Planner の機能が有効になる前にライセンスの無効化を行った場合には Planner に関する通知は表示されません。

・Planner/Office 365 グループの通知機能
Planner および、ベースとなる Office 365 グループには、通知機能があります。
一部のユーザーのみ Planner や Office 365 グループの機能を使用する状況にて、機能を使用させたくないユーザーをグループに加える、プラン内のタスクに割り当てる、等の操作を行うことで、そのユーザーにも通知が行われます。
このため、機能を使用しないユーザーをグループに加えない、プランのメンバーに加えない、プラン内のタスクに割り当てない、等の運用方法をご検討ください。

参考情報
タイトル : グループを購読する
アドレス : https://support.office.com/ja-JP/article/e147fc19-f548-4cd2-834f-80c6235b7c36

タイトル : タスクおよびプランに関するメールを受け取る
アドレス : https://support.office.com/ja-JP/article/cce223d6-b0ae-43cf-a080-266e2414a859 4. 関連情報
関連ブログ記事、および上記の PowerShell スクリプトに関連する情報をご案内いたします。

タイトル : Microsoft Planner の関連情報について
アドレス : https://blogs.technet.microsoft.com/sharepoint_support/2016/05/26/office-365-planner-related-information/

タイトル : Microsoft Planner にて一般ユーザーによるプラン作成を制限する方法について (V2)
アドレス : https://blogs.technet.microsoft.com/sharepoint_support/2017/03/27/microsoft-planner-plan-creation-restriction-v2/

タイトル : Microsoft Planner にて一般ユーザーによるプラン作成を制限する方法について
アドレス : https://blogs.technet.microsoft.com/sharepoint_support/2016/06/24/microsoft-planner-plan-create-restriction/

タイトル : PowerShell による詳細なライセンス割り当て
アドレス : https://community.office365.com/ja-jp/w/manage/1077

タイトル : Office 365 ライセンスと Windows PowerShell: ユーザーのライセンスの状態を確認する
アドレス : https://technet.microsoft.com/ja-jp/library/dn771772.aspx

タイトル : ユーザーへのライセンスの割り当て
アドレス : https://technet.microsoft.com/ja-jp/library/dn771770.aspx

タイトル : サービスのライセンス情報を表示する
アドレス : https://technet.microsoft.com/ja-jp/library/dn771771.aspx

タイトル : サービスにアクセスを割り当てる
アドレス : https://technet.microsoft.com/ja-jp/library/dn771769.aspx

今回の投稿は以上です。


本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。