Exchange Online PowerShell 中无人参与的脚本的仅限应用身份验证,安全 & 合规性 PowerShell
Microsoft 365 中的审核和报告方案通常涉及 Exchange Online PowerShell 和安全与合规 PowerShell 中的无人参与脚本。 过去,无人参与登录需要将用户名和密码存储在本地文件或在运行时访问的机密保管库中。 但是,众所周知,在本地存储用户凭据不是一个很好的安全做法。
本文中所述,基于证书的身份验证 (CBA) 或仅限应用的身份验证支持无人参与的脚本和自动化方案,方法是使用 Microsoft Entra 应用和自签名证书。
注意
你是否知道可以使用 Azure 中的托管标识连接到 Exchange Online PowerShell? 请参阅 使用 Azure 托管标识连接到 Exchange Online PowerShell。
本文中所述的功能和过程需要以下版本的 Exchange Online PowerShell 模块:
- Exchange Online PowerShell (Connect-ExchangeOnline):版本 2.0.3 或更高版本。
- 安全性 & 合规性 PowerShell (Connect-IPPSSession) :版本 3.0.0 或更高版本。
有关如何安装或更新模块的说明,请参阅 安装和维护 Exchange Online PowerShell 模块。 有关如何在 Azure 自动化中使用模块的说明,请参阅 在 Azure 自动化中管理模块。
Exchange Online PowerShell V3 模块中的 REST API 连接需要 PowerShellGet 和 PackageManagement 模块。 有关详细信息,请参阅 PowerShellGet for 基于 REST 的连接在 Windows 中。
如果本文中的过程不起作用,请通过运行以下命令验证你没有安装 Beta 版本的 PackageManagement 或 PowerShellGet 模块:
Get-InstalledModule PackageManagement -AllVersions; Get-InstalledModule PowerShellGet -AllVersions
。在 Exchange Online PowerShell 中,无法将本文中的过程与以下 Microsoft 365 组 cmdlet 配合使用:
可以使用 Microsoft Graph 替换这些 cmdlet 中的大多数功能。 有关详细信息,请参阅 在 Microsoft Graph 中使用组。
在安全性 & 合规性 PowerShell 中,不能将本文中的过程用于以下 Microsoft 365 组 cmdlet:
Exchange Online 支持委托方案。 使用委派进行连接的建议方法是使用 GDAP 和应用许可。 有关详细信息,请参阅 将 Exchange Online PowerShell v3 模块与 GDAP 配合使用和应用许可。 如果未与客户创建 CSP 关系,还可以使用多租户应用程序。 本文的常规说明中列出了使用多租户应用程序所需的步骤。
如果使用 Windows PowerShell SDK 进行连接,请使用 Connect-ExchangeOnline cmdlet 上的 SkipLoadingFormatData 开关:
The term 'Update-ModuleManifest' is not recognized as a name of a cmdlet, function, script file, or executable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
它的工作原理是什么?
Exchange Online PowerShell 模块使用 Active Directory 身份验证库,使用应用程序 ID、租户 ID (组织) 和证书指纹提取仅限应用的令牌。 在 Microsoft Entra ID 中预配的应用程序对象具有分配给它的目录角色,该角色在访问令牌中返回。 会话的基于角色的访问控制 (RBAC) 是使用令牌中提供的目录角色信息配置的。
连接示例
以下示例演示如何将 Exchange Online PowerShell 模块与仅应用身份验证配合使用:
重要
在以下连接命令中,使用组织的主 .onmicrosoft.com
域作为 Organization 参数的值。
以下连接命令具有许多可用的选项,如 连接到 Exchange Online PowerShell 和 连接到安全 & 符合性 PowerShell 中所述。 例如:
Microsoft 365 GCC High 或 Microsoft 365 DoD 环境需要以下附加参数和值:
-
GCC High 中的 Connect-ExchangeOnline:
-ExchangeEnvironmentName O365USGovGCCHigh
。 -
GCC High 中的 Connect-IPPSSession:
-ConnectionUri https://ps.compliance.protection.office365.us/powershell-liveid/ -AzureADAuthorizationEndpointUri https://login.microsoftonline.us/common
。 -
DoD 中的 Connect-ExchangeOnline:
-ExchangeEnvironmentName O365USGovDoD
。 -
DoD 中的 Connect-IPPSSession:
-ConnectionUri https://l5.ps.compliance.protection.office365.us/powershell-liveid/ -AzureADAuthorizationEndpointUri https://login.microsoftonline.us/common
。
-
GCC High 中的 Connect-ExchangeOnline:
如果 Connect-IPPSSession 命令显示登录提示,请在 Connect-IPPSSession 命令之前运行命令
$Global:IsWindows = $true
。
使用证书指纹进行连接:
注意
CertificateThumbprint 参数仅在 Microsoft Windows 中受支持。
需要在运行命令的计算机上安装证书。 证书应该安装在用户证书存储区中。
Exchange Online PowerShell:
Connect-ExchangeOnline -CertificateThumbPrint "012THISISADEMOTHUMBPRINT" -AppID "36ee4c6c-0812-40a2-b820-b22ebd02bce3" -Organization "contosoelectronics.onmicrosoft.com"
安全与合规 PowerShell:
Connect-IPPSSession -CertificateThumbPrint "012THISISADEMOTHUMBPRINT" -AppID "36ee4c6c-0812-40a2-b820-b22ebd02bce3" -Organization "contosoelectronics.onmicrosoft.com"
使用证书对象进行连接:
不需要在运行命令的计算机上安装证书。 可以远程存储证书对象。 运行脚本时会提取证书。
Exchange Online PowerShell:
Connect-ExchangeOnline -Certificate <%X509Certificate2 Object%> -AppID "36ee4c6c-0812-40a2-b820-b22ebd02bce3" -Organization "contosoelectronics.onmicrosoft.com"
安全与合规 PowerShell:
Connect-IPPSSession -Certificate <%X509Certificate2 Object%> -AppID "36ee4c6c-0812-40a2-b820-b22ebd02bce3" -Organization "contosoelectronics.onmicrosoft.com"
使用本地证书进行连接:
注意
使用 ConvertTo-SecureString 命令在本地存储证书的密码会破坏自动化方案的安全连接方法的用途。 使用 Get-Credential 命令来提示你安全输入证书的密码并不是自动化方案的理想选择。 换句话说,实际上没有使用本地证书进行连接的自动化 和安全 方法。
Exchange Online PowerShell:
Connect-ExchangeOnline -CertificateFilePath "C:\Users\navin\Desktop\automation-cert.pfx" -CertificatePassword (Get-Credential).password -AppID "36ee4c6c-0812-40a2-b820-b22ebd02bce3" -Organization "contosoelectronics.onmicrosoft.com"
安全与合规 PowerShell:
Connect-IPPSSession -CertificateFilePath "C:\Users\navin\Desktop\automation-cert.pfx" -CertificatePassword (Get-Credential).password -AppID "36ee4c6c-0812-40a2-b820-b22ebd02bce3" -Organization "contosoelectronics.onmicrosoft.com"
设置仅适用于应用的身份验证
初始加入需要使用应用程序对象进行身份验证。 应用程序和服务主体可互换使用,但应用程序类似于类对象,而服务主体类似于类的实例。 有关详细信息,请参阅 Entra ID Microsoft 中的应用程序和服务主体对象。
有关在 Entra ID Microsoft中创建应用程序的详细视觉流,请参阅 https://aka.ms/azuread-app。
-
默认情况下 ,应用程序 对象具有 委托 API 权限Microsoft Graph>User.Read 。 若要使应用程序对象访问 Exchange 中的资源,它需要 应用程序 API 权限 Office 365 Exchange Online>Exchange.ManageAsApp。
-
对于 Microsoft Entra ID 中的仅限应用的身份验证,通常使用证书来请求访问权限。 拥有证书及其私钥的任何人都可以使用具有授予应用的权限的应用。
创建并配置自签名 X.509 证书,该证书用于在请求仅限应用的访问令牌时根据Microsoft Entra ID 对应用程序进行身份验证。
此过程类似于为用户帐户生成密码。 证书也可以自签名。 有关在 PowerShell 中生成证书的说明,请参阅本文后面的 此部分 。
注意
加密:Exchange 的仅应用身份验证不支持下一代 (CNG) 证书。 CNG 证书默认在现代版本的 Windows 中创建。 必须从 CSP 密钥提供商处使用证书。 本部分 介绍创建 CSP 证书的两种受支持的方法。
-
应用程序需要分配适当的 RBAC 角色。 由于应用在 entra ID Microsoft 中预配,因此可以使用任何受支持的内置角色。
步骤 1:在 Microsoft Entra ID 中注册应用程序
注意
如果遇到问题,请检查 所需权限,以验证你的帐户是否可以创建标识。
在 处打开Microsoft Entra 管理中心 https://portal.azure.com/。
在页面顶部的“搜索”框中,开始键入“应用注册”,然后从“服务”部分的结果中选择“应用注册”。
或者,若要直接转到 “应用注册 ”页,请使用 https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade。
在“应用注册”页面,选择“新增注册”。
在打开的 注册应用程序 页面上,配置以下设置:
名称:输入描述性内容。 例如,EXO PowerShell CBA。
支持的帐户类型:验证 此组织目录中的帐户是否仅 (<YourOrganizationName> - 已选择单租户) 。
注意
若要使应用程序成为 Exchange Online 委托方案的多租户,请选择 值“任何组织目录中的帐户” (“任何Microsoft Entra 目录 - 多租户) ”。
重定向 URI (可选) :此设置是可选的。 如果需要使用它,请配置以下设置:
- 平台:选择“ Web”。
- URI:输入发送访问令牌的 URI。
注意
无法为 本机应用程序创建凭据,因为不能将本机应用程序用于自动化应用程序。
完成“ 应用注册 ”页后,选择“ 注册”。
你将被带到刚刚注册的应用的 “概述 ”页。 使此页面保持打开状态。 会在下一步中用到它。
步骤2:向应用程序分配 API 权限
在本部分中,选择以下方法 之一 ,为应用分配 API 权限:
- 从门户选择并分配 API 权限。
- 修改应用清单以分配 API 权限。 (Microsoft 365 GCC High 和 DoD 组织应使用此方法)
从门户选择并分配 API 权限
在“应用概述”页上,从“管理”部分选择“API 权限”。
在“应用 API 权限” 页上,选择“ 添加权限”。
在打开的“请求 API 权限”浮出控件中,选择“我的组织使用的 API”选项卡,开始在“搜索”框中键入 Office 365 Exchange Online,然后从结果中选择它。
在显示的“ 应用程序需要哪些类型的权限?” 浮出控件上,选择“ 应用程序权限”。
在显示的权限列表中,展开 “Exchange”,选择“ Exchange.ManageAsApp”,然后选择“ 添加权限”。
返回应用 API 权限 页,验证 Office 365 Exchange Online>Exchange.ManageAsApp 是否已列出并包含以下值:
类型: 应用程序。
需要管理员同意: 是。
状态:未为<组织>授予当前不正确的值。
通过选择“授予<组织的>管理员同意”,阅读打开的确认对话框,然后选择“是”来更改此值。
“状态”值现在已为<“组织>授予”。
对于默认 Microsoft Graph>User.Read 条目,请选择... 。>撤销管理员同意,然后在打开的确认对话框中选择“ 是 ”,将 “状态” 返回到默认空白值。
关闭当前 API 权限 页面(不是浏览器选项卡),以返回 应用注册 页面。 你将在后续步骤中使用 “应用注册 ”页。
修改应用清单以分配 API 权限
注意
本部分中的过程追加对应用的现有默认权限, (委托的 User.Read 权限在 Microsoft Graph) 与 Office 365 Exchange Online 中所需的应用程序 Exchange.ManageAsApp 权限。
在“应用概述”页上,从“管理”部分选择“清单”。
在“应用 清单” 页上,找到
requiredResourceAccess
第 42 行 () 的条目,并使条目类似于以下代码片段:"requiredResourceAccess": [ { "resourceAppId": "00000002-0000-0ff1-ce00-000000000000", "resourceAccess": [ { "id": "dc50a0fb-09a3-484d-be87-e023b12c6440", "type": "Role" } ] }, { "resourceAppId": "00000003-0000-0000-c000-000000000000", "resourceAccess": [ { "id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d", "type": "Scope" } ] } ],
注意
Microsoft 365 GCC High 或 DoD 环境只能访问安全性 & 符合性 PowerShell。 对
requiredResourceAccess
条目使用以下值:"requiredResourceAccess": [ { "resourceAppId": "00000007-0000-0ff1-ce00-000000000000", "resourceAccess": [ { "id": "455e5cd2-84e8-4751-8344-5672145dfa17", "type": "Role" } ] }, { "resourceAppId": "00000003-0000-0000-c000-000000000000", "resourceAccess": [ { "id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d", "type": "Scope" } ] } ],
完成 “清单 ”页后,选择“ 保存”。
仍在“清单”页上,从“管理”部分选择“API 权限”。
在 “API 权限 ”页上,验证 是否列出了 Office 365 Exchange Online>Exchange.ManageAsApp 并包含以下值:
类型: 应用程序。
需要管理员同意: 是。
状态:当前不正确的值未为<组织>授予Office 365 Exchange Online>Exchange.ManageAsApp 条目。
通过选择“授予组织的>管理员同意<”,阅读打开的确认对话框,然后选择“是”来更改“状态”值。
“状态”值现在已为<“组织>授予”。
对于默认 Microsoft Graph>User.Read 条目,请选择... 。>撤销管理员同意,然后在打开的确认对话框中选择“ 是 ”,将 “状态” 返回到默认空白值。
关闭当前 API 权限 页面(不是浏览器选项卡),以返回 应用注册 页面。 你将在后续步骤中使用 “应用注册 ”页。
步骤 3:创建自签名证书
使用下列方法之一创建一个自签名 x.509 证书:
(推荐)使用升级(以管理员运行)的 Windows PowerShell 会话中 New-SelfSignedCertificate、Export-Certificate 和 Export-PfxCertificate cmdlet 来请求自签名证书,并将其导出为
.cer
和.pfx
(默认为 SHA1)。 例如:# Create certificate $mycert = New-SelfSignedCertificate -DnsName "contoso.org" -CertStoreLocation "cert:\CurrentUser\My" -NotAfter (Get-Date).AddYears(1) -KeySpec KeyExchange # Export certificate to .pfx file $mycert | Export-PfxCertificate -FilePath mycert.pfx -Password (Get-Credential).password # Export certificate to .cer file $mycert | Export-Certificate -FilePath mycert.cer
使用 Create-SelfSignedCertificate script 脚本生成 SHA1 证书。
.\Create-SelfSignedCertificate.ps1 -CommonName "MyCompanyName" -StartDate 2021-01-06 -EndDate 2022-01-06
步骤 4:将证书附加到 Microsoft Entra 应用程序
在应用程序中注册证书后,可以使用私钥(.pfx
)或缩略图进行身份验证。
在步骤 2 末尾的“应用注册”页上的“拥有的应用程序”选项卡上,选择应用程序。
如果需要返回到 “应用注册 ”页,请使用 https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/RegisteredApps,验证是否已选中“ 拥有的应用程序 ”选项卡,然后选择应用程序。
在打开的应用程序页上,从“管理”部分选择“证书 & 机密”。
在 “证书 & 机密 ”页上,选择“ 上传证书”。
在打开的对话框中,浏览到在 步骤 3 中创建的自签名证书(
.cer
文件)。完成后,选择“添加”。
现在,证书显示在 证书 部分中。
关闭当前 证书和机密 页面,然后关闭 应用注册 页面,已返回到主 https://portal.azure.com/ 页。 你会在下一步中用到它。
步骤 4b:仅 Exchange Online 委托方案:授予多租户应用的管理员同意
如果在步骤 1 中为 Exchange Online 委托方案创建应用程序多租户,则需要向管理员授予 Exchange.ManageAsApp 权限,以便应用程序可以在每个租户组织中的 Exchange Online 中运行 cmdlet。 为此,请为每个客户租户生成管理员同意 URL。 在任何人使用多租户应用程序连接到租户组织中的 Exchange Online 之前,客户租户中的管理员应打开以下 URL:
https://login.microsoftonline.com/<tenant-id>/adminconsent?client_id=<client-id>&scope=https://outlook.office365.com/.default
-
<tenant-id>
是客户的租户 ID。 -
<client-id>
是多租户应用程序的 ID。 - 默认范围用于授予应用程序权限。
有关 URL 语法的详细信息,请参阅 向目录管理员请求权限。
步骤 5:将Microsoft Entra 角色分配给应用程序
方法有以下两种:
- 将Microsoft Entra 角色分配给应用程序
- 使用服务主体将自定义角色组分配给应用程序:仅当在 REST API 模式下连接到 Exchange Online PowerShell 或 Security & Compliance PowerShell 时,才支持此方法。 安全性 & 合规性 PowerShell 支持 v3.2.0 或更高版本中的 REST API 模式。
注意
还可以结合使用这两种方法来分配权限。 例如,可以将 Microsoft Entra 角色用于“Exchange 收件人管理员”角色,还可以分配自定义 RBAC 角色来扩展权限。
对于 Exchange Online 委托方案中的多租户应用程序,需要在每个客户租户中分配权限。
将Microsoft Entra 角色分配给应用程序
下表介绍了支持的 Microsoft Entra 角色:
Role | Exchange Online PowerShell |
安全与合规 PowerShell |
---|---|---|
合规性管理员 | ✔ | ✔ |
Exchange 管理员¹ | ✔ | |
Exchange 收件人管理员 | ✔ | |
全局管理员¹ ² | ✔ | ✔ |
全局读取器 | ✔ | ✔ |
支持管理员 | ✔ | |
安全管理员¹ | ✔ | ✔ |
安全信息读取者 | ✔ | ✔ |
¹ 全局管理员和 Exchange 管理员角色为 Exchange Online PowerShell 中的任何任务提供所需的权限。 例如:
- 收件人管理。
- 安全和保护功能。 例如,反垃圾邮件、反恶意软件、反钓鱼和关联的报表。
安全管理员角色没有适用于这些相同任务的所需权限。
² Microsoft建议使用权限最少的角色。 使用权限较低的帐户有助于提高组织的安全性。 全局管理员是一种高特权角色,在无法使用现有角色时,应仅限于紧急情况。
有关在 Microsoft Entra ID 中分配角色的一般说明,请参阅 向用户分配 Microsoft Entra 角色。
注意
以下步骤对于 Exchange Online PowerShell 与安全与合规 PowerShell 来说略有不同。 将显示适用于这两个环境的步骤。 要为这两个环境配置角色,请重复本部分中的步骤。
在 Microsoft Entra 管理中心https://portal.azure.com/的 中,开始在页面顶部的“搜索”框中键入角色和管理员,然后从“服务”部分的结果中选择“Microsoft Entra 角色和管理员”。
或者,若要直接转到 “Microsoft Entra 角色和管理员 ”页,请使用 https://portal.azure.com/#view/Microsoft_AAD_IAM/AllRolesBlade。
在打开的 角色和管理员 页面上,通过在结果中 单击角色名称 查找并选择受支持角色之一。
Exchange Online PowerShell:例如,查找并选择 Exchange 管理员 角色。
安全性 & 合规性 PowerShell:例如,查找并选择 合规性管理员 角色。
在打开 的“作业 ”页上,选择“ 添加作业”。
Exchange Online PowerShell:
安全与合规 PowerShell:
在打开的“添加分配”浮出控件中,查找并选择在 步骤 1 中创建的应用。
完成“ 添加分配 ”浮出控件后,选择“ 添加”。
返回“ 分配” 页,验证角色是否已分配给应用。
Exchange Online PowerShell:
安全与合规 PowerShell:
使用服务主体将自定义角色组分配给应用程序
注意
在完成创建新服务主体的步骤 之前 ,需要连接到 Exchange Online PowerShell 或 Security & Compliance PowerShell。 在不连接到 PowerShell 的情况下创建新的服务主体, (需要 Azure 应用 ID 和对象 ID 才能) 创建新的服务主体。
仅当在 REST API 模式下连接到 Exchange Online PowerShell 或 Security & Compliance PowerShell 时,才支持此方法。 安全性 & 合规性 PowerShell 支持 v3.2.0 或更高版本中的 REST API 模式。
有关创建自定义角色组的信息,请参阅 在 Exchange Online 中创建角色组 和 在 Microsoft Defender 门户中创建电子邮件 & 协作角色组。 分配给应用程序的自定义角色组可以包含内置角色和自定义角色的任意组合。
若要使用服务主体将自定义角色组分配给应用程序,请执行以下步骤:
在 Microsoft Graph PowerShell 中运行以下命令,将步骤 1 中注册的 Microsoft Entra 应用程序的详细信息存储在变量中:
Connect-MgGraph -Scopes AppRoleAssignment.ReadWrite.All,Application.Read.All $<VariableName1> = Get-MgServicePrincipal -Filter "DisplayName eq '<AppName>'"
例如:
Connect-MgGraph -Scopes AppRoleAssignment.ReadWrite.All,Application.Read.All $AzureADApp = Get-MgServicePrincipal -Filter "DisplayName eq 'ExO PowerShell CBA'"
有关详细语法和参数信息,请参阅 Get-MgServicePrincipal。
在同一 PowerShell 窗口中,连接到 Exchange Online PowerShell 或 Security & Compliance PowerShell ,并运行以下命令:
- 为 Microsoft Entra 应用程序创建服务主体对象。
- 将服务主体的详细信息存储在变量中,以用于下一步。
New-ServicePrincipal -AppId $<VariableName1>.AppId -ObjectId $<VariableName1>.Id -DisplayName "<Descriptive Name>" $<VariableName2> = Get-ServicePrincipal -Identity "<Descriptive Name>"
例如:
New-ServicePrincipal -AppId $AzureADApp.AppId -ObjectId $AzureADApp.Id -DisplayName "SP for Azure AD App ExO PowerShell CBA" $SP = Get-ServicePrincipal -Identity "SP for Azure AD App ExO PowerShell CBA"
有关详细语法和参数信息,请参阅 New-ServicePrincipal。
在 Exchange Online PowerShell 或 Security & Compliance PowerShell 中,运行以下命令,将服务主体添加为自定义角色组的成员:
Add-RoleGroupMember -Identity "<CustomRoleGroupName>" -Member <$<VariableName2>.Identity | $<VariableName2>.ObjectId | $<VariableName2>.Id>
例如:
Add-RoleGroupMember -Identity "Contoso View-Only Recipients" -Member $SP.Identity
有关语法和参数的详细信息,请参阅 Add-RoleGroupMember。