共用方式為


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

有三種常見的情況,在您搭配 Microsoft Entra ID 控管功能 (例如存取權檢閱) 來使用應用程式之前,必須先在 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 ID 中描述的應用程式相關聯,則就算使用者與應用程式的關聯性源自別處,Microsoft Entra ID 還是可以追蹤可存取應用程式的使用者。 例如,關聯性可能源自應用程式的資料庫或目錄。

Microsoft Entra ID 知道使用者的指派之後,就可以將最新消息傳送至應用程式的資料存放區。 最新消息包括該使用者的屬性變更,或使用者超出應用程式的範圍。

應用程式並非使用 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 ID 存取權的網路區段或系統上。 因此,您可能需要從該目錄或資料庫擷取使用者清單,然後當作檔案傳輸至可用於 Microsoft Entra 互動的另一個系統。

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

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

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

本節適用於以 LDAP 目錄為基礎資料存放區的應用程式,其中使用者未向 Microsoft Entra ID 進行驗證。 許多 LDAP 目錄 (例如 Active Directory) 都包含可輸出使用者清單的命令。

  1. 識別該目錄中哪些使用者屬於應用程式的使用者。 此選擇取決於應用程式的設定。 對於某些應用程式,任何存在於 LDAP 目錄中的使用者都是有效的使用者。 其他應用程式可能規定使用者必須有特定屬性,或必須是該目錄中群組的成員。

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

    例如,此命令會在現行檔案系統目錄中產生 CSV 檔案,其中包含 LDAP 目錄中每個人的 userPrincipalName 屬性:

    $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 匯入和匯出精靈] 來匯出資料庫的部分。 如果您的資料庫沒有公用程式,您可以搭配 PowerShell 使用 ODBC 驅動程式,如下一節所述。

  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 連接器主機將使用者佈建至該應用程式。 如果您尚未設定佈建代理程式,請使用該指南來建立您將在本節中使用的 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 的資料庫資料表中,而資料表有資料行 nameemail,請輸入下列命令:

    $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 雲端識別服務收集現有使用者

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

  1. 如果此為試用版,請登入您的 SAP 雲端識別服務管理員主控台,https://<tenantID>.accounts.ondemand.com/adminhttps://<tenantID>.trial-accounts.ondemand.com/admin
  2. 瀏覽至 [使用者 & 授權]>[匯出使用者]
  3. 選取在 SAP 中比對 Microsoft Entra 使用者所需的所有屬性。 這包括 SCIM IDuserNameemails,以及您可能在 SAP 系統中使用的其他屬性。
  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 時,您必須是全域管理員角色,才能在租用戶中使用 Microsoft Graph PowerShell。 後續的互動可以使用特殊權限較低的角色,例如:

  • 使用者管理員 (如果您預期會建立新的使用者)。
  • 應用程式管理員或 Identity Governance 管理員 (如果您只是管理應用程式角色指派)。
  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 ID:

    $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 雲端識別服務取得的檔案名為 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. 選擇 users.csv 檔案的資料行,用以比對 Microsoft Entra ID 中的使用者屬性。

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

    $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 ID 來找出使用者,而該使用者有一個屬性的值符合來源檔案中的每一筆記錄。 如果檔案中有許多使用者從來源 SAP 雲端識別服務、資料庫或目錄取得,此指令碼可能需要幾分鐘的時間才能完成。 如果您在 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 雲端識別服務、資料庫或目錄中是否有任何使用者因為錯誤或遺漏相符項目而無法位於 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 中也有使用者,則您必須調查哪些記錄不相符及原因。

    例如,Microsoft Entra ID 中可能變更某人的電子郵件地址和 userPrincipalName,但在應用程式的資料來源中未更新其對應的 mail 屬性。 或者,使用者可能已離開組織,但仍留在應用程式的資料來源中。 或者,應用程式的資料來源中可能有廠商或超級管理員帳戶未對應至 Microsoft Entra ID 中的任何特定人員。

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

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

    請務必為這些新使用者填入必要的屬性,以供 Microsoft Entra ID 稍後比對應用程式中的現有使用者,以及 Microsoft Entra ID 要求的屬性,包括 userPrincipalNamemailNicknamedisplayNameuserPrincipalName 在目錄中的所有使用者中必須是唯一的。

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

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

    然後,您可以使用此指令碼,為 SAP 雲端識別服務、資料庫或目錄中,與 Microsoft Entra ID 中使用者不相符的項目建立 Microsoft Entra 使用者。 請注意,您可能需要修改此指令碼,以新增組織所需的其他 Microsoft Entra 屬性,或如果 $azuread_match_attr_name 既不是 mailNickname 也不是 userPrincipalName,才能提供該 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 ID 中可能未全部指派給應用程式的角色。 因此,後續步驟是查看哪些使用者尚未指派給應用程式角色。

  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 雲端識別服務或支援 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 ID 中虛刪除,或遭到封鎖而無法登入時,Microsoft Entra 佈建會更新對應至 isSoftDeleted 的屬性。 如果未對應任何屬性,則後來從應用程式角色取消指派的使用者會繼續存在於應用程式的資料存放區中。

  6. 如果已為應用程式啟用佈建,請檢查應用程式佈建是否未處於隔離狀態。 繼續之前,請解決造成隔離的任何問題。

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

若要讓 Microsoft Entra ID 符合應用程式中的使用者與 Microsoft Entra ID 中的使用者,您必須在 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. 如果應用程式服務主體已設定為佈建,且服務主體的 [佈建狀態] 為 [關閉],請將其設定為 [開啟]。 您也可以使用圖形 API 開始佈建。

  4. 根據佈建使用者需要多久的時間的指引,等候 Microsoft Entra 佈建比對應用程式的現有使用者與剛指派的使用者。

  5. 透過入口網站或圖形 API 監視佈建狀態,以確保所有使用者都已成功比對。

    如果沒有看到正在佈建使用者,請參閱未佈建使用者的疑難排解指南。 如果您在佈建狀態中看到錯誤,而且正在佈建至內部部署應用程式,請參閱內部部署應用程式佈建的疑難排解指南

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

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

選取適當的檢閱者

當您建立每個存取權檢閱時,管理員可以選擇一或多個檢閱者。 檢閱者可以藉由選擇使用者繼續存取資源或將其移除,來施行檢閱。

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

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

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

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

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

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

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

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

  1. 在此步驟中,您必須位於全域管理員或身分識別控管系統管理員角色中。

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

    注意

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

  3. 存取權檢閱開始時,要求檢閱者提供意見。 依預設,使用者會各自收到來自 Microsoft Entra ID 的電子郵件,其中的連結可連至存取面板,以檢閱應用程式的存取權

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

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

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

  7. 套用結果之後,Microsoft Entra ID 將會開始從應用程式中取消佈建遭到拒絕的使用者。 根據佈建使用者所需時間的指導,請等待 Microsoft Entra 佈建開始取消佈建遭到拒絕的使用者。 透過入口網站或圖形 API 監視佈建狀態,以確保成功移除所有遭到拒絕的使用者。

    如果沒有看到正在取消佈建使用者,請參閱未佈建使用者的疑難排解指南。 如果您在佈建狀態中看到錯誤,而且正在佈建至內部部署應用程式,請參閱內部部署應用程式佈建的疑難排解指南

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

使用權利管理控管存取權

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

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

  1. 針對此步驟,您必須具備全域管理員、身分識別控管管理員角色,或被委派為目錄建立者和應用程式的擁有者。
  2. 如果您還沒有目錄可用於應用程式控管案例,請在 Microsoft Entra 權利管理中建立目錄。 您可以使用 PowerShell 指令碼來建立每個目錄
  3. 透過新增應用程式,以及應用程式所依賴的任何 Microsoft Entra 群組,以必要資源填入目錄,作為該目錄中的資源。 您可以使用 PowerShell 指令碼將每個資源新增至目錄
  4. 對於每個應用程式,以及每個應用程式角色或群組,建立存取套件,其中包含該角色或群組作為其資源。 在設定這些存取套件的這個階段,請將每個存取套件中的第一個存取套件指派原則設定為直接指派的原則,以便只有系統管理員可以建立該原則的指派、設定現有使用者的存取權檢閱需求 (若有),使其不會無限期地保留存取權。 如果您有許多存取套件,您可以使用 PowerShell 指令碼以在目錄中建立每個存取套件
  5. 對於個別存取套件,將對應角色中應用程式的現有使用者或該群組之成員指派給存取套件及其直接指派原則。 您可以使用 Microsoft Entra 系統管理中心,或透過 Graph 或 PowerShell 大量直接指派使用者給存取套件。
  6. 如果您已在存取套件指派原則中設定存取權檢閱,則當存取權檢閱啟動時,要求檢閱者提供輸入。 依預設,使用者會各自收到來自 Microsoft Entra ID 的電子郵件,其中的連結可連至存取面板,以檢閱存取套件指派。 檢閱完成後,您應該會看到遭到拒絕的使用者 (若有的話),在幾分鐘內移除其應用程式角色指派。 接下來,Microsoft Entra ID 將會開始從應用程式中取消佈建遭到拒絕的使用者。 根據佈建使用者所需時間的指導,請等待 Microsoft Entra 佈建開始取消佈建遭到拒絕的使用者。 透過入口網站或圖形 API 監視佈建狀態,以確保成功移除所有遭到拒絕的使用者。
  7. 如果您有職責區分需求,請為存取套件設定不相容的存取套件或現有群組。 如果您的案例需要覆寫職責區分檢查的功能,您也可以為這些覆寫案例設定其他存取套件
  8. 如果您想要允許尚未擁有存取權的使用者要求存取權,則在每個存取套件中,為使用者建立其他存取套件指派原則以要求存取權。在該原則中設定核准和定期存取權檢閱需求。

下一步