控管應用程式的現有使用者 - Microsoft PowerShell

有三種常見案例,在您將應用程式搭配 Microsoft Entra ID 控管 存取權檢閱等功能使用應用程式之前,必須先將 Microsoft Entra 識別元填入應用程式的現有使用者。

授權需求

使用此功能需要 Microsoft Entra ID 控管授權。 若要尋找您需求的正確授權,請參閱 Microsoft Entra ID 控管 授權基本概念

使用自己的識別提供者之後,移轉至 Microsoft Entra 標識碼的應用程式

在第一個案例中,應用程式已存在於環境中。 先前,應用程式會使用自己的識別提供者或資料存放區來追蹤哪些使用者具有存取權。

當您將應用程式變更為依賴 Microsoft Entra ID 時,只有位於 Microsoft Entra ID 且允許存取該應用程式的使用者才能存取該應用程式。 在設定變更時,您可以選擇將現有使用者從該應用程式的數據存放區帶入 Microsoft Entra ID。 然後,這些用戶會繼續透過 Microsoft Entra ID 存取。

讓與 Microsoft Entra ID 中代表之應用程式相關聯的使用者,可讓 Microsoft Entra ID 追蹤可存取應用程式的使用者,即使他們與應用程式的關係源自於其他地方也一樣。 例如,關聯性可能源自應用程式的資料庫或目錄。

在 Microsoft Entra 識別碼知道使用者的指派之後,它可以將更新傳送至應用程式的數據存放區。 更新 包含該使用者的屬性變更或使用者超出應用程式範圍時。

未使用 Microsoft Entra ID 做為其唯一識別提供者的應用程式

在第二個案例中,應用程式不只依賴 Microsoft Entra ID 作為其識別提供者。

在某些情況下,應用程式可能會依賴AD群組。 此案例說明在準備使用者對應用程式存取權的存取權檢閱中的模式 B。 您不需要依照該文章所述來設定該應用程式的布建,而是遵循該文章中模式 B 的指示,瞭解如何檢閱 AD 群組的成員資格。

在其他情況下,應用程式可能支援多個識別提供者,或有自己的內建認證記憶體。 此案例描述為準備使用者對應用程式存取權的存取權檢閱中的模式 C。

從應用程式移除其他識別提供者或本機認證驗證可能不可行。 在此情況下,如果您想要使用 Microsoft Entra ID 來檢閱誰可以存取該應用程式,或從該應用程式移除某人的存取權,您必須在 Microsoft Entra ID 中建立指派,以代表不依賴 Microsoft Entra ID 進行驗證的應用程式使用者。

如果您打算檢閱具有應用程式存取權的所有使用者,做為存取權檢閱的一部分,就必須擁有這些指派。

例如,假設使用者位於應用程式的數據存放區中。 Microsoft Entra ID 已設定為需要應用程式的角色指派。 不過,使用者在 Microsoft Entra ID 中沒有應用程式角色指派。

如果使用者在 Microsoft Entra ID 中更新,則不會將任何變更傳送至應用程式。 如果檢閱應用程式的角色指派,則不會將使用者包含在檢閱中。 若要讓檢閱中包含所有使用者,您必須為應用程式的所有使用者指派應用程式角色。

應用程式不會使用 Microsoft Entra ID 作為其識別提供者,也不支援布建

對於某些舊版應用程式,從應用程式移除其他識別提供者或本機認證驗證,或啟用布建這些應用程式的通訊協定可能不可行。

不支援布建通訊協定的應用程式案例涵蓋在個別文章中, 控管不支援布建之應用程式的現有使用者。

詞彙

本文說明如何使用 Microsoft Graph PowerShell Cmdlet 來管理應用程式角色指派的程式。 它會使用下列 Microsoft Graph 術語。

說明 Microsoft Graph 術語的圖表。

在 Microsoft Entra ID 中,服務主體 (ServicePrincipal) 代表特定組織目錄中的應用程式。 ServicePrincipal 具有稱為 AppRoles 的屬性,其中列出應用程式支援的角色,例如 Marketing specialistAppRoleAssignment 將使用者連結至服務主體,並指定使用者在該應用程式中擁有的角色。 如果對應用程式進行單一登錄並布建至應用程式,則應用程式可能會有多個服務主體。

您也可以使用 Microsoft Entra 權利管理 存取套件,為使用者提供應用程式限時存取權。 在權利管理中, AccessPackage 包含一或多個資源角色,可能來自多個服務主體。 AccessPackage 也有指派 (Assignment) 供使用者存取套件使用。

當您為使用者建立存取套件指派時,Microsoft Entra 權利管理會自動為使用者建立存取套件中每個應用程式服務主體的必要 AppRoleAssignment 實例。 如需詳細資訊,請參閱 管理 Microsoft Entra 權利管理 中資源的存取權教學課程,以瞭解如何透過 PowerShell 建立存取套件。

開始之前

從應用程式收集現有的使用者

確保所有用戶都記錄在 Microsoft Entra ID 中的第一個步驟是收集具有應用程式存取權的現有使用者清單。

某些應用程式可能有內建命令,可從資料存放區匯出目前用戶的清單。 在其他情況下,應用程式可能會依賴外部目錄或資料庫。

在某些環境中,應用程式可能位於不適合管理 Microsoft Entra 識別符存取權的網路區段或系統上。 因此,您可能需要從該目錄或資料庫擷取使用者清單,然後將它作為檔案傳輸到另一個系統,以用於 Microsoft Entra 互動。

本節說明如何取得逗號分隔值 (CSV) 檔案中使用者清單的四種方法:

  • 從LDAP目錄
  • 從 SQL Server 資料庫
  • 從另一個 SQL 資料庫
  • 從 SAP 雲端身分識別服務

從使用LDAP目錄的應用程式收集現有的使用者

本節適用於使用LDAP目錄作為基礎數據存放區的應用程式,以供未向 Microsoft Entra ID 驗證的使用者使用。 許多LDAP目錄,例如Active Directory,包含輸出使用者清單的命令。

  1. 識別該目錄中哪些用戶屬於應用程式用戶的範圍。 這個選擇將取決於應用程式的組態。 對於某些應用程式,存在於LDAP目錄中的任何使用者都是有效的使用者。 其他應用程式可能要求使用者具有特定屬性,或是該目錄中群組的成員。

  2. 執行命令,從您的目錄中擷取該使用者子集。 請確定輸出包含將用於與 Microsoft Entra ID 比對的用戶屬性。 這些屬性的範例包括員工標識碼、帳戶名稱和電子郵件位址。

    例如,此命令會在目前的檔案系統目錄中產生 CSV 檔案,並具有 userPrincipalName LDAP 目錄中每個人的 屬性:

    $out_filename = ".\users.csv"
    csvde -f $out_filename -l userPrincipalName,cn -r "(objectclass=person)"
    
  3. 如有需要,請將包含使用者清單的 CSV 檔案傳送至 已安裝 Microsoft Graph PowerShell Cmdlet 的系統

  4. 在本文稍後的 確認 Microsoft Entra ID 中繼續閱讀,其使用者符合來自應用程式 一節的使用者。

使用 SQL Server 精靈從應用程式的資料庫數據表收集現有的使用者

本節適用於使用 SQL Server 作為基礎數據存放區的應用程式。

首先,從數據表取得用戶清單。 大部分的資料庫都提供將數據表內容匯出至標準檔格式的方式,例如 CSV 檔案。 如果應用程式使用 SQL Server 資料庫,您可以使用 SQL Server 匯入和匯出精靈來匯出資料庫的部分。 如果您沒有資料庫的公用程式,您可以使用 ODBC 驅動程式搭配 PowerShell,如下一節所述。

  1. 登入安裝 SQL Server 的系統。
  2. 開啟 SQL Server 2019 匯入和匯出 (64 位) 或資料庫的對等專案。
  3. 選取現有的資料庫作為來源。
  4. 選取 [一般檔案目的地 ] 作為目的地。 提供檔名,並將 [代碼頁] 值變更為 65001 (UTF-8)。
  5. 完成精靈,然後選取立即執行的選項。
  6. 等候執行完成。
  7. 如有需要,請將包含使用者清單的 CSV 檔案傳送至 已安裝 Microsoft Graph PowerShell Cmdlet 的系統
  8. 在本文稍後的 確認 Microsoft Entra ID 中繼續閱讀,其使用者符合來自應用程式 一節的使用者。

使用 PowerShell 從應用程式的資料庫資料表收集現有的使用者

本節適用於使用另一個 SQL 資料庫作為基礎數據存放區的應用程式,而您使用 ECMA 連線 or Host 將使用者布建至該應用程式。 如果您尚未設定布建代理程式,請使用該指南來建立您將在本節中使用的 DSN 連線檔案。

  1. 登入布建代理程式所在的系統,或將安裝此系統。

  2. 開啟 PowerShell。

  3. 建構連線至資料庫系統的 連接字串。

    連接字串的元件取決於您資料庫的需求。 如果您使用 SQL Server,請參閱 DSN 和 連接字串 關鍵詞和屬性的清單。

    如果您使用不同的資料庫,則必須包含連接到該資料庫的必要關鍵詞。 例如,如果您的資料庫使用 DSN 檔案、使用者識別碼和密碼的完整路徑名稱,請使用下列命令來建構 連接字串:

    $filedsn = "c:\users\administrator\documents\db.dsn"
    $db_cs = "filedsn=" + $filedsn + ";uid=p;pwd=secret"
    
  4. 開啟資料庫的連線,並使用下列命令提供 連接字串:

    $db_conn = New-Object data.odbc.OdbcConnection
    $db_conn.ConnectionString = $db_cs
    $db_conn.Open()
    
  5. 建構 SQL 查詢,以從資料庫數據表擷取使用者。 請務必包含數據行,這些數據行將用來比對應用程式資料庫中的使用者與 Microsoft Entra ID 中的那些使用者。 數據行可能包含員工標識碼、帳戶名稱或電子郵件位址。

    例如,如果您的使用者保留在名為 USERS 且具有資料 name 行的資料庫 email數據表中,請輸入下列命令:

    $db_query = "SELECT name,email from USERS"
    
    
  6. 透過連線將查詢傳送至資料庫:

    $result = (new-object data.odbc.OdbcCommand($db_query,$db_conn)).ExecuteReader()
    $table = new-object System.Data.DataTable
    $table.Load($result)
    

    結果是數據列清單,代表從查詢擷取的使用者。

  7. 將結果寫入 CSV 檔案:

    $out_filename = ".\users.csv"
    $table.Rows | Export-Csv -Path $out_filename -NoTypeInformation -Encoding UTF8
    
  8. 如果此系統未安裝 Microsoft Graph PowerShell Cmdlet 或未連線到 Microsoft Entra ID,請將包含使用者的 CSV 檔案傳送至 已安裝 Microsoft Graph PowerShell Cmdlet 的系統

從 SAP Cloud Identity Services 收集現有的使用者

本節適用於使用 SAP 雲端身分識別服務作為使用者布建基礎服務的 SAP 應用程式。

  1. 登入 SAP Cloud Identity Services 管理員 控制台,https://<tenantID>.accounts.ondemand.com/adminhttps://<tenantID>.trial-accounts.ondemand.com/admin試用時。
  2. 流覽至 [使用者和授權 > 匯出使用者]。
  3. 選取比對 Microsoft Entra 使用者與 SAP 中使用者所需的所有屬性。 SCIM ID這包括您在 SAP 系統中可能所使用的 、userNameemails和其他屬性。
  4. 選取 [匯出 ],並等候瀏覽器下載 CSV 檔案。
  5. 如果此系統未安裝 Microsoft Graph PowerShell Cmdlet 或未連線到 Microsoft Entra ID,請將包含使用者的 CSV 檔案傳送至 已安裝 Microsoft Graph PowerShell Cmdlet 的系統

確認 Microsoft Entra ID 具有符合應用程式用戶的使用者

既然您有從應用程式取得的所有使用者清單,您將會比對來自應用程式資料存放區的使用者與 Microsoft Entra ID 中的使用者。

繼續之前,請先檢閱來源和目標系統中相符使用者的相關信息。 您之後會使用對等的對應來設定 Microsoft Entra 布建。 此步驟可讓 Microsoft Entra 布建使用相同的比對規則來查詢應用程式的數據存放區。

在 Microsoft Entra ID 中擷取使用者的標識碼

本節說明如何使用 Microsoft Graph PowerShell Cmdlet 與 Microsoft Entra ID 互動。

第一次貴組織針對此案例使用這些 Cmdlet 時,您必須是全域 管理員 istrator 角色,才能在租使用者中使用 Microsoft Graph PowerShell。 後續的互動可以使用較低許可權的角色,例如:

  • 如果您預期要建立新的使用者,則使用者 管理員 istrator。
  • 如果您只是管理應用程式角色指派,應用程式 管理員 istrator 或 Identity Governance 管理員 istrator
  1. 開啟 PowerShell。

  2. 如果您尚未 安裝 Microsoft Graph PowerShell 模組 ,請使用此命令來安裝 Microsoft.Graph.Users 模組和其他模組:

    Install-Module Microsoft.Graph
    

    如果您已安裝模組,請確定您使用的是最新版本:

    Update-Module microsoft.graph.users,microsoft.graph.identity.governance,microsoft.graph.applications
    
  3. 連線 至 Microsoft Entra 識別碼:

    $msg = Connect-MgGraph -ContextScope Process -Scopes "User.ReadWrite.All,Application.ReadWrite.All,AppRoleAssignment.ReadWrite.All,EntitlementManagement.ReadWrite.All"
    
  4. 如果這是您第一次使用此命令,您可能需要同意允許 Microsoft Graph 命令行工具擁有這些許可權。

  5. 將從應用程式資料存放區取得的使用者清單讀取到 PowerShell 工作階段。 如果使用者在 CSV 檔案中,您可以使用 PowerShell Cmdlet Import-Csv ,並提供上一節中檔案的名稱做為自變數。

    例如,如果從 SAP Cloud Identity Services 取得的檔案名為 Users-exported-from-sap.csv 且位於目前目錄中,請輸入此命令。

    $filename = ".\Users-exported-from-sap.csv"
    $dbusers = Import-Csv -Path $filename -Encoding UTF8
    

    如需另一個範例,如果您使用資料庫或目錄,如果檔案名為 users.csv 且位於目前目錄中,請輸入下列命令:

    $filename = ".\users.csv"
    $dbusers = Import-Csv -Path $filename -Encoding UTF8
    
  6. 選擇與 Microsoft Entra ID 中使用者屬性相符之users.csv檔案的數據行。

    如果您使用 SAP 雲端識別服務,則預設對應是具有 Microsoft Entra ID 屬性的 SAP SCIM 屬性userNameuserPrincipalName

    $db_match_column_name = "userName"
    $azuread_match_attr_name = "userPrincipalName"
    

    針對另一個範例,如果您使用資料庫或目錄,則資料庫中的使用者,其中名為 EMail 的數據行值與 Microsoft Entra 屬性 userPrincipalName中的值相同:

    $db_match_column_name = "EMail"
    $azuread_match_attr_name = "userPrincipalName"
    
  7. 在 Microsoft Entra ID 中擷取這些使用者的標識碼。

    下列 PowerShell 腳本會使用 $dbusers稍早指定的、 $db_match_column_name$azuread_match_attr_name 值。 它會查詢 Microsoft Entra 識別碼,以找出具有來源檔案中每個記錄相符值的屬性的使用者。 如果檔案中有許多使用者從來源 SAP Cloud Identity Services、資料庫或目錄取得,此腳本可能需要幾分鐘的時間才能完成。 如果您的 Microsoft Entra ID 中沒有具有 值的屬性,而且需要使用 contains 或其他篩選表達式,則必須自定義下列步驟 11 中的 屬性,才能使用不同的篩選表達式。

    $dbu_not_queried_list = @()
    $dbu_not_matched_list = @()
    $dbu_match_ambiguous_list = @()
    $dbu_query_failed_list = @()
    $azuread_match_id_list = @()
    $azuread_not_enabled_list = @()
    $dbu_values = @()
    $dbu_duplicate_list = @()
    
    foreach ($dbu in $dbusers) { 
       if ($null -ne $dbu.$db_match_column_name -and $dbu.$db_match_column_name.Length -gt 0) { 
          $val = $dbu.$db_match_column_name
          $escval = $val -replace "'","''"
          if ($dbu_values -contains $escval) { $dbu_duplicate_list += $dbu; continue } else { $dbu_values += $escval }
          $filter = $azuread_match_attr_name + " eq '" + $escval + "'"
          try {
             $ul = @(Get-MgUser -Filter $filter -All -Property Id,accountEnabled -ErrorAction Stop)
             if ($ul.length -eq 0) { $dbu_not_matched_list += $dbu; } elseif ($ul.length -gt 1) {$dbu_match_ambiguous_list += $dbu } else {
                $id = $ul[0].id; 
                $azuread_match_id_list += $id;
                if ($ul[0].accountEnabled -eq $false) {$azuread_not_enabled_list += $id }
             } 
          } catch { $dbu_query_failed_list += $dbu } 
        } else { $dbu_not_queried_list += $dbu }
    }
    
    
  8. 檢視先前查詢的結果。 查看 SAP Cloud Identity Services、資料庫或目錄中是否有任何使用者因為錯誤或遺漏相符專案而無法位於 Microsoft Entra ID 中。

    下列 PowerShell 腳稿會顯示未找到的記錄計數:

    $dbu_not_queried_count = $dbu_not_queried_list.Count
    if ($dbu_not_queried_count -ne 0) {
      Write-Error "Unable to query for $dbu_not_queried_count records as rows lacked values for $db_match_column_name."
    }
    $dbu_duplicate_count = $dbu_duplicate_list.Count
    if ($dbu_duplicate_count -ne 0) {
      Write-Error "Unable to locate Microsoft Entra ID users for $dbu_duplicate_count rows as multiple rows have the same value"
    }
    $dbu_not_matched_count = $dbu_not_matched_list.Count
    if ($dbu_not_matched_count -ne 0) {
      Write-Error "Unable to locate $dbu_not_matched_count records in Microsoft Entra ID by querying for $db_match_column_name values in $azuread_match_attr_name."
    }
    $dbu_match_ambiguous_count = $dbu_match_ambiguous_list.Count
    if ($dbu_match_ambiguous_count -ne 0) {
      Write-Error "Unable to locate $dbu_match_ambiguous_count records in Microsoft Entra ID as attribute match ambiguous."
    }
    $dbu_query_failed_count = $dbu_query_failed_list.Count
    if ($dbu_query_failed_count -ne 0) {
      Write-Error "Unable to locate $dbu_query_failed_count records in Microsoft Entra ID as queries returned errors."
    }
    $azuread_not_enabled_count = $azuread_not_enabled_list.Count
    if ($azuread_not_enabled_count -ne 0) {
     Write-Error "$azuread_not_enabled_count users in Microsoft Entra ID are blocked from sign-in."
    }
    if ($dbu_not_queried_count -ne 0 -or $dbu_duplicate_count -ne 0 -or $dbu_not_matched_count -ne 0 -or $dbu_match_ambiguous_count -ne 0 -or $dbu_query_failed_count -ne 0 -or $azuread_not_enabled_count) {
     Write-Output "You will need to resolve those issues before access of all existing users can be reviewed."
    }
    $azuread_match_count = $azuread_match_id_list.Count
    Write-Output "Users corresponding to $azuread_match_count records were located in Microsoft Entra ID." 
    
  9. 當腳本完成時,如果數據源中的任何記錄不在 Microsoft Entra ID 中,就會指出錯誤。 如果應用程式資料存放區中使用者的所有記錄都可能以 Microsoft Entra ID 中的使用者身分,您必須調查哪些記錄不相符,以及原因為何。

    例如,某人的電子郵件位址和 userPrincipalName 可能已在 Microsoft Entra ID 中變更,而不會在應用程式的數據源中更新其對應的 mail 屬性。 或者,使用者可能已經離開組織,但仍位於應用程式的數據源中。 或者,應用程式數據源中可能有廠商或超級系統管理員帳戶,不會對應至 Microsoft Entra 識別碼中的任何特定人員。

  10. 如果有使用者無法位於 Microsoft Entra ID 中,或沒有作用中且無法登入,但您想要在 SAP Cloud Identity Services、資料庫或目錄中更新其存取權,或更新其屬性,您必須更新應用程式、比對規則,或更新或為其建立 Microsoft Entra 使用者。 如需要進行哪些變更的詳細資訊,請參閱 管理與 Microsoft Entra ID 中不符合使用者的應用程式中的對應和用戶帳戶。

    如果您選擇在 Microsoft Entra ID 中建立使用者的選項,您可以使用下列其中一項來大量建立使用者:

    • CSV 檔案,如在 Microsoft Entra 系統管理中心大量建立使用者中所述
    • New-MgUser Cmdlet

    請確定這些新使用者已填入 Microsoft Entra ID 所需的屬性,以便稍後將它們與應用程式中的現有使用者相符,以及 Microsoft Entra ID 所需的屬性,包括 userPrincipalNamemailNicknamedisplayName。 在 userPrincipalName 目錄中的所有使用者中,必須是唯一的。

    例如,您可能有資料庫中的使用者,其中名為 EMail 的數據行值是您想要作為 Microsoft Entra 使用者主體名稱使用的值、數據行中的值包含 Microsoft Entra ID 郵件暱稱,而數據行中的AliasFull name值則包含使用者的顯示名稱:

    $db_display_name_column_name = "Full name"
    $db_user_principal_name_column_name = "Email"
    $db_mail_nickname_column_name = "Alias"
    

    然後,您可以使用此腳本,為 SAP Cloud Identity Services、資料庫或目錄與 Microsoft Entra ID 中的使用者不相符的使用者建立 Microsoft Entra 使用者。 請注意,您可能需要修改此腳本,以新增組織所需的其他 Microsoft Entra 屬性,或 如果 $azuread_match_attr_name 不是 mailNicknameuserPrincipalName,才能提供該 Microsoft Entra 屬性。

    $dbu_missing_columns_list = @()
    $dbu_creation_failed_list = @()
    foreach ($dbu in $dbu_not_matched_list) {
       if (($null -ne $dbu.$db_display_name_column_name -and $dbu.$db_display_name_column_name.Length -gt 0) -and
           ($null -ne $dbu.$db_user_principal_name_column_name -and $dbu.$db_user_principal_name_column_name.Length -gt 0) -and
           ($null -ne $dbu.$db_mail_nickname_column_name -and $dbu.$db_mail_nickname_column_name.Length -gt 0)) {
          $params = @{
             accountEnabled = $false
             displayName = $dbu.$db_display_name_column_name
             mailNickname = $dbu.$db_mail_nickname_column_name
             userPrincipalName = $dbu.$db_user_principal_name_column_name
             passwordProfile = @{
               Password = -join (((48..90) + (96..122)) * 16 | Get-Random -Count 16 | % {[char]$_})
             }
          }
          try {
            New-MgUser -BodyParameter $params
          } catch { $dbu_creation_failed_list += $dbu; throw }
       } else {
          $dbu_missing_columns_list += $dbu
       }
    }
    
  11. 將任何遺漏的使用者新增至 Microsoft Entra ID 之後,請再次執行步驟 7 中的腳本。 然後從步驟 8 執行腳本。 檢查未報告任何錯誤。

    $dbu_not_queried_list = @()
    $dbu_not_matched_list = @()
    $dbu_match_ambiguous_list = @()
    $dbu_query_failed_list = @()
    $azuread_match_id_list = @()
    $azuread_not_enabled_list = @()
    $dbu_values = @()
    $dbu_duplicate_list = @()
    
    foreach ($dbu in $dbusers) { 
       if ($null -ne $dbu.$db_match_column_name -and $dbu.$db_match_column_name.Length -gt 0) { 
          $val = $dbu.$db_match_column_name
          $escval = $val -replace "'","''"
          if ($dbu_values -contains $escval) { $dbu_duplicate_list += $dbu; continue } else { $dbu_values += $escval }
          $filter = $azuread_match_attr_name + " eq '" + $escval + "'"
          try {
             $ul = @(Get-MgUser -Filter $filter -All -Property Id,accountEnabled -ErrorAction Stop)
             if ($ul.length -eq 0) { $dbu_not_matched_list += $dbu; } elseif ($ul.length -gt 1) {$dbu_match_ambiguous_list += $dbu } else {
                $id = $ul[0].id; 
                $azuread_match_id_list += $id;
                if ($ul[0].accountEnabled -eq $false) {$azuread_not_enabled_list += $id }
             } 
          } catch { $dbu_query_failed_list += $dbu } 
        } else { $dbu_not_queried_list += $dbu }
    }
    
    $dbu_not_queried_count = $dbu_not_queried_list.Count
    if ($dbu_not_queried_count -ne 0) {
      Write-Error "Unable to query for $dbu_not_queried_count records as rows lacked values for $db_match_column_name."
    }
    $dbu_duplicate_count = $dbu_duplicate_list.Count
    if ($dbu_duplicate_count -ne 0) {
      Write-Error "Unable to locate Microsoft Entra ID users for $dbu_duplicate_count rows as multiple rows have the same value"
    }
    $dbu_not_matched_count = $dbu_not_matched_list.Count
    if ($dbu_not_matched_count -ne 0) {
      Write-Error "Unable to locate $dbu_not_matched_count records in Microsoft Entra ID by querying for $db_match_column_name values in $azuread_match_attr_name."
    }
    $dbu_match_ambiguous_count = $dbu_match_ambiguous_list.Count
    if ($dbu_match_ambiguous_count -ne 0) {
      Write-Error "Unable to locate $dbu_match_ambiguous_count records in Microsoft Entra ID as attribute match ambiguous."
    }
    $dbu_query_failed_count = $dbu_query_failed_list.Count
    if ($dbu_query_failed_count -ne 0) {
      Write-Error "Unable to locate $dbu_query_failed_count records in Microsoft Entra ID as queries returned errors."
    }
    $azuread_not_enabled_count = $azuread_not_enabled_list.Count
    if ($azuread_not_enabled_count -ne 0) {
     Write-Warning "$azuread_not_enabled_count users in Microsoft Entra ID are blocked from sign-in."
    }
    if ($dbu_not_queried_count -ne 0 -or $dbu_duplicate_count -ne 0 -or $dbu_not_matched_count -ne 0 -or $dbu_match_ambiguous_count -ne 0 -or $dbu_query_failed_count -ne 0 -or $azuread_not_enabled_count -ne 0) {
     Write-Output "You will need to resolve those issues before access of all existing users can be reviewed."
    }
    $azuread_match_count = $azuread_match_id_list.Count
    Write-Output "Users corresponding to $azuread_match_count records were located in Microsoft Entra ID." 
    

註冊應用程式

如果應用程式已在 Microsoft Entra ID 中註冊,請繼續進行下一個步驟。

檢查尚未指派給應用程式的使用者

先前的步驟已確認應用程式數據存放區中的所有使用者都以 Microsoft Entra ID 中的使用者身分存在。 不過,它們目前可能未全部指派給 Microsoft Entra 識別碼中的應用程式角色。 因此,後續步驟是查看哪些用戶沒有應用程式角色的指派。

  1. 查閱應用程式服務主體的服務主體標識碼。 如果您最近為使用LDAP目錄或 SQL 資料庫的應用程式建立服務主體,請使用該服務主體的名稱。

    例如,如果企業應用程式命名 CORPDB1為 ,請輸入下列命令:

    $azuread_app_name = "CORPDB1"
    $azuread_sp_filter = "displayName eq '" + ($azuread_app_name -replace "'","''") + "'"
    $azuread_sp = Get-MgServicePrincipal -Filter $azuread_sp_filter -All
    
  2. 擷取目前在 Microsoft Entra ID 中指派給應用程式的使用者。

    這會以上一個命令中設定的 $azuread_sp 變數為基礎。

    $azuread_existing_assignments = @(Get-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $azuread_sp.Id -All)
    
  3. 比較上一節的使用者識別碼清單與目前指派給應用程式的使用者:

    $azuread_not_in_role_list = @()
    foreach ($id in $azuread_match_id_list) {
       $found = $false
       foreach ($existing in $azuread_existing_assignments) {
          if ($existing.principalId -eq $id) {
             $found = $true; break;
          }
       }
       if ($found -eq $false) { $azuread_not_in_role_list += $id }
    }
    $azuread_not_in_role_count = $azuread_not_in_role_list.Count
    Write-Output "$azuread_not_in_role_count users in the application's data store are not assigned to the application roles."
    

    如果未將零位使用者指派給應用程式角色,表示所有使用者都指派給應用程式角色,則您不需要進行任何進一步的變更,再執行存取權檢閱。

    不過,如果目前未將一或多個使用者指派給應用程式角色,您必須繼續程式,並將其新增至其中一個應用程式的角色。

  4. 選取要指派其餘用戶的應用程式角色。

    應用程式可能有一個以上的角色,而服務主體可能會有其他角色。 使用此指令來列出服務主體的可用角色:

    $azuread_sp.AppRoles | where-object {$_.AllowedMemberTypes -contains "User"} | ft DisplayName,Id
    

    從清單中選取適當的角色,並取得其角色識別符。 例如,如果角色名稱為 Admin,請在下列 PowerShell 命令中提供該值:

    $azuread_app_role_name = "Admin"
    $azuread_app_role_id = ($azuread_sp.AppRoles | where-object {$_.AllowedMemberTypes -contains "User" -and $_.DisplayName -eq $azuread_app_role_name}).Id
    if ($null -eq $azuread_app_role_id) { write-error "role $azuread_app_role_name not located in application manifest"}
    

設定應用程式佈建

如果您的應用程式使用LDAP目錄、SQL資料庫、SAP Cloud Identity Services 或支援SCIM,則在建立新的指派之前,請設定 將 Microsoft Entra 使用者 佈建至應用程式。 在建立指派之前設定布建,可讓 Microsoft Entra ID 將 Microsoft Entra ID 中的使用者與應用程式角色指派比對已在應用程式數據存放區中的使用者。 如果您的應用程式有要布建的內部部署目錄或資料庫,而且也支援同盟 SSO,則您可能需要兩個服務主體來代表目錄中的應用程式:一個用於布建,另一個用於 SSO。 如果您的應用程式不支援布建,請繼續閱讀下一節。

  1. 請確定應用程式已設定為要求使用者具有應用程式角色指派,因此只會將選取的使用者布建至應用程式。

  2. 如果尚未為應用程式設定布建,請立即進行設定(但不要開始布建):

  3. 檢查應用程式的 [ 屬性] 索引標籤。 確認 [ 需要使用者指派嗎?] 選項設定為 [是]。 如果設定為 [否],目錄中的所有使用者,包括外部身分識別,都可以存取應用程式,而且您無法檢閱應用程式的存取權。

  4. 檢查屬性對應以布建至該應用程式。 請確定 已針對您在上一節中用於比對的 Microsoft Entra 屬性和數據行,設定使用這個屬性 比對物件。

    如果這些規則未使用您稍早使用的相同屬性,則在建立應用程式角色指派時,Microsoft Entra ID 可能無法在應用程式的數據存放區中找到現有的使用者。 然後,Microsoft Entra ID 可能會不小心建立重複的使用者。

  5. 檢查是否有屬性 isSoftDeleted 對應至應用程式的屬性。

    當使用者從應用程式取消指派時,在 Microsoft Entra 標識碼中虛刪除或遭到封鎖而無法登入時,Microsoft Entra 布建將會更新對應至 isSoftDeleted的屬性。 如果未對應任何屬性,稍後從應用程式角色取消指派的使用者將繼續存在於應用程式的數據存放區中。

  6. 如果已為應用程式啟用布建,請檢查應用程式佈建是否不在隔離區中。 解決在繼續之前造成隔離的任何問題。

在 Microsoft Entra ID 中建立應用程式角色指派

若要讓 Microsoft Entra 識別碼符合應用程式中的使用者與 Microsoft Entra 識別碼中的使用者,您必須在 Microsoft Entra ID 中建立應用程式角色指派。 每個應用程式角色指派都會將一個使用者與一個服務主體的應用程式角色產生關聯。

在 Microsoft Entra ID 中為應用程式使用者建立應用程式角色指派時,且應用程式支援布建,然後:

  • Microsoft Entra ID 會透過 SCIM 或其目錄或資料庫來查詢應用程式,以判斷使用者是否已存在。
  • 對 Microsoft Entra ID 中的使用者屬性進行後續更新時,Microsoft Entra ID 會將這些更新傳送至應用程式。
  • 除非使用者在 Microsoft Entra ID 之外更新,或直到移除 Microsoft Entra ID 中的指派為止,否則用戶會無限期地保留在應用程式中。
  • 在下一次存取權檢閱該應用程式的角色指派時,使用者將會包含在存取權檢閱中。
  • 如果使用者在存取權檢閱中遭到拒絕,將會移除其應用程式角色指派。 Microsoft Entra ID 會通知應用程式用戶無法登入。

如果應用程式不支援布建,則

  • 除非使用者在 Microsoft Entra ID 之外更新,或直到移除 Microsoft Entra ID 中的指派為止,否則用戶會無限期地保留在應用程式中。
  • 在下一次檢閱該應用程式的角色指派時,使用者將會包含在檢閱中。
  • 如果使用者在存取權檢閱中遭到拒絕,將會移除其應用程式角色指派。 用戶將無法再從 Microsoft Entra ID 登入應用程式。
  1. 為目前沒有角色指派的使用者建立應用程式角色指派:

    foreach ($u in $azuread_not_in_role_list) {
       $res = New-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $azuread_sp.Id -AppRoleId $azuread_app_role_id -PrincipalId $u -ResourceId $azuread_sp.Id 
    }
    
  2. 等候一分鐘,變更在 Microsoft Entra ID 內傳播。

檢查 Microsoft Entra 布建是否符合現有的使用者

  1. 查詢 Microsoft Entra ID 以取得更新的角色指派清單:

    $azuread_existing_assignments = @(Get-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $azuread_sp.Id -All)
    
  2. 將上一節的使用者識別碼清單與現在指派給應用程式的使用者比較:

    $azuread_still_not_in_role_list = @()
    foreach ($id in $azuread_match_id_list) {
       $found = $false
       foreach ($existing in $azuread_existing_assignments) {
          if ($existing.principalId -eq $id) {
             $found = $true; break;
          }
       }
       if ($found -eq $false) { $azuread_still_not_in_role_list += $id }
    }
    $azuread_still_not_in_role_count = $azuread_still_not_in_role_list.Count
    if ($azuread_still_not_in_role_count -gt 0) {
       Write-Output "$azuread_still_not_in_role_count users in the application's data store are not assigned to the application roles."
    }
    

    如果未將任何使用者指派給應用程式角色,請檢查 Microsoft Entra 稽核記錄,以取得上一個步驟的錯誤。

  3. 如果應用程式服務主體已設定為布建,且服務主體的 [布建狀態] 為 [關閉],請將它開啟。 您也可以使用 Graph API 開始佈建

  4. 根據布建使用者所需的時間指引,等候 Microsoft Entra 布建將應用程式的現有使用者與剛指派的使用者相符。

  5. 透過入口網站或 Graph API 監視布建狀態,以確保所有使用者都順利比對。

    如果您沒有看到正在布建的使用者,請檢查 疑難解答指南中是否有未布建的使用者。 如果您在布建狀態中看到錯誤,且布建至內部部署應用程式,請檢查 內部部署應用程式佈建的疑難解答指南。

  6. 透過 Microsoft Entra 系統管理中心Graph API 檢查布建記錄。 將記錄篩選為 [失敗] 狀態。 如果 ErrorCode 為 DuplicateTargetEntries 發生失敗,這表示布建比對規則中的模棱兩可,您必須更新 Microsoft Entra 使用者或用於比對的對應,以確保每個 Microsoft Entra 使用者都符合一個應用程式使用者。 然後篩選記錄至 [建立] 動作並略過狀態。 如果使用者已略過 NotEffectivelyEntitled 的 SkipReason 程式代碼,這可能表示 Microsoft Entra ID 中的使用者帳戶未相符,因為使用者帳戶狀態為 [已停用]。

在 Microsoft Entra 布建服務根據您建立的應用程式角色指派來比對用戶之後,這些使用者的後續變更將會傳送至應用程式。

選取適當的檢閱者

當您建立每個存取權檢閱時,系統管理員可以選擇一或多個檢閱者。 檢閱者可以選擇用戶繼續存取資源或移除資源,以執行檢閱。

資源擁有者通常會負責執行檢閱。 如果您要建立群組的檢閱,作為檢閱模式 B 中整合之應用程式的存取權的一部分,您可以選取群組擁有者作為檢閱者。 由於 Microsoft Entra 識別碼中的應用程式不一定有擁有者,因此無法選取應用程式擁有者作為檢閱者的選項。 相反地,建立檢閱時,您可以提供應用程式擁有者的名稱做為檢閱者。

您也可以在建立群組或應用程式的檢閱時選擇多 階段檢閱。 例如,您可以選取讓每個獲指派使用者的管理員執行檢閱的第一個階段,以及資源擁有者第二個階段。 如此一來,資源擁有者就可以專注於已由其管理員核准的使用者。

建立檢閱之前,請先確認您的租使用者中有足夠的 Microsoft Entra ID P2 或 Microsoft Entra ID 控管 SKU 基座。 此外,請確認所有檢閱者都是具有電子郵件位址的作用中使用者。 存取權檢閱開始時,他們都會檢閱來自 Microsoft Entra ID 的電子郵件。 如果檢閱者沒有信箱,當檢閱開始時或電子郵件提醒時,他們將不會收到電子郵件。 而且,如果封鎖他們無法登入 Microsoft Entra ID,他們將無法執行檢閱。

設定存取權檢閱或權利管理

一旦用戶位於應用程式角色中,且您已識別檢閱者,您就可以使用存取權檢閱或權利管理來管理需要存取權的使用者和任何其他使用者。

  • 如果應用程式只有單一應用程式角色,應用程式會以您目錄中的單一服務主體表示,而且不需要其他使用者存取應用程式,然後繼續進行下一節,以 使用存取權檢閱來檢閱和移除現有的存取權。
  • 否則,請繼續閱讀本文的 章節,以 使用權利管理來管理存取權。

使用應用程式角色指派的存取權檢閱和移除現有存取權

如果應用程式具有多個應用程式角色、由多個服務主體表示,或您想要讓使用者要求或被指派應用程式存取權的程式,請繼續進行本文的下一節,以 使用權利管理控管存取權。

現在,現有的使用者已將指派給應用程式角色,您可以設定 Microsoft Entra ID 來 開始檢閱 這些指派。

  1. 在此步驟中,您必須在 或 Identity Governance administrator 角色中Global administrator

  2. 依照指南中的 指示來建立群組或應用程式的存取權檢閱,以建立應用程式的角色指派檢閱。 設定檢閱以在完成時套用結果。 您可以使用適用於身分識別治理的 Microsoft Graph PowerShell Cmdlet 模組中的 Cmdlet,在 PowerShell New-MgIdentityGovernanceAccessReviewDefinition 中建立存取權檢閱。 如需詳細資訊,請參閱 範例

    注意

    如果您在建立存取權檢閱時啟用檢閱決策協助程式,則決策協助程式建議會根據使用者上次使用 Microsoft Entra ID 登入應用程式的時間,以 30 天的間隔期間為基礎。

  3. 存取權檢閱開始時,要求檢閱者提供意見。 根據預設,他們都會收到來自 Microsoft Entra ID 的電子郵件,其中包含存取面板的連結,其中會 檢閱應用程式的存取權。

  4. 檢閱開始之後,您可以監視其進度,並視需要更新核准者,直到 存取權檢閱完成為止。 然後,您可以確認檢閱者拒絕其存取權的使用者已從應用程式移除其存取權。

  5. 如果在建立檢閱時未選取自動套用,則您必須在檢閱完成時套用檢閱結果。

  6. 等候檢閱的狀態變更為 [已套用結果]。 您應該會在幾分鐘內看到遭到拒絕的使用者,如果有的話,其應用程式角色指派會被移除。

  7. 套用結果之後,Microsoft Entra ID 將會開始取消布建來自應用程式的拒絕使用者。 根據布建使用者需要多久時間的指引,等候 Microsoft Entra 布建開始取消布建遭拒絕的使用者。 透過入口網站或 Graph API 監視布建狀態,以確保所有拒絕的使用者都已成功移除。

    如果您沒有看到取消布建的使用者,請檢查 疑難解答指南,以瞭解未布建的使用者。 如果您在布建狀態中看到錯誤,且布建至內部部署應用程式,請檢查 內部部署應用程式佈建的疑難解答指南。

現在您已擁有確保已檢閱現有存取權的基準,接下來您可以在下一節中繼續設定權利管理,以啟用新的存取要求。

使用權利管理控管存取權

在其他情況下,例如想要讓每個應用程式角色有不同的檢閱者、應用程式是由多個服務主體表示,或者您想要讓使用者要求或獲指派應用程式存取權的程式,然後您可以使用每個應用程式角色的存取套件來設定 Microsoft Entra ID。 每個存取套件都可以有一個原則,以定期檢閱對該存取套件所做的指派。 建立存取套件和原則之後,您就可以將具有現有應用程式角色指派的使用者指派給存取套件,以便透過存取套件檢閱其指派。

在本節中,您將設定 Microsoft Entra 權利管理,以檢閱包含應用程式角色指派的存取套件指派,並設定其他原則,讓使用者可以要求存取應用程式的角色。

  1. 在此步驟中,您必須在 或 角色中Global administrator,或委派為目錄建立者和應用程式的擁有Identity Governance administrator者。
  2. 如果您還沒有應用程式控管案例的目錄, 請在 Microsoft Entra 權利管理中建立目錄 。 您可以使用 PowerShell 腳本來 建立每個目錄
  3. 藉由新增應用程式,以及應用程式所依賴的任何 Microsoft Entra 群組,將必要資源填入目錄, 做為該目錄中的資源。 您可以使用 PowerShell 腳稿, 將每個資源新增至目錄
  4. 針對每個應用程式,以及每個應用程式角色或群組, 建立包含該角色或群組作為其資源的存取套件 。 在設定這些存取套件的這個階段,請將每個存取套件 中的第一個存取套件指派原則設定為直接指派的原則,讓只有系統管理員可以建立該原則的指派、設定現有使用者的存取權檢閱需求,如此一來,他們就不會無限期地保留存取權。 如果您有許多存取套件,您可以使用 PowerShell 腳本在 目錄中建立每個存取套件。
  5. 針對每個存取套件,將該對應角色或該群組成員中的應用程式現有使用者指派給存取套件及其直接指派原則。 您可以使用 Microsoft Entra 系統管理中心,或透過 Graph 或 PowerShell 大量指派使用者給存取套件。
  6. 如果您已在存取套件指派原則中設定存取權檢閱,則當存取權檢閱啟動時,請要求檢閱者提供輸入。 根據預設,他們都會收到來自 Microsoft Entra ID 的電子郵件,其中包含存取面板的連結,其中會檢閱存取套件指派。 檢閱完成後,您應該會看到拒絕的使用者,如果有的話,會在幾分鐘內移除其應用程式角色指派。 之後,Microsoft Entra ID 將會開始取消布建來自應用程式的拒絕使用者。 根據布建使用者需要多久時間的指引,等候 Microsoft Entra 布建開始取消布建遭拒絕的使用者。 透過入口網站或 Graph API 監視布建狀態,以確保所有拒絕的使用者都已成功移除。
  7. 如果您有 職責需求的 區隔,請為存取套件設定不相容的存取套件或現有群組。 如果您的案例需要能夠覆寫職責分離檢查,您也可以 針對這些覆寫案例設定其他存取套件。
  8. 如果您想要允許還沒有存取權的使用者要求存取權,請在每個存取套件中建立額外的存取套件指派原則讓使用者要求存取權。在該原則中設定核准和週期性存取權檢閱需求。

下一步