Exchange Online PowerShell 和 Security & Compliance PowerShell 中无人参与脚本的仅应用身份验证

Microsoft 365 中的审核和报告方案通常涉及 Exchange Online PowerShell 和安全与合规 PowerShell 中的无人参与脚本。 过去,无人参与登录要求将用户名和密码存储在本地文件或运行时访问的机密保管库中。 但是,众所周知,将用户凭据存储在本地并不是一个好的安全做法。

基于证书的身份验证 (本文中所述的 CBA) 身份验证或仅限应用的身份验证支持使用Microsoft Entra应用和证书的无人参与脚本和自动化方案。

注意

它的工作原理是什么?

Exchange Online PowerShell 模块使用 Active Directory 身份验证库,通过应用程序 ID、租户 ID (组织) 和证书指纹提取仅限应用的令牌。 在 Microsoft Entra ID 中预配的应用程序对象分配有目录角色,该角色在访问令牌中返回。 会话的基于角色的访问控制 (RBAC) 是使用令牌中提供的目录角色信息配置的。

连接示例

以下示例演示如何将 Exchange Online PowerShell 模块与仅限应用的身份验证配合使用:

重要

在以下连接命令中,使用组织的主 .onmicrosoft.com 域作为 Organization 参数的值。

以下连接命令具有许多可用选项,如连接到 Exchange Online PowerShell 和连接到 Security & Compliance PowerShell 中所述。 例如:

  • 由世纪互联运营的 Microsoft 365 GCC High、Microsoft 365 DoD 或 Microsoft 365 中国 () 环境需要以下额外参数和值:

  • Microsoft 365 GCC High

    • Connect-ExchangeOnline -ExchangeEnvironmentName O365USGovGCCHigh
    • Connect-IPPSSession -ConnectionUri https://ps.compliance.protection.office365.us/powershell-liveid/ -AzureADAuthorizationEndpointUri https://login.microsoftonline.us/organizations*
  • Microsoft 365 DoD

    • Connect-ExchangeOnline -ExchangeEnvironmentName O365USGovDoD
    • Connect-IPPSSession -ConnectionUri https://compliance.dod.microsoft.com/powershell-liveid -AzureADAuthorizationEndpointUri https://login.microsoftonline.us/organizations*
  • 由世纪互联运营的 Microsoft 365 (中国)

    • Connect-ExchangeOnline -ExchangeEnvironmentName O365China
    • Connect-IPPSSession -ConnectionUri https://ps.compliance.protection.partner.outlook.cn/powershell-liveid -AzureADAuthorizationEndpointUri https://login.chinacloudapi.cn/organizations*

    *以 Azure 结尾/organizationsAzureADAuthorizationEndpointUri 值仅允许工作或学校帐户。 结尾的/common较旧 URI 值仍然有效,但可能会提示你在个人帐户和工作或学校帐户之间进行选择。 在应排除消费者帐户的企业方案中,建议 /organizations 使用 URI 值。

  • 如果 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"
      

设置仅适用于应用的身份验证

初始加入需要使用应用程序对象进行身份验证。 应用程序和服务主体可互换使用,但应用程序类似于类对象,而服务主体类似于类的实例。 有关详细信息,请参阅 Microsoft Entra ID 中的应用程序和服务主体对象

有关在 Microsoft Entra ID 中创建应用程序的详细可视化流,请参阅https://aka.ms/azuread-app

  1. 在 Microsoft Entra ID 中注册应用程序

  2. 向应用程序分配 API 权限

    默认情况下,应用程序对象具有 委派 API 权限 Microsoft Graph>User.Read 。 要使应用程序对象访问 Exchange 中的资源,它需要应用程序 API 权限 Office 365 Exchange Online>Exchange.ManageAsApp

  3. 生成证书

    • 对于 Microsoft Entra ID 中仅限应用的身份验证,通常使用证书来请求访问权限。 任何拥有证书及其私钥的人都可以使用具有授予应用的权限的应用。

    • 创建和配置 X.509 证书,该证书用于在请求仅限应用的访问令牌时针对 Microsoft Entra ID 对应用程序进行身份验证。 证书可以是自签名的。

    • 此过程类似于为用户帐户生成密码。 有关在 PowerShell 中生成证书的说明,请参阅本文后面的 本部分

      注意

      加密:使用 Exchange 进行仅应用身份验证不支持下一代 (CNG) 证书。 默认情况下,CNG 证书是在新式版本的 Windows 中创建的。 必须从 CSP 密钥提供商处使用证书。 本部分 介绍创建 CSP 证书的两种支持方法。

  4. 将证书附加到 Microsoft Entra 应用程序

  5. 向应用程序分配角色权限

步骤 1:在 Microsoft Entra ID 中注册应用程序

注意

如果遇到问题,请检查 所需权限,以验证你的帐户是否可以创建标识。

  1. 在以下位置https://portal.azure.com/打开 Microsoft Entra 管理中心。

  2. 在页面顶部的“搜索”框中,开始键入“应用注册”,然后从“服务”部分的结果中选择“应用注册”。

    显示 Azure 门户主页搜索结果中的应用注册的屏幕截图。

    或者,若要直接转到应用注册页面,请使用 https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade

  3. 在“应用注册”页面,选择“新增注册”。

    在应用注册页面上选择“新增注册”。

  4. 在打开的 注册应用程序 页面上,配置以下设置:

    • 名称:输入描述性内容。 例如,EXO PowerShell CBA。

    • 支持的帐户类型: 验证 是否选择了此组织目录中的帐户 仅 (<YourOrganizationName> - 单租户)

      注意

      若要使应用程序适用于Exchange Online委派方案的多租户,请选择值“任何组织目录中的帐户” (“任何Microsoft Entra目录 - 多租户) ”。

    • 重定向 URI (可选) :此设置是可选的。 如果需要使用它,请配置以下设置:

      • 平台:选择 Web
      • URI:输入访问令牌的发送方 URI。

      注意

      您无法为 本机应用程序创建凭据,因为您无法将本机应用程序用于自动化应用程序。

      注册应用程序。

    在“应用注册”页上完成后,选择“注册”

  5. 将转到已注册应用的 概述 页面。 使此页保持打开状态。 将在下一步中使用它。

步骤2:向应用程序分配 API 权限

选择本部分中的以下方法 之一 ,将 API 权限分配给应用:

  • 从门户选择并分配 API 权限。
  • 修改应用清单以分配 API 权限。 (Microsoft 365 GCC High 和 DoD 组织应使用此方法) 。

从门户选择并分配 API 权限

  1. 在应用概述页上,从“管理”部分选择 API 权限

    在应用程序概述页上选择 API 权限。

  2. 在应用 API 权限 页上,选择 添加权限

    在应用程序的“API 权限”页上选择“添加权限”。

  3. 在打开的“请求 API 权限”浮出控件中,选择“我的组织使用的 API”选项卡,开始在搜索框中键入Office 365 Exchange Online,然后从结果中选择它。

    在“我的组织使用的 API”选项卡上查找并选择Office 365 Exchange Online。

  4. 在“ 应用程序需要什么类型的权限? ”浮出控件上,选择“ 应用程序权限”

  5. 在显示的权限列表中,展开 Exchange,选择 Exchange.ManageAsApp,然后选择“添加权限”

    从“应用程序权限”选项卡中查找并选择 Exchange.ManageAsApp 权限。

  6. 返回应用 API 权限页面,验证是否列出了 Office 365 Exchange Online>Exchange.ManageAsApp,并包含以下值:

    • 类型应用程序

    • 需要管理员同意是。

    • 状态:当前不正确的值是“未为组织>授予<”

      通过选择“为组织>授予<管理员同意”来更改此值,阅读打开的确认对话框,然后选择“”。

      Exchange.ManageAsApp 权限需要但未授予管理员同意。

      现在已为组织>授予<状态值。

      授予 Exchange.ManageAsApp 权限的管理员同意。

  7. 对于默认的 Microsoft Graph User.Read> 条目,请选择 ...>撤销管理员同意,然后在打开的确认对话框中选择 以将状态返回到默认空白值。

    从默认 Microsoft Graph User.Read 权限中删除了管理员同意。

  8. 关闭当前 API 权限 页面(不是浏览器选项卡),以返回 应用注册 页面。 在接下来的步骤中使用“应用注册”页。

修改应用清单以分配 API 权限

注意

本部分中的过程将应用上的现有默认权限 (Microsoft Graph) 中委托的 User.Read 权限与 Office 365 Exchange Online 中所需的应用程序 Exchange.ManageAsApp 权限附加。

  1. 在应用概述页上,从“管理”部分选择清单

    在应用程序概述页上选择“清单”。

  2. 在应用 清单 页上,找到 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"
                }
            ]
        }
    ],
    

    清单 页面上完成后,选择“ 保存”。

  3. 仍在清单页上,从“管理”部分选择 API 权限

    从清单页面中选择 API 权限。

  4. 在“API 权限”页上,验证是否列出了 Office 365 Exchange Online>Exchange.ManageAsApp,并且包含以下值:

    • 类型应用程序

    • 需要管理员同意是。

    • 状态:对于 Office 365 Exchange Online>Exchange.ManageAsApp 条目,当前不正确的值是“未为组织>授予”<

      通过选择 授予组织>管理员同意 <来更改 状态 值,阅读打开的确认对话框,然后选择

      Exchange.ManageAsApp 权限需要但未授予管理员同意。

      现在已为组织>授予<状态值。

      授予 Exchange.ManageAsApp 权限的管理员同意。

  5. 对于默认的 Microsoft Graph User.Read> 条目,请选择 ...>撤销管理员同意,然后在打开的确认对话框中选择 以将状态返回到默认空白值。

    从默认 Microsoft Graph User.Read 权限中删除了管理员同意。

  6. 关闭当前 API 权限 页面(不是浏览器选项卡),以返回 应用注册 页面。 在接下来的步骤中使用“应用注册”页。

步骤 3:生成证书

注意

加密:如本文所述,仅限应用身份验证不支持下一代 (CNG) 证书。 默认情况下,将在新式 Windows 版本中创建 CNG 证书。 需要使用 CSP 密钥提供程序提供的证书。

可以使用自签名证书、由内部公钥基础结构或 PKI ((例如 Active Directory 证书服务或 AD CS) )颁发的证书,或由受信任的商业证书颁发机构 (CA) 颁发的证书。

X.509 证书的唯一要求是具有可导出且可用的私钥 (.pfx) 和公共证书 (.cer) 。

对于 自签名证书,请使用以下方法之一:

  • (建议的) :在提升的 PowerShell 会话中使用 New-SelfSignedCertificateExport-CertificateExport-PfxCertificate cmdlet (你在选择 “以管理员身份运行 ”后打开的 PowerShell 窗口) 请求自签名证书,默认情况下) 将证书的私钥和公钥导出到 SHA1 (文件。 例如:

    # Create a self-signed certificate
    $mycert = New-SelfSignedCertificate -DnsName "contoso.org" -CertStoreLocation "cert:\CurrentUser\My" -NotAfter (Get-Date).AddYears(1) -KeySpec KeyExchange
    
    # Export the X.509 certificate and the associated private key to a password-protected .pfx file
    $mycert | Export-PfxCertificate -FilePath mycert.pfx -Password (Get-Credential).password
    
    # Export the X.509 public certificate to a .cer file
    $mycert | Export-Certificate -FilePath mycert.cer
    
  • 使用 Create-SelfSignedCertificate script 脚本生成 SHA1 证书。

    .\Create-SelfSignedCertificate.ps1 -CommonName "MyCompanyName" -StartDate 2026-01-06 -EndDate 2027-01-06
    

步骤 4:将证书附加到 Microsoft Entra 应用程序

在应用程序中注册证书后,可以使用私钥(.pfx )或缩略图进行身份验证。

  1. 步骤 2 结束时的“应用”注册页上的“拥有的应用程序”选项卡上,选择应用程序。

    如果需要返回 应用注册 页,请使用 https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/RegisteredApps,验证已选择“ 拥有的应用程序 ”选项卡,然后选择你的应用程序。

    选择你的应用的应用注册页面。

  2. 在打开的应用程序页上,从“管理”部分选择“证书 & 机密”。

    在应用程序属性页上选择证书 & 机密。

  3. “证书 & 机密 ”页上,选择 “上传证书”

    在“证书 & 机密”页上选择“上传证书”。

    在打开的“上传证书”浮出控件中,浏览到在步骤 3 中导出) 公共证书 (.cer 文件,然后选择“添加”

    浏览到证书,然后选择“添加”。

    现在,证书显示在 证书 部分中。

    显示已添加证书的应用程序页面。

  4. 关闭当前 证书和机密 页面,然后关闭 应用注册 页面,已返回到主 https://portal.azure.com/ 页。 将在下一步中使用它。

如果在步骤 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:向应用程序分配角色权限

可以选择下列选项:

  • 选项 1:将 Microsoft Entra 角色分配给应用程序:使用内置的 Microsoft Entra 角色授予该角色的所有权限。 你无法自定义或限定这些角色的范围。

  • 选项 2:使用服务主体将自定义角色组分配给应用程序:在以下情况下建议使用此选项:

    • 需要限制应用程序中的可用命令。
    • 需要使用写入范围来限制可以修改哪些收件人。
  • 选项 3:将 Microsoft Entra 角色与自定义角色组合并:RBAC 合并来自所有源的权限。 建议使用此方法来扩展内置 Microsoft Entra 角色的功能。 例如,可以通过从自定义角色授予额外权限来扩展 Exchange 收件人 管理员角色的功能。

以下小节介绍了这些选项。

注意

对于 Exchange Online 委派方案中的多租户应用程序,需要在每个客户租户中分配权限。

选项 1:将 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 来说略有不同。 将显示适用于这两个环境的步骤。 要为这两个环境配置角色,请重复本部分中的步骤。

  1. 在 Microsoft Entra 管理中心 https://portal.azure.com/,开始在页面顶部的搜索框中键入“角色”和“管理员”,然后从“服务”部分的结果中选择 Microsoft Entra 角色和管理员

    显示 Azure 门户主页搜索结果中的 Microsoft Entra 角色和管理员的屏幕截图。

    或者,若要直接转到 Microsoft Entra 角色和管理员页面,请使用 https://portal.azure.com/#view/Microsoft_AAD_IAM/AllRolesBlade

  2. 在打开的 角色和管理员 页面上,通过在结果中 单击角色名称 查找并选择受支持角色之一。

    • Exchange Online PowerShell:例如,查找并选择 Exchange 管理员角色。

      通过单击角色名称来查找并选择受支持的 Exchange Online PowerShell 角色。

    • 安全 & 合规性 PowerShell: 例如,查找并选择“ 合规性管理员 ”角色。

      通过单击角色名称查找并选择受支持的安全性和合规性 PowerShell 角色 &。

  3. 在打开的 “作业 ”页上,选择 “添加作业”

    • Exchange Online PowerShell

      在 Exchange Online PowerShell 的角色分配页上选择“添加分配”。

    • 安全与合规 PowerShell

      在“安全 & 合规性 PowerShell”的“角色分配”页上选择“添加分配”。

  4. 在打开的“添加分配”浮出控件中,查找并选择在 步骤 1 中创建的应用。

    在“添加分配”浮出控件上查找并选择你的应用。

    完成在“ 添加作业 ”浮出控件中后,选择 “添加”

  5. 返回 “分配 ”页面,验证角色是否已分配给应用。

    • Exchange Online PowerShell

      将应用添加到 Exchange Online PowerShell 角色后的角色分配页。

    • 安全与合规 PowerShell

      之后的角色分配页将应用添加到安全 & 合规性 PowerShell 的角色。

选项 2:使用服务主体将自定义角色组分配给应用程序

注意

在完成创建新服务主体的步骤之前,需要连接到 Exchange Online PowerShell 或 Security & Compliance PowerShell。 在不连接到 PowerShell 的情况下创建新的服务主体不起作用 (需要你的 Azure 应用 ID 和对象 ID 才能创建新的服务主体) 。

有关创建自定义角色组的信息,请参阅在 Exchange Online 中创建角色组和在 Microsoft Defender 门户中创建Email &协作角色组。 分配给应用程序的自定义角色组可以包含内置角色和自定义角色的任意组合。

若要使用服务主体将自定义角色组分配给应用程序,请执行以下步骤:

  1. 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

  2. 在同一 PowerShell 窗口中,连接到 Exchange Online PowerShellSecurity & 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

  3. 在 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