管理应用

应用需要先在 Microsoft Entra ID 中注册,Microsoft 标识平台才能授权该应用访问存储在 Microsoft Entra 或 Microsoft 365 租户中的数据。 此条件适用于你自行开发的应用、你的租户拥有的应用,或者你通过有效订阅访问的应用。

应用的许多设置都记录为可以使用 Microsoft Entra PowerShell 访问、更新或删除的对象。 这些对象包括应用程序、服务主体和应用角色分配。

本文介绍如何使用 Microsoft Entra PowerShell 管理应用注册和服务主体对象。 它介绍如何注册应用程序、配置属性、分配权限和管理应用所有权。

先决条件

若要使用 Microsoft Entra PowerShell 管理应用,需要:

注册应用程序

以下请求通过仅指定所需 displayName 属性来创建应用。

Connect-Entra -Scopes 'Application.ReadWrite.All'
New-EntraApplication -DisplayName 'My new application'

DisplayName        Id                                   AppId                                SignInAudience PublisherDomain
-----------        --                                   -----                                -------------- -----------
My new application aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb bbbbbbbb-1111-2222-3333-cccccccccccc MyOrg

该应用程序被分配了一个 ID,该 ID 对租户中的应用而言是唯一的;同时还分配了一个 appId,该 appId 在 Microsoft Entra 生态系统中是全局唯一的。

为应用程序创建服务主体

Connect-Entra -Scopes 'Application.ReadWrite.All'
$myApp = Get-EntraApplication -Filter "DisplayName eq 'My new application'"
New-EntraServicePrincipal  -AppId $myApp.AppId -DisplayName 'My new service principal'
DisplayName Id       AppId                                SignInAudience                       ServicePrincipalType
----------- --       -----                                --------------                       --------------------
My new application   bbbbbbbb-1111-2222-3333-cccccccccccc 00001111-aaaa-2222-bbbb-3333cccc4444 MyOrg Application

为应用配置基本属性

可以为应用配置多个属性。 以下示例演示如何更新应用程序的显示名称。

Connect-Entra -Scopes 'Application.ReadWrite.All'
$application = Get-EntraApplication -Filter "DisplayName eq 'My new application'"
Set-EntraApplication -ApplicationId $application.Id -DisplayName 'Contoso application'

也可以使用管道来更新应用程序属性。

Connect-Entra -Scopes 'Application.ReadWrite.All'
Get-EntraApplication -Filter "DisplayName eq 'My new application'" | Set-EntraApplication -DisplayName 'Contoso application'

有关详细信息,请参阅 Set-EntraApplication

将应用登录限制为仅允许已分配的标识登录

使用 Microsoft Entra PowerShell 将应用登录限制为仅分配的标识,可确保只有授权用户才能访问应用程序、增强安全性和控制。

Connect-Entra -Scopes 'Application.ReadWrite.All'
$application = Get-EntraApplication -Filter "DisplayName eq 'My new application'"
Set-EntraServicePrincipal -ServicePrincipalId $application.Id -AppRoleAssignmentRequired $true

向应用分配权限

可以通过Microsoft Entra 管理中心或使用 Microsoft Entra PowerShell 向应用分配权限。 在 PowerShell 中,更新应用 requiredResourceAccess 的属性,包括现有权限和新权限。 如果仅传递新的权限,则会移除任何未获授权的现有权限。

分配权限并不会自动将这些权限授予应用。 仍必须使用Microsoft Entra 管理中心授予管理员同意。

Connect-Entra -Scopes 'Application.ReadWrite.All'
$application = Get-EntraApplication -Filter "DisplayName eq 'My new application'"
$requiredResourceAccess = @(
    @{resourceAppId    = '00000003-0000-0000-c000-000000000000'
        resourceAccess = @(
            @{
                id   = 'c79f8feb-a9db-4090-85f9-90d820caa0eb'
                type = 'Scope'
            }
            @{
                id   = '9a5d68dd-52b0-4cc2-bd40-abcf44ac3a30'
                type = 'Role'
            } )
    })
Set-EntraApplication -ApplicationId $application.Id -RequiredResourceAccess $requiredResourceAccess 

管理所有者

检索服务主体的所有者

Connect-Entra -Scopes 'Application.ReadWrite.All'
$servicePrincipal = Get-EntraServicePrincipal -Filter "displayName eq 'Helpdesk Application'"
Get-EntraServicePrincipalOwner -ServicePrincipalId $servicePrincipal.Id -All | Select-Object Id, DisplayName, '@odata.type'

或者,使用管道来获取服务主体的所有者。

Get-EntraServicePrincipal -Filter "displayName eq 'Helpdesk Application'" | Get-EntraServicePrincipalOwner | Select-Object Id, DisplayName, '@odata.type'

将所有者分配给服务主体

Connect-Entra -Scopes 'Application.ReadWrite.All', 'Application.ReadWrite.OwnedBy'
$servicePrincipal = Get-EntraServicePrincipal -Filter "displayName eq 'Helpdesk Application'"
$owner = Get-EntraUser -UserId '[email protected]'
Add-EntraServicePrincipalOwner -ServicePrincipalId $servicePrincipal.Id -OwnerId $owner.Id

此示例演示如何向服务主体添加所有者。

  • -ServicePrincipalId - 指定要向其添加所有者的服务主体的唯一标识符(ObjectId)。
  • -OwnerId - 指定要添加为指定服务主体所有者的用户或组的唯一标识符(ObjectId)。

获取没有用户分配的所有应用程序的列表

若要获取不需要用户分配的所有应用程序的列表,请使用以下命令。

Connect-Entra -Scopes 'Application.ReadWrite.All'
Get-EntraServicePrincipal -All | Where-Object {$_.appRoleAssignmentRequired -ne 'True'}
DisplayName                          Id                                     AppId                                  SignInAudience       ServicePrincipalType
-----------------------------------  -----------------------------------    ---------------------------------      -----------------    ------------------
Microsoft password reset service     00aa00aa-bb11-cc22-dd33-44ee44ee44ee   93625bc8-bfe2-437a-97e0-3d0060024faa   AzureADMultipleOrgs  Application
Microsoft.Azure.SyncFabric           11bb11bb-cc22-dd33-ee44-55ff55ff55ff   00000014-0000-0000-c000-000000000000   AzureADMultipleOrgs  Application
Azure Security Insights              22cc22cc-dd33-ee44-ff55-66aa66aa66aa   98785600-1bb7-4fb9-b9fa-19afe2c8a360   AzureADMultipleOrgs  Application

检索服务主体拥有或创建的对象

服务主体创建的对象

Connect-Entra -Scopes 'Application.Read.All'
$servicePrincipal = Get-EntraServicePrincipal -Filter "displayName eq 'Helpdesk Application'"
Get-EntraServicePrincipalCreatedObject -ServicePrincipalId $servicePrincipal.Id

服务主体拥有的对象

Connect-Entra -Scopes 'Application.Read.All'
$servicePrincipal = Get-EntraServicePrincipal -Filter "displayName eq 'Helpdesk Application'"
Get-EntraServicePrincipalOwnedObject -ServicePrincipalId $servicePrincipal.Id -All | Select-Object Id, DisplayName, '@odata.type'

具有过期机密和证书的应用程序

过期应用程序机密或密码

$expirationThreshold = (Get-Date).AddDays(30)
$appsWithExpiringPasswords = Get-EntraApplication -All | Where-Object { $_.PasswordCredentials } | 
ForEach-Object {
    $app = $_
    $app.PasswordCredentials | Where-Object { $_.EndDate -le $expirationThreshold } | 
    ForEach-Object {
        [PSCustomObject]@{
            DisplayName       = $app.DisplayName
            AppId             = $app.AppId
            SecretDisplayName = $_.DisplayName
            KeyId             = $_.KeyId
            ExpiringSecret    = $_.EndDate
        }
    }
}
$appsWithExpiringPasswords | Format-Table DisplayName, AppId, SecretDisplayName, KeyId, ExpiringSecret -AutoSize

即将过期的证书

$expirationThreshold = (Get-Date).AddDays(30)
$appsWithExpiringKeys = Get-EntraApplication -All | Where-Object { $_.KeyCredentials } | 
ForEach-Object {
    $app = $_
    $app.KeyCredentials | Where-Object { $_.EndDate -le $expirationThreshold } | 
    ForEach-Object {
        [PSCustomObject]@{
            DisplayName            = $app.DisplayName
            AppId                  = $app.AppId
            CertificateDisplayName = $_.DisplayName
            KeyId                  = $_.KeyId
            ExpiringKeys           = $_.EndDate
        }
    }
}
$appsWithExpiringKeys | Format-Table DisplayName, AppId, CertificateDisplayName, KeyId, ExpiringKeys -AutoSize