为什么需要使用 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 管理中心。 管理员需要能够将 PowerShell 用于 Microsoft 365,因为某些配置过程只能通过 PowerShell Microsoft 365 命令完成。 对于这些情况,你需要知道如何:
安装适用于 Microsoft 365 模块的 PowerShell (为每台管理员计算机) 只完成一次。
为每个 PowerShell 会话) (一次连接到 Microsoft 365 订阅。
收集运行所需 PowerShell Microsoft 365 命令所需的信息。
针对 Microsoft 365 命令运行 PowerShell。
学习这些基本技能后,无需使用 Get-Mailbox 命令列出邮箱用户。 你也不必了解如何创建一个新命令(如前面引用的 命令)来计算所有 Web 应用的所有网站的所有列表中的所有项。 Microsoft和管理员社区可根据需要帮助你完成此类任务。
适用于 Microsoft 365 的 PowerShell 可以显示Microsoft 365 管理中心看不到的信息
Microsoft 365 管理中心显示许多有用的信息,但它不会显示Microsoft 365 存储的有关用户、许可证、邮箱和站点的所有可能的信息。 下面是 Microsoft 365 管理中心中的 用户和组 的示例:
在许多情况下,此视图提供所需的信息。 但是,有时你需要了解更多。 例如,Microsoft 365 许可 (和用户可用的Microsoft 365 功能) 部分取决于用户的地理位置。 可以扩展到居住在美国的用户的策略和功能可能与可以扩展到印度或比利时用户的策略和功能不同。 在 Microsoft 365 管理中心中按照以下步骤确定用户的地理位置:
双击用户的"显示名称"。
在用户属性显示窗格中,选择 详细信息。
在详细信息显示中,选择 “其他详细信息”。
滚动,直到找到标题 “国家或地区”:
在一张纸上记下用户的显示名称和位置,或将其复制并粘贴至记事本中。
您必须为每个用户重复此过程。 如果有很多用户,此过程可能会很繁琐。 使用 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 ,以Microsoft Entra ID (以前的 Azure AD) 进行交互。 有关常见的迁移问题,请参阅 迁移常见问题解答。 注意: 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 支持命令 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 订阅中其位置为巴西的所有用户 (其中 {$_。UsageLocation -eq “BR”}) 然后显示每个用户的名称和位置。
有关大型域的说明
如果你有一个拥有数万个用户的大型域,则尝试本文中介绍的一些示例可能会导致限制。 根据计算能力和可用网络带宽等因素,你可能一次尝试执行过多操作。 大型组织可能希望将其中一些 PowerShell 操作拆分为两个命令。
例如,以下命令返回所有用户帐户,并显示每个用户帐户的名称和位置:
Get-MgUser -All | Select DisplayName, UsageLocation
这对于较小的域非常有用。 但在大型组织中,你可能希望将该操作拆分为两个命令:一个命令用于将用户帐户信息存储在变量中,另一个命令用于显示所需信息。 下面是一个示例:
$x = Get-MgUser -All -Property DisplayName, UsageLocation
$x | Select DisplayName, UsageLocation
这组 PowerShell 命令的解释是:
- 获取当前 Microsoft 365 订阅中的所有用户,并将信息存储在名为 $x ($x = Get-MgUser) 的变量中。
- 显示变量 $x的内容,但仅包括每个用户的名称和位置 ($x |选择“DisplayName”、“UsageLocation) ”。
Microsoft 365 具有只能通过 PowerShell 为 Microsoft 365 配置的功能
Microsoft 365 管理中心旨在提供对适用于大多数环境的常见有用管理任务的访问权限。 换句话说,Microsoft 365 管理中心的设计使典型的管理员可以执行最常见的管理任务。 但有些任务无法在管理中心内完成。
例如,Skype for Business Online 管理中心提供了几个用于创建自定义会议邀请的选项:
借助这些设置,您可以为会议邀请添加少许个性化和专业化。 但是,会议配置设置不仅仅是创建自定义会议邀请。 例如,默认情况下,会议允许:
匿名用户获取自动参与每个会议的权限。
与会者记录会议。
您组织中的所有用户在加入会议时被指定为演示者。
Skype for Business Online 管理中心不提供这些设置。 可以从 PowerShell 控制 Microsoft 365。 下面是禁用这三个设置的命令:
Set-CsMeetingConfiguration -AdmitAnonymousUsersByDefault $False -AllowConferenceRecording $False -DesignateAsPresenter "None"
注意
若要运行此命令,必须安装 Skype for Business Online PowerShell 模块。
此 PowerShell 命令的解释是:
- 在新的 Skype for Business Online 会议的设置 (Set-CsMeetingConfiguration) ,禁用允许匿名用户自动进入会议 (-AdmitAnonymousUsersByDefault $False) 。
- 禁用与会者 (-AllowConferenceRecording $False) 录制会议的功能。
- 不要将组织中的所有用户指定为演示者 (-DesignateAsPresenter“None”) 。
若要还原这些默认设置 (启用选项) ,请运行以下命令:
Set-CsMeetingConfiguration -AdmitAnonymousUsersByDefault $True -AllowConferenceRecording $True -DesignateAsPresenter "Company"
还有其他类似的方案,这就是为什么管理员应该知道如何为 Microsoft 365 命令运行 PowerShell。
适用于 Microsoft 365 的 PowerShell 非常适合批量操作
当需要执行单个操作时,可视化界面(如 Microsoft 365 管理中心)最有价值。 例如,如果需要禁用一个用户帐户,可以使用管理中心快速查找并清除复选框。 这可能比在 PowerShell 中执行类似的操作要容易。
但是,如果必须更改许多内容或大量其他内容中的某些选定内容,Microsoft 365 管理中心可能不是最佳工具。 例如,假设必须更改数千个电话号码上的前缀,或者从所有 SharePoint 网站中删除特定用户 Ken Myer 。 如何在 Microsoft 365 管理中心执行此操作?
对于最后一个示例,假设你有数百个 SharePoint 网站,并且你不知道哪些 Ken Meyer 是其成员。 必须从 Microsoft 365 管理中心开始,然后为每个站点执行此过程:
选择站点的 URL 。
在 “网站集属性 ”框中,选择“ 网站地址” 链接以打开网站。
在网站上,选择“ 共享”。
在“ 共享 ”对话框中,选择显示有权访问该网站的所有用户的链接:
在“ 共享者 ”对话框中,选择“ 高级”。
向下滚动用户列表,找到并选择“Ken Myer (假设他有权访问网站) ,然后选择” 删除用户权限”。
对于数百个站点来说,这需要 很长时间 。
替代方法是在 PowerShell for Microsoft 365 中运行以下命令,从所有网站中删除 Ken Myer:
Get-SPOSite | ForEach {Remove-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com"}
注意
此命令要求安装 SharePoint PowerShell 模块。
此 PowerShell 命令的解释是:获取当前 Microsoft 365 订阅中的所有 SharePoint 网站 (Get-SPOSite) ,对于每个网站,请从可 (ForEach {Remove-SPOUser -Site $_访问它的用户列表中删除 Ken Meyer。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 轻松筛选用户邮箱的几乎所有属性。 例如,下面是居住在布卢明顿市的所有用户的邮箱列表:
Exchange 管理中心还允许合并筛选条件。 例如,可以找到居住在布卢明顿并在财务部门工作的所有人员的邮箱。
但是,在 Exchange 管理中心中可以执行的操作存在一些限制。 例如,你无法轻松找到居住在布卢明顿 或 圣地亚哥的人员的邮箱,或所有不住在布卢明顿的人员的邮箱。
可以使用以下 PowerShell for Microsoft 365 命令获取居住在布卢明顿或圣地亚哥的所有人员的邮箱列表:
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 的用户列表:
若要将该信息保存到文件,必须将其粘贴到文档或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
下面是结果示例:
此 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
打印的文档如下所示:
此 PowerShell 命令的解释是:获取当前 Microsoft 365 订阅中的所有 Skype for Business Online 用户;仅获取用户名、UPN 和位置;然后将该信息发送到默认的 Windows 打印机 (Out-Printer) 。
打印的文档具有与 PowerShell 命令窗口中的显示相同的简单格式。 若要获取硬拷贝,只需添加 |输出到 命令末尾的打印机。
适用于 Microsoft 365 的 PowerShell 允许跨服务器产品进行管理
构成 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 脚本的解释是:
- 获取当前 Microsoft 365 订阅中的所有用户,并将信息存储在名为 $x ($x = Get-MgUser) 的变量中。
- 启动一个循环,该循环在 $x) ) 中$x (foreach ($i 变量中的所有 用户上运行。
- 定义名为 $y 的变量,并在其中存储用户邮箱信息 ($y = Get-Mailbox -Identity $i.UserPrincipalName) 。
- 向名为 IsMailBoxEnabled 的用户信息添加新属性。 将其设置为用户邮箱的 IsMailBoxEnabled 属性的值, ($i | Add-Member -MemberType NoteProperty -Name IsMailboxEnabled -Value $y.IsMailboxEnabled) 。
- 定义名为 $y 的变量,并在其中存储用户的 Skype for Business Online 信息 ($y = Get-CsOnlineUser -Identity $i.UserPrincipalName) 。
- 向名为 EnabledForSfB 的用户信息添加新属性。 将其设置为用户的 Skype for Business Online 信息的 Enabled 属性的值, ($i | Add-Member -MemberType NoteProperty -Name EnabledForSfB -Value $y.Enabled) 。
- 显示用户列表,但仅包括其名称、他们是否获得许可,以及指示其邮箱是否已启用以及是否为 Skype for Business Online 启用的两个新属性 ($x |依次选择“DisplayName”、“IsLicensed”、“IsMailboxEnabled”、“EnabledforSfB) ”。
另请参阅
PowerShell for Microsoft 365 入门