使组织的 Planner 租户可移动

如果你是租户管理员,且已为组织要移动到新区域的 Planner 租户提出支持请求,请先使用 PowerShell 对迁移操作进行授权。

备注

将 Planner 租户移动到新区域将导致任何现有 Planner 数据丢失。

在 Windows PowerShell 中进行 Planner 更改的先决条件

此过程完整介绍了如何下载在 PowerShell 中运行 Planner 管理命令所需的文件:

  • 两个 Active Directory DLL
  • 一个 PowerShell 脚本
  • 脚本的清单

如果刚接触 Windows PowerShell,请查看 Windows PowerShell 入门

  1. 导航到 https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/3.19.8。
  2. 在右侧,选择“手动下载”,选择“另存为”,选择要将其保存到的位置,然后选择“保存”。
  3. 在文件资源管理器中查找文件,并将其文件扩展名从 .nupkg 更改为 .zip。
  4. 右键单击文件,然后选择“属性”。 在“常规”选项卡上,如果看到“取消阻止”复选框,请将其选中,然后选择“确定”。
  5. 右键单击 .zip 文件,然后选择“全部提取”。 选择“提取”。 最终将获得一个名为“microsoft.identitymodel.clients.activedirectory.3.19.8”的解压缩文件夹。
  6. 将以下代码复制到文本编辑器中,并将其在“microsoft.identitymodel.clients.activedirectory.3.19.8\lib\net45”文件夹中另存为 SetPlannerTenantSettings.psm1。
function Connect-AAD ()
{
<#
.Synopsis
(Private to module) Attempts to obtain a token from AAD.
.Description
This function attempts to obtain a token from Azure Active Directory.
.example
$authorizationContext = Connect-AAD
#>
    $authUrl = "https://login.microsoftonline.com/common" # Prod environment
    $resource = "https://tasks.office.com" # Prod environment
    $clientId = "d3590ed6-52b3-4102-aeff-aad2292ab01c"
   
    $redirectUri = "urn:ietf:wg:oauth:2.0:oob"
    $platformParameters = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters" -ArgumentList "Always"    

    $authentiationContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authUrl, $False

    $authenticationResult = $authentiationContext.AcquireTokenAsync($resource, $clientId, $redirectUri, $platformParameters).Result
    return $authenticationResult
}

function Set-PlannerConfiguration
{
<#
.Synopsis
Configures tenant level settings for Microsoft Planner.
.Description
This cmdlet allows tenant administrators to change policies regarding availability of certain features in Microsoft Planner. The changes to settings take effect immediately. This cmdlet specifies the administrator preference on whether the feature should be available. The features can still be disabled due to Microsoft Planner behavior, at the discretion of Microsoft.
.Parameter Uri
The URL of the Tenant-Level Settings API for the Planner instance to control.
.Parameter AccessToken
A valid access token of a user with tenant-level administrator privileges.
.Parameter AllowCalendarSharing
If set to $false, disables creating iCalendar links from Microsoft Planner, and disables previously created iCalendar links.  If set to $true, enables creating iCalendar links from Microsoft Planner and re-enables any previously created iCalendar links.
.Parameter AllowTenantMoveWithDataLoss
If set to $true, allows the tenant to be moved to another Planner environment or region. This move will result in the tenant's existing Planner data being lost.
.example

Set-PlannerConfiguration -AllowCalendarSharing $true

.example

Set-PlannerConfiguration -AllowTenantMoveWithDataLoss $true
#>
    param(
        [ValidateNotNull()]
        [System.String]$Uri="https://tasks.office.com/taskAPI/tenantAdminSettings/Settings",

        [ValidateNotNullOrEmpty()]
        [Parameter(Mandatory=$false)][System.String]$AccessToken,
        [Parameter(Mandatory=$false, ValueFromPipeline=$true)][System.Boolean]$AllowCalendarSharing,
        [Parameter(Mandatory=$false, ValueFromPipeline=$true)][System.Boolean]$AllowTenantMoveWithDataLoss
        )
   
    if(!($PSBoundParameters.ContainsKey("AccessToken"))){
        $authorizationContext = Connect-AAD
        $AccessToken = $authorizationContext.AccessTokenType.ToString() + ' ' +$authorizationContext.AccessToken
    }
   
    $flags = @{}
   
     if($PSBoundParameters.ContainsKey("AllowCalendarSharing")){
        $flags.Add("allowCalendarSharing", $AllowCalendarSharing);
    }

    if($PSBoundParameters.ContainsKey("AllowTenantMoveWithDataLoss")){
        $flags.Add("allowTenantMoveWithDataLoss", $AllowTenantMoveWithDataLoss);
    }

    $propertyCount = $flags | Select-Object -ExpandProperty Count
    
    if($propertyCount -eq 0) {
        Throw "No properties were set."
    }
    
    $requestBody = $flags | ConvertTo-Json

    Invoke-RestMethod -ContentType "application/json;odata.metadata=full" -Headers @{"Accept"="application/json"; "Authorization"=$AccessToken; "Accept-Charset"="UTF-8"; "OData-Version"="4.0;NetFx"; "OData-MaxVersion"="4.0;NetFx"} -Method PATCH -Body $requestBody $Uri
}
function Get-PlannerConfiguration
{
<#
.Synopsis
Retrieves tenant level settings for Microsoft Planner.
.Description
This cmdlet allows users and tenant administrators to retrieve policy preferences set by the tenant administrator regarding availability of certain features in Microsoft Planner.  While a feature may be permitted by a tenant administrator's preference, features can still be disabled due to Microsoft Planner behavior, at the discretion of Microsoft.
.Parameter Uri
The URL of the Tenant-Level Settings API for the Planner instance to retrieve.
.Parameter AccessToken
A valid access token of a user with tenant-level administrator privileges.
.example
Get-PlannerConfiguration
#>
    param(
        [ValidateNotNull()]
        [System.String]$Uri="https://tasks.office.com/taskAPI/tenantAdminSettings/Settings",
        [Parameter(Mandatory=$false)]
        [ValidateNotNullOrEmpty()]
        [System.String]$AccessToken
        )
   
    if(!($PSBoundParameters.ContainsKey("AccessToken"))){
        $authorizationContext = Connect-AAD
        $accessToken = $authorizationContext.AccessTokenType.ToString() + ' ' +$authorizationContext.AccessToken
    }
   
    $response = Invoke-RestMethod -ContentType "application/json;odata.metadata=full" -Headers @{"Accept"="application/json"; "Authorization"=$AccessToken; "Accept-Charset"="UTF-8"; "OData-Version"="4.0;NetFx"; "OData-MaxVersion"="4.0;NetFx"} -Method GET $Uri
     $result = New-Object PSObject -Property @{
        "AllowCalendarSharing" = $response.allowCalendarSharing
        "AllowTenantMoveWithDataLoss" = $response.allowTenantMoveWithDataLoss
    }

    return $result
}

Export-ModuleMember -Function Get-PlannerConfiguration, Set-PlannerConfiguration
  1. 将以下代码复制到文本编辑器中,并将其在“microsoft.identitymodel.clients.activedirectory.3.19.8\lib\net45”文件夹中另存为 SetPlannerTenantSettings.psd1。
#
# Module manifest for module 'SetTenantSettings'
#
# Generated by: Microsoft Corporation
#
# Generated on: 12/17/2017
#

@{

# Script module or binary module file associated with this manifest.
RootModule = 'SetPlannerTenantSettings.psm1' 
# Version number of this module. 
ModuleVersion = '1.0' 
# Supported PSEditions # 
CompatiblePSEditions = @() 
# ID used to uniquely identify this module 
GUID = '6250c644-4898-480c-8e0b-bd3ebdf246ca' 
# Author of this module 
Author = 'Microsoft Corporation' 
# Company or vendor of this module 
CompanyName = 'Microsoft Corporation' 
# Copyright statement for this module 
Copyright = '(c) 2017 Microsoft Corporation. All rights reserved.' 
# Description of the functionality provided by this module 
Description = 'Planner Tenant Settings client' 
# Minimum version of the Windows PowerShell engine required by this module #
PowerShellVersion = '' 
# Name of the Windows PowerShell host required by this module # 
PowerShellHostName = '' 
# Minimum version of the Windows PowerShell host required by this module #
PowerShellHostVersion = '' 
# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. #
DotNetFrameworkVersion = '' 
# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. # 
CLRVersion = '' 
# Processor architecture (None, X86, Amd64) required by this module #
ProcessorArchitecture = '' 
# Modules that must be imported into the global environment prior to importing this module # 
RequiredModules = @() 
# Assemblies that must be loaded prior to importing this module 
RequiredAssemblies = @("Microsoft.IdentityModel.Clients.ActiveDirectory.dll","Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll") 
# Script files (.ps1) that are run in the caller's environment prior to importing this module. # 
ScriptsToProcess = @() 
# Type files (.ps1xml) to be loaded when importing this module # 
TypesToProcess = @() 
# Format files (.ps1xml) to be loaded when importing this module # 
FormatsToProcess = @() 
# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess # 
NestedModules = @() 
# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. 
FunctionsToExport = @("Get-PlannerConfiguration", "Set-PlannerConfiguration") 
# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. 
CmdletsToExport = @() 
# Variables to export from this module 
VariablesToExport = '*' 
# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. 
AliasesToExport = @() 
# DSC resources to export from this module # 
DscResourcesToExport = @() 
# List of all modules packaged with this module # 
ModuleList = @() 
# List of all files packaged with this module # 
FileList = @("SetTenantSettings.psm1") 
# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. 
PrivateData = @{ PSData = @{ 
# Tags applied to this module. These help with module discovery in online galleries. # 
Tags = @() 
# A URL to the license for this module. # 
LicenseUri = '' 
# A URL to the main website for this project. # 
ProjectUri = '' 
# A URL to an icon representing this module. # 
IconUri = '' 
# ReleaseNotes of this module # 
ReleaseNotes = '' } 
# End of PSData hashtable 
} 
# End of PrivateData hashtable 
# HelpInfo URI of this module # 
HelpInfoURI = '' 
# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. # 
DefaultCommandPrefix = '' }
  1. 运行此命令以将这些文件导入到 PowerShell 中,确保从计算机添加你的唯一文件路径:
Import-Module [File path on your computer]microsoft.identitymodel.clients.activedirectory.3.19.8\lib\net45\SetPlannerTenantSettings.psd1 

现在,你已准备好使用 PowerShell 在组织级别上对 Planner 进行更改。

使用 PowerShell 授权租户迁移

  1. 打开 PowerShell 并运行以下命令,授权租户迁移:

    Set-PlannerConfiguration -AllowTenantMoveWithDataLoss $true

    如果你改变了想法,希望阻止租户移动,请运行以下命令。 请注意,一旦 Planner 团队开始租户迁移,都必须完成迁移。

    Set-PlannerConfiguration -AllowTenantMoveWithDataLoss $false

    备注

    需要使用 Azure Active Directory 凭据登录并使用本地 PowerShell 窗口(而非 Azure Cloud Shell)。

  2. 若要验证设置,请执行以下操作:

    • 在 PowerShell 中,运行:Get-PlannerConfiguration
    • 此命令返回的 AllowTenantMoveWithDataLoss 值表示租户迁移当前是否已获得授权。