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.4 或更新版本。
- Security & Compliance PowerShell (Connect-IPPSSession) : 版本 3.0.0 或更新。
關於如何安裝或更新模組的說明,請參見「安裝與維護 Exchange Online PowerShell 模組」。 關於如何在 Azure 自動化中使用該模組的說明,請參見「管理 Azure 自動化中的模組」。
在中國由21Vianet營運的Office 365中,可提供集體談判或僅應用程式認證。
Exchange Online PowerShell V3 模組中的 REST API 連線需要 PowerShellGet 和 PackageManagement 模組。 欲了解更多資訊,請參閱 PowerShellGet 以支援 Windows 中基於 REST 的連線。
如果本文中的程序對你不適用,請執行以下指令確認你是否安裝了 PackageManagement 或 PowerShellGet 模組的預覽版:
Get-InstalledModule PackageManagement -AllVersions; Get-InstalledModule PowerShellGet -AllVersions。在 Exchange Online PowerShell 中,無法將此文章中的程序與下列 Microsoft 365 群組 Cmdlet 一起使用:
你可以用 Microsoft Graph 來取代那些指令列的大部分功能。 欲了解更多資訊,請參閱 Microsoft Graph 中的群組操作。
在安全 & 合規 PowerShell 中,你無法使用本文中的程序搭配 Microsoft Purview 指令,包括但不限於:
Exchange Online 支援委派情境。 建議的委派連結方法是使用 GDAP 和 App Consent。 欲了解更多資訊,請參閱使用 Exchange Online PowerShell v3 模組與 GDAP 及 App Consent。 當客戶尚未建立 CSP 關係時,你也可以使用多租戶應用程式。 使用多租戶應用程式的必要步驟已在本文的常規說明中說明。
如果使用 Windows PowerShell SDK 連線時遇到以下錯誤,請使用 Connect-ExchangeOnline 指令檔的 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 你組織的主要網域作為 組織 參數的值。
以下連線指令擁有許多與 Connect to Exchange Online PowerShell 及 Connect to Security & Compliance PowerShell 中描述的選項相同。 例如:
Microsoft 365 GCC High、Microsoft 365 DoD 或 Microsoft 365 中國 (由 21 Vianet) 環境運作,需要以下額外的參數與數值:
Microsoft 365 GCC High
Connect-ExchangeOnline -ExchangeEnvironmentName O365USGovGCCHighConnect-IPPSSession -ConnectionUri https://ps.compliance.protection.office365.us/powershell-liveid/ -AzureADAuthorizationEndpointUri https://login.microsoftonline.us/organizations*
Microsoft 365 DoD
Connect-ExchangeOnline -ExchangeEnvironmentName O365USGovDoDConnect-IPPSSession -ConnectionUri https://compliance.dod.microsoft.com/powershell-liveid -AzureADAuthorizationEndpointUri https://login.microsoftonline.us/organizations*
由世紀互聯提供的 Microsoft 365 (中國)
Connect-ExchangeOnline -ExchangeEnvironmentName O365ChinaConnect-IPPSSession -ConnectionUri https://ps.compliance.protection.partner.outlook.cn/powershell-liveid -AzureADAuthorizationEndpointUri https://login.chinacloudapi.cn/organizations*
* AzureADAuthorizationEndpointUri 的值,結尾
/organizations的值只允許工作或學校帳號。 舊的 URI 值以 URI 結尾/common仍然有效,但可能會讓你在個人帳號和工作或學校帳號之間做選擇。 我們建議在企業情境下使用/organizationsURI 值,因為消費者帳戶應被排除。如果 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。
-
應用程式物件預設擁有 委派 API 權限 Microsoft Graph>User.Read 。 應用程式物件若要存取 Exchange 中的資源,需要應用程式 API 權限Office 365 Exchange Online>Exchange.ManageAsApp。
-
在 Microsoft Entra ID 中進行僅應用程式的認證,通常會使用憑證來請求存取權限。 任何擁有憑證及其私鑰的人,都可以使用該應用程式所獲得的權限。
建立並設定自簽 X.509 憑證,用於驗證您的應用程式與 Microsoft Entra ID 的驗證,同時請求應用程式專用存取權杖。
這個程序類似於為使用者帳號產生密碼。 也可以自行簽署憑證。 請參閱本文後面 的本節 ,了解如何在 PowerShell 中產生憑證。
注意事項
密碼學:下一代 CNG) 憑證 (不支援 Exchange 的應用程式認證。 CNG 證書在現代版本的 Windows 中預設產生。 您必須使用 CSP 金鑰提供者的憑證。 本節 涵蓋兩種支援的建立 CSP 證書的方法。
-
應用程式必須指派適當的 RBAC 角色。 由於應用程式是用 Microsoft Entra ID 配置的,你可以使用任何支援的內建角色。
步驟 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委派情境下多租戶,請選擇任一組織目錄中的 Accounts 值 (任意Microsoft Entra目錄 - 多租戶) 。
將 URI 重新導向 (可選) :此設定為可選。 如果你需要使用它,請設定以下設定:
- 平台:選擇 網頁。
- URI:輸入傳送存取權杖的 URI。
注意事項
你無法為 原生應用程式建立憑證,因為自動化應用程式無法使用原生應用程式。
完成應用程式註冊頁面後,選擇註冊。
你會被帶到你註冊的應用程式的 概覽 頁面。 請保持此頁開啟。 你在下一步會用它。
步驟2:指派 API 權限給應用程式
請在本節選擇 以下方法之一 來指派應用程式 API 權限:
- 從入口網站選擇並指派 API 權限。
- 修改應用程式清單以分配 API 權限。 (Microsoft GCC高等部及國防部組織應) 使用此方法。
從入口網站選擇並指派 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 權限
注意事項
本節程序將應用程式現有的預設權限附加於 (Microsoft圖) 中委託的 User.Read 權限,並附加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 高階或國防部環境僅能存取安全 & 合規 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.pfxSHA1 () 。 例如:# 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 指令碼來產生 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。 你需要為每個客戶租戶產生一個管理員同意網址。 在使用者使用多租戶應用程式連接租戶組織中的 Exchange Online 之前,客戶租戶的管理員應先開啟以下網址:
https://login.microsoftonline.com/<tenant-id>/adminconsent?client_id=<client-id>&scope=https://outlook.office365.com/.default
-
<tenant-id>是客戶的租戶編號。 -
<client-id>是多租戶應用程式的 ID。 - 預設範圍用於授予應用程式權限。
欲了解更多關於 URL 語法的資訊,請參閱 向目錄管理員請求權限。
步驟 5:將 Microsoft Entra 角色指派給應用程式
您有兩種選擇:
- 將 Microsoft Entra 角色分配給應用程式
- 使用服務主體為應用程式指派自訂角色群組:此方法僅在您以 REST API 模式連接 PowerShell 或安全 & 合規 PowerShell 時Exchange Online支援。 安全性 & 合規 PowerShell 支援 3.2.0 版本或更新版本的 REST API 模式。
注意事項
你也可以結合這兩種方法來分配權限。 例如,你可以使用 Microsoft Entra 角色作為「Exchange 接收者管理員」角色,並指派自訂的 RBAC 角色來擴充權限。
對於 Exchange Online 委派場景中的多租戶應用程式,你需要在每個客戶租戶中分配權限。
將 Microsoft Entra 角色分配給應用程式
支援的 Microsoft Entra 角色如下表所述:
| 角色 | Exchange Online PowerShell |
安全性與合規性 PowerShell |
|---|---|---|
| 合規性系統管理員 | ✔ | ✔ |
| 交易所管理員¹ | ✔ | |
| 交換接收者管理員 | ✔ | |
| 全球管理員¹² | ✔ | ✔ |
| 全球讀者 | ✔ | ✔ |
| 客服台管理員 | ✔ | |
| 安全管理員¹ | ✔ | ✔ |
| 安全性讀取者 | ✔ | ✔ |
¹ 全域管理員與 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:
使用服務主體為應用程式指派自訂角色群組
注意事項
你需要先連接 PowerShell 或安全合規 PowerShell Exchange Online & 合規,才能完成建立新服務主體的步驟。 建立新服務主體而不連接 PowerShell 是行不通的, (建立新服務主體) 需要你的 Azure App ID 和物件 ID。
此方法僅在您以 REST API 模式連接 PowerShell 或安全 & 合規 PowerShell 時Exchange Online支援。 安全性 & 合規 PowerShell 支援 3.2.0 版本或更新版本的 REST API 模式。
關於建立自訂角色群組的資訊,請參閱Exchange Online中建立角色群組及Microsoft Defender入口網站中建立Email &協作角色群組。 你指派給應用程式的自訂角色群組可以包含內建與自訂角色的任意組合。
要為使用服務主體指派自訂角色群組,請執行以下步驟:
在 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 視窗中,連接 PowerShell 或安全Exchange Online &合規 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。