使用适用于 Microsoft 365 的 PowerShell 分配每个用户Skype for Business联机策略

此文章适用于 Microsoft 365 企业版和 Office 365 企业版。

使用 PowerShell for Microsoft 365 是使用 Skype for Business Online 策略分配每用户通信设置的有效方法。

准备运行 PowerShell 命令

按照以下说明设置运行命令, (跳过) 已完成的步骤:

注意

Skype for Business Online 连接器目前是最新 Teams PowerShell 模块的一部分。 如果你使用的是最新 Teams PowerShell 公共版本,则无需安装 Skype for Business Online 连接器。

  1. 安装 Teams PowerShell 模块

  2. 开启 Windows PowerShell 命令提示符并运行以下命令:

    Import-Module MicrosoftTeams
    Connect-MicrosoftTeams
    

    出现提示时,输入Skype for Business Online 管理员帐户名称和密码。

更新用户帐户的外部通信设置

假设你想要更改用户帐户上的外部通信设置。 例如,你希望允许 Alex 与联合用户通信, (EnableFederationAccess 等于 True) 但不与 Windows Live 用户通信, (EnablePublicCloudAccess 等于 False) 。 为此,需要执行两项操作:

  1. 找到符合我们的条件的外部访问策略。

  2. 将该外部访问策略分配给 Alex。

如何确定要分配哪个外部访问策略 Alex? 以下命令返回在 EnableFederationAccess 设置为 True 且 EnablePublicCloudAccess 设置为 False 时的所有外部访问策略:

Get-CsExternalAccessPolicy -Include All| Where-Object {$_.EnableFederationAccess -eq $True -and $_.EnablePublicCloudAccess -eq $False}

除非已创建 ExternalAccessPolicy 的任何自定义实例,否则该命令将返回一个符合条件的策略, (FederationOnly) 。 下面是一个示例:

Identity                          : Tag:FederationOnly
Description                       :
EnableFederationAccess            : True
EnableXmppAccess                  : False
EnablePublicCloudAccess           : False
EnablePublicCloudAudioVideoAccess : False
EnableOutsideAccess               : True

现在,你已知道要分配给 Alex 的策略,我们可以使用 Grant-CsExternalAccessPolicy cmdlet 分配该策略。 下面是一个示例:

Grant-CsExternalAccessPolicy -Identity "Alex Darrow" -PolicyName "FederationOnly"

分配策略很简单:可以指定要分配的用户的标识和策略的名称。

在策略和策略分配方面,你并不局限于一次使用一个用户帐户。 例如,假设您需要获得可与联盟伙伴和 Windows Live 用户通信的所有用户的列表。 我们已经知道,这些用户已分配有外部用户访问策略 FederationAndPICDefault。 因为我们知道,你可以通过运行一个简单的命令来显示所有这些用户的列表。 下面是 命令:

Get-CsOnlineUser -Filter {ExternalAccessPolicy -eq "FederationAndPICDefault"} | Select-Object DisplayName

换句话说,向我们显示 ExternalAccessPolicy 属性设置为 FederationAndPICDefault 的所有用户。 (为了限制屏幕上显示的信息量,请使用 Select-Object cmdlet 仅显示每个用户的显示名称。)

若要将所有用户帐户配置为使用同一策略,请使用以下命令:

Get-CsOnlineUser | Grant-CsExternalAccessPolicy "FederationAndPICDefault"

此命令使用 Get-CsOnlineUser 返回已为 Lync 启用的所有用户的集合,然后将所有这些信息发送到 Grant-CsExternalAccessPolicy,后者将 FederationAndPICDefault 策略分配给集合中的每个用户。

作为另一个示例,假设你以前为 Alex 分配了 FederationAndPICDefault 策略,现在你改变了主意,希望他受全局外部访问策略管理。 无法将全局策略显式分配给任何人。 如果没有将每用户策略分配给该用户,则全局策略将用于给定用户。 因此,如果我们希望 Alex 由全局策略管理,则需要 取消分配 之前分配给他的任何每用户策略。 下面是一个示例命令:

Grant-CsExternalAccessPolicy -Identity "Alex Darrow" -PolicyName $Null

此命令将分配给 Alex 的外部访问策略的名称设置为 null 值 ($Null) 。 Null 表示“无”。 换句话说,没有外部访问策略分配给 Alex。 如果未向用户分配外部访问策略,则该用户随后由全局策略进行管理。

管理大量用户

若要管理 (1000 个或更多) 的大量用户,需要使用 Invoke-Command cmdlet 通过脚本块对命令进行批处理。 在前面的示例中,每次执行 cmdlet 时,它都必须设置调用,然后等待结果,然后再将其发送回。 使用脚本块时,这允许远程执行 cmdlet,完成后再发送回数据。

$s = Get-PSSession | Where-Object { ($.ComputerName -like '*.online.lync.com' -or $.Computername -eq 'api.interfaces.records.teams.microsoft.com') -and $.State -eq 'Opened' -and $.Availability -eq 'Available' }

$users = Get-CsOnlineUser -Filter { ClientPolicy -eq $null } -ResultSize 500

$batch = 50
$filter = ''
$total = $users.Count
$count = 0
    $users | ForEach-Object {
    $upn = $_.UserPrincipalName
    $filter += "(UserPrincipalName -eq '$upn')"
    $batch--
    $count++
    if (($batch -eq 0) -or ($count -eq $total)) {
        $filterSB=[ScriptBlock]::Create($filter)
        Invoke-Command -Session $s -ScriptBlock {param($f) Get-CsOnlineUser -filter $f | Grant-CsClientPolicy -PolicyName "ClientPolicyNoIMURL" -Passthru | Grant-CsExternalAccessPolicy -PolicyName "FederationAndPICDefault"} -ArgumentList $filterSB

        # Reset
        $batch = 50
        $filter = ''
    } else {
        $filter += " -or "
    }
}

这会一次查找 500 个没有客户端策略的用户。 它向他们授予客户端策略“ClientPolicyNoIMURL”和外部访问策略“FederationAndPicDefault”。 结果将批处理为 50 个组,然后每批 50 个将发送到远程计算机。

另请参阅

使用 PowerShell 管理 Skype for Business Online

使用 PowerShell 管理 Microsoft 365

PowerShell for Microsoft 365 入门