使用 Windows Azure Active Directory 管理 Office 365

 

上一次修改主题: 2015-03-09

**摘要:**使用 Windows PowerShell 来管理使用 Windows PowerShell cmdlet、脚本和批处理过程的 Office 365。

您是对的:当您看到“Azure Active Directory”这个词时,您首先想到的可能不是“嘿,我敢打赌,这就是您使用 Windows PowerShell 管理 Office 365 的方式。”但是,事实证明,“Azure”长期以来一直是 Microsoft 的云服务的名称,而“Active Directory”长期以来一直刚好就是 Active Directory 的名称。把它们放在一起,您就会得到 Azure Active Directory Directory,它是一种使您能够使用 Windows PowerShell 管理 Office 365 用户、组、许可证和订阅的技术。本主题包括有关以下方面的信息:

  • 返回 Office 365 用户帐户信息

  • 选择要返回的用户帐户属性值

  • 配置用户帐户属性值

  • 使用 Office 365 用户许可证

  • 关于位置参数和 Office 365 的提示

如果您想多一点了解有关 Azure Active Directory cmdlet 的详细信息,您可以在这里找到这些信息。

返回 Office 365 用户帐户信息

抛开名称,将重点放在可以使用 Azure Active Directory 执行的管理任务上会更加有趣(重要)。Azure Active Directory 包括 66 个 cmdlet,其中大部分用于管理您的 Office 365 用户、组和许可证。例如,需要您的 Office 365 用户的快速列表?请尝试使用以下命令:

Get-MsolUser

虽然这有点走弯路,但却可能是谈论 cmdlet 名称的好时机。如果您看一下 Azure Active Directory cmdlet 的名称,您会注意到它们有一个共同点:

  • Add-MsolForeignGroupToRole

  • Add-MsolGroupMember

  • Add-MsolRoleMember

  • Confirm-MsolDomain

  • Connect-MsolService

正如您所看到的,每个 cmdlet 名词(连字符后的名称部分)均以前缀 Msol 开始。巧合?不完全是。相反,Msol 前缀(MsOnline 的缩写)用于将这些 cmdlet 标识为 Azure Active Directory cmdlet。所有 Azure Active Directory cmdlet 必须使用前缀 Msol,其他 Windows PowerShell cmdlet 则不可以使用 Msol 前缀。例如,SharePoint Online cmdlet 都具有以下前缀:

  • Add-SPOUser

  • Connect-SPOService

  • Disconnect-SPOService

  • Get-SPOAppErrors

  • Get-SPOAppInfo

Lync Online cmdlet 都使用前缀 Cs:

  • Get-CsAudioConferencingProvider

  • Get-CsOnlineUser

  • Get-CsTenant

  • Get-CsTenantFederationConfiguration

  • Get-CsTenantHybridConfiguration

Cs 前缀实际上是 Communication Server 的缩写。这是因为 Lync Server 以前称为 Office Communications Server。正式更改名称时,已经实现了大量的 cmdlet。因为在那个时候更改 cmdlet 名称可能会延迟产品的发布,所以做出了保留 Cs 前缀的决定。

有趣的是,Exchange cmdlet 不使用任何种类的前缀:

  • Add-RecipientPermission

  • Get-LinkedUser

  • Get-RecipientPermission

  • Get-RemovedMailbox

  • Get-SendAddress

为什么不呢?因为 Exchange 是第一个发布 Windows PowerShell cmdlet 集的服务器产品。当时,不强制使用 cmdlet 前缀或其他标识符。但是,随着其他服务器团队开始创建 cmdlet,很快,大家都意识到一个问题:如果 Exchange 有一个名为 Set-User(实际上的确有)的 cmdlet,那么,需要一个用于设置用户属性的 cmdlet 的其他团队该怎么办?(cmdlet 名称必须是唯一的。)解决方案是使用前缀。因此,我们现在才有名称是 Set-MsolUser、Set-CsUser 和 Set-SPOSiteUser 之类的 cmdlet。

不管怎样,运行 Get-MsolUser 都会返回类似于以下的信息:

UserPrincipalName                     DisplayName           isLicensed
-----------------                     -----------           ----------
ZrinkaM@litwareinc.onmicrosoft.com    Zrinka Makovac        True
BonnieK@litwareinc.onmicrosoft.com    Bonnie Kearney        True
FabriceC@litwareinc.onmicrosoft.com   Fabrice Canel         True
BrianJ@litwareinc.onmicrosoft.com     Brian Johnson         False 
AnneWlitwareinc.onmicrosoft.com       Anne Wallace          True

所有这些都是您的 Office 365 用户。

但是,假设您只想查看未经授权的用户列表;也就是说,已被添加到 Office 365,但还没有被授权使用任何软件应用程序的用户。这也很简单:

Get-MsolUser -UnlicensedUsersOnly

同样,我们调用了 Get-MsolUser cmdlet,只是这次我们附加了 UnlicensedUsersOnly 参数。顾名思义,该参数将返回的数据限制为尚未颁发任何许可证的用户:

UserPrincipalName                     DisplayName           isLicensed
-----------------                     -----------           ----------
BrianJ@litwareinc.onmicrosoft.com     Brian Johnson         False
ScottW@litwareinc.onmicrosoft.com     Scott Wallace         False

非常好。

我们还要说明一下,Windows PowerShell 因作为一种由 Martians 创建的计算机语言而知名。当许多人想到 Windows PowerShell 时,他们会想到类似下面的命令:

gc test.txt | sort {[int]$_} |% {$i = 1}{while ($i -lt $_){$i;$i++};$i++}

当然,这个命令是有点...笨拙...另一方面,我们刚刚向您展示了一个只返回未获得 Office 365 授权的用户的命令。为做到这一点,我们使用了一个名为 Get-MsolUser 的 cmdlet 和一个名为 UnlicensedUsersOnly 的参数:

Get-MsolUser -UnlicensedUsersOnly

当我们运行该命令时,我们只返回未经授权的用户。

这也就意味着,您经常可以根据意愿使 Windows PowerShell 变得或神秘莫测,或清晰明了

选择要返回的用户帐户属性值

Windows PowerShell 使您可以以自己的方式进行操作。例如,我们看到运行 Get-MsolUser cmdlet 将返回三个属性值:

  • UserPrincipalName

  • DisplayName

  • isLicensed

这没什么问题,但如果我们确实想要查看用户的显示名称、用户任职部门以及用户“使用”Office 365 服务的国家/地区,应该怎么做?

备注

是的,“使用”这个词不太准确。但我们不追究术语:UsageLocation 属性指示用户通常使用 Office 365 的地理位置。这非常重要:Office 365 许可证、策略和可用功能部分涉及此位置。

我们可以看到,Get-MsolUser 仅向我们显示首选属性中的一个属性:DisplayName。看起来运气不太好。

是的。除非运行以下命令,否则:

Get-MsolUser | Select-Object DisplayName, Department, UsageLocation

命令将返回以下信息:

DisplayName             Department                       UsageLocation
-----------             ----------                       -------------
Zrinka Makovac          Sales & Marketing                US
Bonnie Kearney          Sales & Marketing                US
Fabrice Canel           Legal                            US
Brian Johnson
Anne Wallace            Executive Management             US
Alex Darrow             Sales & Marketing                US
David Longmuir          Operations                       US

我们今天不会说明它的所有功能,概述文章中不需要包括如此多的内容。相反,只需注意,您可以通过 Select-Object cmdlet(作为 Windows PowerShell 3.0 推出)挑选希望 cmdlet 返回的属性。假设您只想查看 UsageLocation 属性的值。让 Select-Object 仅返回这一个属性:

Get-MsolUser | Select-Object DisplayName

您还可以通过 Select-Object 返回某个项目的所有属性值;请尝试使用以下命令并查看所发生的情况:

Get-MsolUser | Select-Object *

这非常有用,因为如我们所见,cmdlet 并不会始终返回项目的所有可用信息。如果您要查看 Get-MsolUser 有关用户的所有信息,可使用类似于以下的命令:

Get-MsolUser -UserPrincipalName "BelindaN@litwareinc.onmicosoft.com" | Select-Object *

还有另一个方便的命令,此命令将返回有关不具有使用位置的用户的信息。(这很重要,因为如果不设置位置,您将无法与这些用户进行交互。)命令如下:

Get-MsolUser | Where-Object {$_.UsageLocation -eq $Null} | Select-Object DisplayName, Department, UsageLocation

返回的数据如下:

DisplayName              Department                      UsageLocation
-----------              ----------                      -------------
Brian Johnson 
Scott Wallace            Operations

只有两个当前不具有 UsageLocation 的用户。

配置用户帐户属性值

到目前为止,我们已经了解如何使用 Windows PowerShell 返回信息。您还可以使用 Azure Active Directory cmdlet 配置信息,这可能是更好的一件事情。假设 Belinda Newman 已经搬到法国,需要将其使用位置设置为 FR(“法国”的 ISO (国际标准化组织)代码)?好。那么:

Set-MsolUser -UserPrincipalName "BelindaN@litwareinc.onmicosoft.com" -UsageLocation "FR"

您会看到这非常简单。我们已经了解 Get-MsolUser cmdlet 可以返回名为“UsageLocation”的属性。那么,我们是否要设置该属性值?我们可以仅使用相应的 Set-MsolUser cmdlet 及 UsageLocation 参数:

Set-MsolUser -UserPrincipalName "BelindaN@litwareinc.onmicosoft.com" -UsageLocation "FR"

这确实一点都不难。

还有更酷的事情。假设所有用户都已搬到法国,该怎么设置?没有问题:

Get-MsolUser | Set-MsolUser -UsageLocation "FR"

这种情况下,我们使用了 Get-MsolUser cmdlet 返回所有用户帐户。然后将此信息“通过管道”传递给 Set-MsolUser cmdlet。请查看命令中的小管道分割符字符,字符应如下所示:

|

如果在 Windows PowerShell 命令中看到管道字符,说明您将使用第一个 cmdlet (Get-MsolUser) 获取任何信息,然后将所有信息传给第二个 cmdlet (Set-MsolUser)。在这种情况下,意味着我们要使 Set-MsolUser 获取所有用户帐户,并将 UsageLocation 属性设置为 FR。

“不错”,如果让我们自己这样说。

备注

可能说起来非常容易。无需担心:以下是使用管道传输和 Windows PowerShell 的很好的简介

使用 Office 365 用户许可证

如前所述,您可以使用 Azure cmdlet 执行许多操作;例如,此命令可返回有关您拥有的多个 Office 365 许可证以及您尚未分发的许可证的信息:

Get-MsolAccountSku

返回的数据如下所示:

AccountSkuId                 ActiveUnits   WarningUnits  ConsumedUnits
------------                 -----------   ------------   ------------
litwareinc:ENTERPRISEPACK    25            0              25

在我们的示例数据中,litwareinc 域已颁发 25 个许可证 (ActiveUnits),这 25 个许可证当前全都已分配给用户 (ConsumedUnits)。

非常好。当然,如果能够查看许可证已分配给的各个用户就更好了。恕不赘述,下面介绍了如何查找分配给 Ken Myer 的当前许可证:

Get-MsolUser -UserPrincipalName "kenmyer@litwareinc.onmicrosoft.com" | Select-Object -ExpandProperty Licenses | Select-Object -ExpandProperty ServiceStatus

我们将进行简单说明,因为这无疑是一个更加复杂的命令。在此命令中,我们首先使用 Get-MsolUser 返回用户 kenmyer@litwareinc.onmicrosoft.com 的信息。然后,我们通过管道将该信息传递到 Select-Object cmdlet,并使用 ExpandProperty 参数扩展 Licenses 属性。我们之所以需要这样做是因为 Licenses 是一个多值属性;也就是说,它包含多个值(在此示例中,即多个许可证),我们想确保使用的是全部许可证。然后,我们通过管道将许可证信息传递到 Select-Object,并扩展 ServiceStatus 属性,以获取每个用户许可证的详细信息。

备注

如果上述简单说明没有起到任何作用,请参阅这篇有关多个属性值的文章

在进行完说明和操作之后,我们应该会获得以下内容:

ServicePlan                      ProvisioningStatus
-----------                      ------------------
YAMMER_ENTERPRISE                None
RMS_S_ENTERPRISE                 Success
OFFICESUBSCRIPTION               Success
MCOSTANDARD                      Success
SHAREPOINTWAC                    Success
SHAREPOINTENTERPRISE             Success
EXCHANGE_S_ENTERPRISE            Success

不可否认,初看可能无法很明显地看出发生了什么。幸运的是,似乎并不是这么不明显。ServicePlan 属性包含许可证(您组织中可用的许可证取决于您购买的 Office 365 计划)集合。我们的 ServicePlan 属性值相当于以下内容:

索引号 服务计划 产品

0

YAMMER_ENTERPRISE

Yammer

1

RMS_S_ENTERPRISE

Windows Azure Active Directory

2

OFFICESUBSCRIPTION

Office Professional Plus

3

MCOSTANDARD

Lync

4

SHAREPOINTWAC

Office Web Apps

5

SHAREPOINTNETERPRISE

SharePoint

6

EXCHANGE_S_ENTERPRISE

Exchange

反过来,ProvisioningStatus 属性告诉我们许可证是否已分配:

  • “无”表示未分配任何许可证。

  • “成功”表示许可证已分配。

  • “禁用”表示许可证已分配但已禁用。

正如您所看到的,除了 Yammer 以外,Ken Myer 已分配有其他所有可用的许可证。

备注

上表中的索引号是什么?索引号是服务计划的另一个标识符。根据理想的旧式计算机编程,此类集合中的第一个项目分配的索引号是 0。因此,YAMMER_ENTERPRISE 的索引号是 0。集合中的第二个项目分配的索引号是 1,第三个项目分配的索引号是 2,以此类推。正如我们将要看到的,这些索引号可用于向您显示拥有 Yammer 许可证的所有用户或没有 Yammer 许可证的所有用户。

那么,我们能否更改这些许可分配;例如,我们能否禁止 Ken 使用 Exchange 和 Lync Online?当然可以。同样地,我们不会解释具体的工作原理;那是以后要讨论的主题。不过,在 Office 365 中,您可以通过指示应该禁用哪些许可证来管理(部分)许可证。为此,您需要创建新的许可选项对象,如下所示:

$disabledLicenses = New-MsolLicenseOptions -AccountSkuId "litwareinc:ENTERPRISEPACK" -DisabledPlans "MCOSTANDARD","EXCHANGE_S_ENTERPRISE"

简而言之,我们此时要执行的操作就是要禁用 litwareinc 域(其购买了 Enterprise 许可包)的两个计划:Lync (MCOSTANDARD) 和 Exchange (EXCHANGE_S_ENTERPRISE)。请注意,此命令本身并不禁用任何用户的这些许可证。相反,它会创建一个已禁用 Lync 和 Exchange 的一般用户许可证。然后,我们可以提取这个一般用户许可证,然后将其分配给实际人员:

Set-MsolUserLicense -UserPrincipalName "kenmyer@litwareinc.onmicrosoft.com" -LicenseOptions $disabledLicenses

如果我们运行该命令,然后再次查看 Ken 的用户许可证,则应该会看到以下内容:

ServicePlan                      ProvisioningStatus
-----------                      ------------------
YAMMER_ENTERPRISE                None
RMS_S_ENTERPRISE                 Success
OFFICESUBSCRIPTION               Success
MCOSTANDARD                      Disabled
SHAREPOINTWAC                    Success
SHAREPOINTENTERPRISE             Success
EXCHANGE_S_ENTERPRISE            Disabled

这不就是!Exchange 和 Lync Online 均已禁用。

查看多个用户的 Office 365 许可信息

不可否认,Office 365 用户许可可能有点复杂。但是,这和 Office 365 无关;相反地,这是因为,Office 365 用户许可可能有点复杂。毕竟,可以通过 Office 365 获取的不同许可证包有许多,并且可以为用户分配适合数量的单个产品许可证。跟踪所有这一切不是那么容易,尤其是考虑到 Office 365 管理中心只允许您一次查看一位用户的许可证详细信息的事实情况。您是否需要一个列出已分配 Lync Online 许可证的所有用户的列表?您当然会需要。但管理中心无法轻易提供该列表。

但是 Windows PowerShell 却可以。还记得我们在使用 Office 365 用户许可证一节中谈到的索引号吗?如果您想起来了,那么您可能还记得,在我们的许可证包里,Lync Online 的索引号是 3。这意味着我们可以使用这个看上去很神秘的代码行返回一个列出已颁发 Lync Online 许可证的所有用户的列表:

Get-MsolUser | Where-Object {$_.isLicensed -eq $true -and $_.Licenses[0].ServiceStatus[3].ProvisioningStatus -ne "Disabled"}

是的,它的确有些复杂。但它会返回您要求它返回的信息:

UserPrincipalName                     DisplayName           isLicensed
-----------------                     -----------           ----------
ZrinkaM@litwareinc.onmicrosoft.com    Zrinka Makovac        True
FabriceC@litwareinc.onmicrosoft.com   Fabrice Canel         True
AnneW@litwareinc.onmicrosoft.com      Anne Wallace          True
AlexD@litwareinc.onmicrosoft.com      Alex Darrow           True

如果您愿意,您还可以返回一个列出尚未颁发 Lync Online 许可证的所有用户的列表:

Get-MsolUser | Where-Object {$_.isLicensed -eq $true -and $_.Licenses[0].ServiceStatus[3].ProvisioningStatus -ne "Enabled"}

它将返回一个完全不同的用户列表:

UserPrincipalName                     DisplayName           isLicensed
-----------------                     -----------           ----------
BonnieK@litwareinc.onmicrosoft.com    Bonnie Kearney        True
BrianJ@litwareinc.onmicrosoft.com     Brian Johnson         False

但是,如果我们不想了解有关 Lync Online 许可证的情况;如果您想要了解有关 SharePoint Online 许可证的情况,该怎么办呢?如果您回头看看许可表,您会看到 SharePoint Online 许可证的索引号是 5。当我们指定 ServiceStatus 属性时,我们前面的代码示例使用的索引号是 3(Lync Online 的索引号):

Get-MsolUser | Where-Object {$_.isLicensed -eq $true -and $_.Licenses[0].ServiceStatus[3].ProvisioningStatus -ne "Disabled"}

若要返回 SharePoint Online 许可证,只需将 3 替换为 5:

Get-MsolUser | Where-Object {$_.isLicensed -eq $true -and $_.Licenses[0].ServiceStatus[5].ProvisioningStatus -ne "Disabled"}

它真的是这么简单。

有关详细信息,请参阅文章针对 Office 365 工作负载向用户授予许可。使用 Windows PowerShell 管理可供您使用的许可选项是否需要一点努力?是的,需要。为了能够使用 Windows PowerShell 来利用可供您使用的许可选项,这样的努力是否值得?实际上这是由您来决定的。

但是:答案是肯定的。

关于位置参数和 Office 365 的快速说明

Azure Active Directory cmdlet 与 Exchange 和 Lync Online cmdlet 不同,至少从使用单个用户帐户的角度来说是不同的。例如,使用 Lync Online 和 Get-CsOnlineUser cmdlet,您可以将 Identity 参数包括在您的命令中,也可以忽略 Identity 参数。换句话说,这两个命令都起作用,并且它们会返回完全相同的信息:

Get-CsOnlineUser -Identity "kenmyer@litwareinc.onmicrosoft.com"
Get-CsOnlineUser "kenmyer@litwareinc.onmicrosoft.com"

但是,Azure Active Directory cmdlet 却不是这样。此命令这样起作用:

Get-MsolUser -UserPrincipalName "kenmyer@litwareinc.onmicrosoft.com"

备注

我们在此使用 UserPrincipalName 参数,因为 Get-MsolUser 没有 Identity 参数。

但是,此命令会这样起作用:

Get-MsolUser "kenmyer@litwareinc.onmicrosoft.com"

为什么没有返回?在不去探讨很多技术细节的情况下,许多 Lync Online 和 Exchange cmdlet 都将 Identity 参数配置为“位置参数”。这意味着(在这种情况下)如果不指定参数名称(如 –Identity),cmdlet 就会将命令中的第一个参数视为 Identity 参数。只要您通过指定用户标识开始,您就可以使用 –Identity 参数或不使用它。每一种方式都有效:

Get-CsOnlineUser -Identity "kenmyer@litwareinc.onmicrosoft.com"
Get-CsOnlineUser "kenmyer@litwareinc.onmicrosoft.com"

但是,Azure Active Directory cmdlet 不支持位置参数。假设您包括一个没有附带参数的值:

Get-MsolUser "kenmyer@litwareinc.onmicrosoft.com"

在这种情况下,您将得到类似下面的错误信息:

Get-MsolUser : A positional parameter cannot be found that accepts argument 'kenmyer@litwareinc.onmicrosoft.com'.

还应注意,Exchange 和 Lync Online 能让您以多种不同方式引用用户。例如,所有这些 Exchange 命令将返回相同的邮箱信息:

Get-Mailbox -Identity "Ken Myer"
Get-Mailbox -Identity "kenmyer@litwareinc.onmicrosoft.com"
Get-Mailbox -Identity "kenmyer"

这些命令分别使用用户的 Active Directory 显示名称、他或她的用户主体名称,以及他或她的电子邮件别名。这些标识中的任何一个都会起作用。但是,这是针对 Exchange 和 Lync Online 的情况。大多数情况下,Azure Active Directory 要求您仅使用用户主体名称:

Get-MsolUser -UserPrincipalName "kenmyer@litwareinc.onmicrosoft.com"

备注

那么,在技术上,您可以使用 ObjectId 参数。但是,这需要您输入分配给用户帐户的 GUID(全局唯一标识符)。例如:
Get-MsolUser –ObjectId "62e90394-69f5-4237-9190-012177145e10"
我们会让您自己决定是否使用 UserPrincipalName 或 ObjectId。

不可否认,上述内容需要好好消化一番,至少对 Windows PowerShell 新手来说是这样。如果您 一个 Windows PowerShell 新手,您可能想看看我们关于使用参数的介绍性文章。

另请参阅

使用 Windows PowerShell 管理 Office 365 的最佳方式