为什么需要使用 PowerShell for Microsoft 365

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

使用 Microsoft 365 管理中心,可以管理 Microsoft 365 用户帐户和许可证。 还可以管理 Microsoft 365 服务,例如Exchange Online、Teams 和 SharePoint。 如果改用 PowerShell 来管理这些服务,则可以利用命令行和脚本语言环境实现速度、自动化和其他功能。

注意

Azure Active Directory 模块将替换为 Microsoft Graph PowerShell SDK。 可以使用 Microsoft Graph PowerShell SDK 访问所有 Microsoft Graph API。 有关详细信息,请参阅 Microsoft Graph PowerShell SDK 入门。 本文中的一些适用于 Microsoft 365 的 PowerShell 命令已更新为使用 Microsoft Graph PowerShell。

本文介绍如何使用 PowerShell 管理 Microsoft 365 以:

  • 显示你在Microsoft 365 管理中心中看不到的其他信息

  • 配置仅可使用 PowerShell 的功能和设置

  • 执行批量操作

  • 筛选数据

  • 打印或保存数据

  • 跨服务管理

请记住,适用于 Microsoft 365 的 PowerShell 是一组用于Windows PowerShell的模块,它是基于 Windows 的服务和平台的命令行环境。 此环境创建一种命令 shell 语言,该语言可通过其他模块进行扩展。 它提供了一种执行简单或复杂命令或脚本的方法。 例如,安装适用于 Microsoft 365 模块的 PowerShell 并连接到 Microsoft 365 订阅后,可以运行以下命令来列出Microsoft Exchange Online的所有用户邮箱:

Get-Mailbox

还可以使用 Microsoft 365 管理中心获取邮箱列表,但计算所有 Web 应用的所有网站的所有列表中的项目并不容易。

适用于 Microsoft 365 的 PowerShell 旨在帮助你管理 Microsoft 365,而不是取代Microsoft 365 管理中心。 管理员需要能够使用适用于 Microsoft 365 的 PowerShell,因为某些配置过程只能通过 PowerShell for Microsoft 365 命令完成。 对于这些情况,你需要知道如何:

  • 安装适用于 Microsoft 365 的 PowerShell 模块 (仅为每台管理员计算机) 完成一次。

  • 对于每个 PowerShell 会话) , (一次连接到 Microsoft 365 订阅。

  • 收集运行 Microsoft 365 命令所需的 PowerShell 所需的信息。

  • 运行 PowerShell for Microsoft 365 命令。

学习这些基本技能后,无需使用 Get-Mailbox 命令列出邮箱用户。 你也不必了解如何创建一个新命令(如前面引用的 命令)来计算所有 Web 应用的所有网站的所有列表中的所有项。 Microsoft 和管理员社区可根据需要帮助你完成此类任务。

适用于 Microsoft 365 的 PowerShell 可以显示无法使用 Microsoft 365 管理中心

Microsoft 365 管理中心显示许多有用的信息,但它不会显示 Microsoft 365 存储的有关用户、许可证、邮箱和站点的所有可能的信息。 下面是Microsoft 365 管理中心中的用户和组的示例:

Microsoft 365 管理中心中用户和组的显示示例。

在许多情况下,此视图提供所需的信息。 但是,有时你需要了解更多。 例如,Microsoft 365 许可 (用户可用的 Microsoft 365 功能) 部分取决于用户的地理位置。 可以扩展到居住在美国中的用户的策略和功能可能与可以扩展到印度或比利时用户的策略和功能不同。 按照Microsoft 365 管理中心中的以下步骤确定用户的地理位置:

  1. 双击用户的"显示名称"。

  2. 在用户属性显示窗格中,选择 详细信息

  3. 在详细信息显示中,选择 “其他详细信息”。

  4. 滚动,直到找到标题 “国家或地区”:

    Microsoft 365 管理中心中用户的区域信息示例。

  5. 在一张纸上记下用户的显示名称和位置,或将其复制并粘贴至记事本中。

您必须为每个用户重复此过程。 如果有很多用户,此过程可能会很繁琐。 使用 PowerShell,可以使用以下命令为所有用户显示此信息。

注意

Azure Active Directory 模块将替换为 Microsoft Graph PowerShell SDK。 可以使用 Microsoft Graph PowerShell SDK 访问所有 Microsoft Graph API。 有关详细信息,请参阅 Microsoft Graph PowerShell SDK 入门

首先,使用 Microsoft Entra DC 管理员云应用程序管理员全局管理员帐户连接到 Microsoft 365 租户

获取用户的信息需要 User.ReadBasic.All 权限范围或“分配许可证”图形 API参考页中列出的其他权限之一。

读取租户中可用的许可证需要 Organization.Read.All 权限范围。

注意

自 2024 年 3 月 30 日起,Azure AD 和 MSOnline PowerShell 模块已弃用。 若要了解详细信息,请阅读 弃用更新。 在此日期之后,对这些模块的支持仅限于 Microsoft Graph PowerShell SDK 和安全修补程序的迁移帮助。 弃用的模块将继续运行到 2025 年 3 月 30 日。

建议迁移到 Microsoft Graph PowerShell,以便与以前为 Azure AD) Microsoft Entra ID (交互。 有关常见的迁移问题,请参阅 迁移常见问题解答注意: MSOnline 1.0.x 版可能会在 2024 年 6 月 30 日之后遇到中断。

Connect-MgGraph -Scopes "User.ReadBasic.All"
Get-MgUser -All -Property DisplayName, UsageLocation | Select DisplayName, UsageLocation

下面是结果示例:

DisplayName                               UsageLocation
-----------                               -------------
Bonnie Kearney                            GB
Fabrice Canel                             BR
Brian Johnson (TAILSPIN)                  US
Anne Wallace                              US
Alex Darrow                               US
David Longmuir                            BR

此 PowerShell 命令的解释是:获取当前 Microsoft 365 订阅中的所有用户 (Get-MgUser) ,但仅显示每个用户的名称和位置 (选择 DisplayName、UsageLocation) 。

由于 Microsoft 365 的 PowerShell 支持 command-shell 语言,因此可以进一步操作 Get-MgUser 命令获取的信息。 例如,你可能希望按位置对这些用户进行排序,将所有巴西用户分组在一起,将所有美国用户分组在一起,依此类说。 下面是 命令:

Get-MgUser -All -Property DisplayName, UsageLocation | Select DisplayName, UsageLocation | Sort UsageLocation, DisplayName

下面是结果示例:

DisplayName                                 UsageLocation
-----------                                 -------------
David Longmuir                              BR
Fabrice Canel                               BR
Bonnie Kearney                              GB
Alex Darrow                                 US
Anne Wallace                                US
Brian Johnson (TAILSPIN)                    US

此 PowerShell 命令的解释是:获取当前 Microsoft 365 订阅中的所有用户,但仅显示每个用户的名称和位置,并首先按其位置对其进行排序,然后将其名称 (Sort UsageLocation、DisplayName) 。

还可以使用其他筛选。 例如,如果您只想查看有关巴西用户的信息,请使用此命令:

Get-MgUser -All -Property DisplayName, Country | Where-Object {$_.Country -eq "BR"} | Select DisplayName, Country 

下面是结果示例:

DisplayName                                           UsageLocation
-----------                                           -------------
David Longmuir                                        BR
Fabrice Canel                                         BR

此 PowerShell 命令的解释是:获取当前 Microsoft 365 订阅中其位置为巴西的所有用户 (Where {$_。UsageLocation -eq “BR”}) 然后显示每个用户的名称和位置。

有关大型域的说明

如果你有一个拥有数万个用户的大型域,则尝试本文中介绍的一些示例可能会导致限制。 根据计算能力和可用网络带宽等因素,你可能一次尝试执行过多操作。 大型组织可能希望将其中一些 PowerShell 操作拆分为两个命令。

例如,以下命令返回所有用户帐户,并显示每个用户帐户的名称和位置:

Get-MgUser -All | Select DisplayName, UsageLocation

这对于较小的域非常有用。 但在大型组织中,你可能希望将该操作拆分为两个命令:一个命令用于将用户帐户信息存储在变量中,另一个命令用于显示所需信息。 下面是一个示例:

$x = Get-MgUser -All -Property DisplayName, UsageLocation
$x | Select DisplayName, UsageLocation

这组 PowerShell 命令的解释是:

  1. 获取当前 Microsoft 365 订阅中的所有用户,并将信息存储在名为 $x ($x = Get-MgUser) 的变量中。
  2. 显示变量 $x的内容,但仅包括每个用户的名称和位置 ($x |选择“DisplayName”、“UsageLocation) ”。

Microsoft 365 具有只能通过 PowerShell 为 Microsoft 365 配置的功能

Microsoft 365 管理中心旨在提供对适用于大多数环境的常见有用管理任务的访问权限。 换句话说,Microsoft 365 管理中心旨在使典型的管理员可以执行最常见的管理任务。 但有些任务无法在管理中心内完成。

例如,Skype for Business Online 管理中心提供了几个用于创建自定义会议邀请的选项:

用于在 Skype for Business Online 管理中心内显示自定义会议邀请的示例。

借助这些设置,您可以为会议邀请添加少许个性化和专业化。 但是,会议配置设置不仅仅是创建自定义会议邀请。 例如,默认情况下,会议允许:

  • 匿名用户获取自动参与每个会议的权限。

  • 与会者记录会议。

  • 您组织中的所有用户在加入会议时被指定为演示者。

Skype for Business Online 管理中心不提供这些设置。 可以从 Microsoft 365 的 PowerShell 控制它们。 下面是禁用这三个设置的命令:

Set-CsMeetingConfiguration -AdmitAnonymousUsersByDefault $False -AllowConferenceRecording $False -DesignateAsPresenter "None"

注意

若要运行此命令,必须安装 Skype for Business Online PowerShell 模块

此 PowerShell 命令的解释是:

  1. Set-CsMeetingConfiguration () 的新 Skype for Business Online 会议的设置中,禁用允许匿名用户自动进入会议 (-AdmitAnonymousUsersByDefault $False) 。
  2. 禁用与会者 (-AllowConferenceRecording $False) 录制会议的功能。
  3. 不要将组织中的所有用户指定为演示者 (-DesignateAsPresenter“None”) 。

若要还原这些默认设置 (启用选项) ,请运行以下命令:

Set-CsMeetingConfiguration -AdmitAnonymousUsersByDefault $True -AllowConferenceRecording $True -DesignateAsPresenter "Company"

还有其他类似的方案,这就是为什么管理员应该知道如何运行 PowerShell for Microsoft 365 命令的原因。

适用于 Microsoft 365 的 PowerShell 非常适合批量操作

当需要执行单个操作时,视觉界面(如Microsoft 365 管理中心)最有价值。 例如,如果需要禁用一个用户帐户,可以使用管理中心快速查找并清除复选框。 这可能比在 PowerShell 中执行类似的操作要容易。

但是,如果必须更改许多内容或大量其他内容中的某些选定内容,Microsoft 365 管理中心可能不是最佳工具。 例如,假设必须更改数千个电话号码上的前缀,或者从所有 SharePoint 网站中删除特定用户 Ken Myer 。 你会如何在Microsoft 365 管理中心中做到这一点?

对于最后一个示例,假设你有数百个 SharePoint 网站,并且你不知道哪些 Ken Meyer 是其成员。 必须从Microsoft 365 管理中心开始,然后为每个站点执行此过程:

  1. 选择站点的 URL

  2. “网站集属性 ”框中,选择“ 网站地址” 链接以打开网站。

  3. 在网站上,选择“ 共享”。

  4. 在“ 共享 ”对话框中,选择显示有权访问该网站的所有用户的链接:

    在 SharePoint 管理员中心查看 SharePoint 网站成员的示例。

  5. 在“ 共享者 ”对话框中,选择“ 高级”。

  6. 向下滚动用户列表,找到并选择“Ken Myer (假设他有权访问网站) ,然后选择” 删除用户权限”。

对于数百个站点来说,这需要 很长时间

替代方法是在 Microsoft 365 的 PowerShell 中运行以下命令,从所有站点中删除 Ken Myer:

Get-SPOSite | ForEach {Remove-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com"}

注意

此命令要求安装 SharePoint PowerShell 模块

此 PowerShell 命令的解释是:获取当前 Microsoft 365 订阅中的所有 SharePoint 网站 (Get-SPOSite) 对于每个网站,请从可以访问它的用户列表中删除 Ken Meyer (ForEach {Remove-SPOUser -Site $_。url -LoginName “kenmyer@litwareinc.com”}) 。

我们告诉 Microsoft 365 从每个网站中删除 Ken Meyer,包括他无权访问的网站。 因此,结果将显示他无权访问的站点的错误。 我们可以对此命令使用附加条件,仅从登录列表中包含他的网站中删除 Ken Meyer。 但是返回的错误不会对网站本身造成伤害。 此命令可能需要几分钟时间才能对数百个站点运行,而不是花费数小时完成Microsoft 365 管理中心。

下面是另一个批量操作示例。 使用此命令将新的 SharePoint 管理员 Bonnie Kearney 添加到组织中的所有网站:

Get-SPOSite | ForEach {Add-SPOUser -Site $_.Url -LoginName "bkearney@litwareinc.com" -Group "Members"}

此 PowerShell 命令的解释是:获取当前 Microsoft 365 订阅中的所有 SharePoint 网站,并为每个网站允许 Bonnie Kearney 访问,方法是将她的登录名添加到网站的“成员”组 (ForEach {Add-SPOUser -Site $_。Url -LoginName “bkearney@litwareinc.com” -Group “Members”}) 。

适用于 Microsoft 365 的 PowerShell 非常适合筛选数据

Microsoft 365 管理中心提供了多种筛选数据的方法,以便轻松找到目标信息子集。 例如,可以通过 Exchange 轻松筛选用户邮箱的几乎所有属性。 例如,下面是居住在布卢明顿市的所有用户的邮箱列表:

在 Microsoft 365 管理中心中执行高级搜索的示例,以获取居住在布卢明顿市的所有用户的邮箱列表。

Exchange 管理中心还允许合并筛选条件。 例如,可以找到居住在布卢明顿并在财务部门工作的所有人员的邮箱。

但是,在 Exchange 管理员 中心可以执行的操作存在限制。 例如,你无法轻松找到居住在布卢明顿 圣地亚哥的人员的邮箱,或所有不住在布卢明顿的人员的邮箱。

可以使用以下适用于 Microsoft 365 的 PowerShell 命令获取居住在布卢明顿或圣地亚哥的所有人员的邮箱列表:

Get-User | Where {$_.RecipientTypeDetails -eq "UserMailbox" -and ($_.City -eq "San Diego" -or $_.City -eq "Bloomington")} | Select DisplayName, City

下面是结果示例:

DisplayName                              City
-----------                              ----
Alex Darrow                              San Diego
Bonnie Kearney                           San Diego
Julian Isla                              Bloomington
Rob Young                                Bloomington

此 PowerShell 命令的解释是:获取当前 Microsoft 365 订阅中在圣地亚哥市或布卢明顿市拥有邮箱的所有用户, (Where {$_。RecipientTypeDetails -eq “UserMailbox” -and ($_。City -eq “San Diego” -or $_.City -eq “Bloomington”) }) ,然后显示每个 (选择 DisplayName、City) 的名称和城市。

下面是用于列出除布卢明顿以外的任何位置的人员的所有邮箱的命令:

Get-User | Where {$_.RecipientTypeDetails -eq "UserMailbox" -and $_.City -ne "Bloomington"} | Select DisplayName, City

下面是结果示例:

DisplayName                               City
-----------                               ----
MOD Administrator                         Redmond
Alex Darrow                               San Diego
Allie Bellew                              Bellevue
Anne Wallace                              Louisville
Aziz Hassouneh                            Cairo
Belinda Newman                            Charlotte
Bonnie Kearney                            San Diego
David Longmuir                            Waukesha
Denis Dehenne                             Birmingham
Garret Vargas                             Seattle
Garth Fort                                Tulsa
Janet Schorr                              Bellevue

此 PowerShell 命令的解释是:获取当前 Microsoft 365 订阅中邮箱不在布卢明顿市的所有用户, (Where {$_。RecipientTypeDetails -eq “UserMailbox” -and $_.City -ne “Bloomington”}) ,然后显示每个的名称和城市。

使用通配符

还可以在 PowerShell 筛选器中使用通配符来匹配部分名称。 例如,假设你要查找用户帐户。 你能记住的是,用户的姓氏是 安德森 ,可能是 亨德森乔根森

可以使用搜索工具并执行三种不同的搜索,在Microsoft 365 管理中心中跟踪该用户:

  • 一次是搜索“Anderson”

  • 一次是搜索“Henderson”

  • 一次是搜索“Jorgenson”

由于这三个名称都以“son”结尾,因此可以告知 PowerShell 显示其名称以“son”结尾的所有用户。 下面是 命令:

Get-User -Filter '{LastName -like "*son"}'

此 PowerShell 命令的解释是:获取当前 Microsoft 365 订阅中的所有用户,但使用筛选器仅列出其姓氏以“son”结尾的用户 (-Filter '{LastName -like “*son”}“) 。 * 代表任意一组字符,这些字符是用户姓氏中的字母。

Microsoft 365 的 PowerShell 可以轻松打印或保存数据

使用Microsoft 365 管理中心可以查看数据列表。 下面是 Skype for Business Online 管理中心的示例,其中显示了已启用 Skype for Business Online 的用户列表:

用于显示已为 Skype for Business Online 启用的用户列表的 Skype for Business Online 管理中心的示例。

若要将该信息保存到文件,必须将其粘贴到文档或 Microsoft Excel 工作表中。 任一情况都可能需要其他格式设置。 此外,Microsoft 365 管理中心不提供直接打印所显示列表的方法。

幸运的是,可以使用 PowerShell 不仅显示列表,还可以将其保存到可轻松导入 Excel 的文件中。 下面是一个示例命令,用于将 Skype for Business Online 用户数据保存到逗号分隔的值 (CSV) 文件,然后可以轻松地将其作为表格导入 Excel 工作表中:

Get-CsOnlineUser | Select DisplayName, UserPrincipalName, UsageLocation | Export-Csv -Path "C:\Logs\SfBUsers.csv" -NoTypeInformation

下面是结果示例:

已保存到逗号分隔值文件的 Excel 工作表Skype for Business Online 用户数据的表示例。

此 PowerShell 命令的解释是:获取当前 Microsoft 365 订阅中的所有Skype for Business Online 用户 (Get-CsOnlineUser) ; 仅获取用户名、UPN 和位置 (选择 DisplayName、UserPrincipalName、UsageLocation) ;然后将该信息保存在名为 C:\Logs\SfBUsers.csv (Export-Csv -Path “C:\Logs\SfBUsers.csv” -NoTypeInformation) 的 CSV 文件中。

还可以使用选项将此列表保存为 XML 文件或 HTML 页。 事实上,使用其他 PowerShell 命令,可以直接将其保存为 Excel 文件,并具有所需的任何自定义格式。

还可以将显示列表的 PowerShell 命令的输出直接发送到 Windows 中的默认打印机。 下面是一个示例命令:

Get-CsOnlineUser | Select DisplayName, UserPrincipalName, UsageLocation | Out-Printer

打印的文档如下所示:

打印文档的示例,该文档是直接发送到 Windows 中默认打印机的 PowerShell 命令的输出。

此 PowerShell 命令的解释是:获取当前 Microsoft 365 订阅中的所有Skype for Business Online 用户;仅获取用户名、UPN 和位置;然后将该信息发送到默认的 Windows 打印机 (Out-Printer) 。

打印的文档具有与 PowerShell 命令窗口中的显示相同的简单格式。 若要获取硬拷贝,只需添加 |输出到 命令末尾的打印机。

PowerShell for Microsoft 365 允许跨服务器产品进行管理

构成 Microsoft 365 的组件旨在协同工作。 例如,假设向 Microsoft 365 添加新用户,并指定用户部门和电话号码等信息。 如果你在任何 Microsoft 365 服务(Skype for Business Online、Exchange 或 SharePoint)中访问用户的信息,则该信息将可用。

不过,此规则适用于跨产品套件的一般信息。 特定于产品的信息(例如有关用户的 Exchange 邮箱的信息)通常在整个套件中不可用。 例如,有关用户邮箱是否已启用的信息仅在 Exchange 管理中心提供。

假设您要为您的所有用户生成显示以下信息的报告:

  • 用户的显示名称

  • 用户是否获得 Microsoft 365 的许可

  • 用户的 Exchange 邮箱是否已启用

  • 用户是否已启用 Skype for Business Online

无法在Microsoft 365 管理中心中轻松生成此类报表。 相反,您必须创建单独的文档来存储信息,例如 Excel 工作表。 然后,从Microsoft 365 管理中心获取所有用户名和许可信息,从 Exchange 管理中心获取邮箱信息,从 Skype for Business Online 管理员 中心获取Skype for Business Online 信息,然后合并该信息。

另一种方法是使用 PowerShell 脚本为你编译报表。

以下示例脚本比本文中到目前为止看到的命令更为复杂。 但是,它显示了使用 PowerShell 创建难以获取的信息视图的潜力。 下面是用于编译和显示所需列表的脚本:

Connect-MgGraph -Scopes "User.ReadBasic.All"
$x = Get-MgUser -All

foreach ($i in $x)
    {
      $y = Get-Mailbox -Identity $i.UserPrincipalName
      $i | Add-Member -MemberType NoteProperty -Name IsMailboxEnabled -Value $y.IsMailboxEnabled

      $y = Get-CsOnlineUser -Identity $i.UserPrincipalName
      $i | Add-Member -MemberType NoteProperty -Name EnabledForSfB -Value $y.Enabled
    }

$x | Select DisplayName, IsLicensed, IsMailboxEnabled, EnabledforSfB

下面是结果示例:

DisplayName             IsLicensed   IsMailboxEnabled   EnabledForSfB
-----------             ----------   ----------------   --------------
Bonnie Kearney          True         True               True
Fabrice Canel           True         True               True
Brian Johnson           False        True               False
Anne Wallace            True         True               True
Alex Darrow             True         True               True
David Longmuir          True         True               True
Katy Jordan             False        True               False
Molly Dempsey           False        True               False

此 PowerShell 脚本的解释是:

  1. 获取当前 Microsoft 365 订阅中的所有用户,并将信息存储在名为 $x ($x = Get-MgUser) 的变量中。
  2. 启动一个循环,该循环在 $x) ) 中$x (foreach ($i 变量中的所有 用户上运行。
  3. 定义名为 $y 的变量,并在其中存储用户邮箱信息 ($y = Get-Mailbox -Identity $i.UserPrincipalName) 。
  4. 向名为 IsMailBoxEnabled 的用户信息添加新属性。 将其设置为用户邮箱的 IsMailBoxEnabled 属性的值, ($i | Add-Member -MemberType NoteProperty -Name IsMailboxEnabled -Value $y.IsMailboxEnabled) 。
  5. 定义名为 $y 的变量,并在其中存储用户的 Skype for Business Online 信息 ($y = Get-CsOnlineUser -Identity $i.UserPrincipalName) 。
  6. 向名为 EnabledForSfB 的用户信息添加新属性。 将其设置为用户的 Skype for Business Online 信息的 Enabled 属性的值, ($i | Add-Member -MemberType NoteProperty -Name EnabledForSfB -Value $y.Enabled) 。
  7. 显示用户列表,但仅包括其名称、是否获得许可,以及指示其邮箱是否已启用以及是否启用Skype for Business Online ($x |依次选择“DisplayName”、“IsLicensed”、“IsMailboxEnabled”、“EnabledforSfB) ”。

另请参阅

PowerShell for Microsoft 365 入门

使用 PowerShell 管理 Microsoft 365 用户帐户、许可证和组

使用 Windows PowerShell 在 Microsoft 365 中创建报告