azure - 如何通过 PowerShell 使用 azure-AD 模块导出分配给 azure 应用程序注册的委派权限

标签 azure powershell azure-active-directory microsoft-graph-api azure-ad-graph-api

已创建自定义 PowerShell 脚本来导出我的所有 Azure 注册应用 API 应用程序权限委派权限。我的一些应用的 API 权限类型 等于委托(delegate)应用程序。我按照这个问题 Similar question 中回答的分步指南进行操作。它仅针对单个应用程序显示,在我的例子中是多个应用程序。

什么有效,什么无效

创建的脚本能够导出分配给任何应用注册的应用程序权限,但无法导出委派权限。该脚本返回时没有错误,但我没有获得创建并填充了具有委派权限(包括权限信息)的应用的委派权限的 csv。

我尝试仅单独导出委派权限,但仍然存在同样的问题,csv 不是使用数据创建的。

我的主要目标是能够检索分配给我的所有应用注册的所有 API 权限(应用程序权限委派权限)并将其导出到 csv 文件中我使用 Azure-AD 模块。

下面是脚本。

# Add your azure ad global administrator password here
$password_ = ""
$password = ConvertTo-SecureString $password_ -AsPlainText -Force

# Add your azure ad global administrator login UPN
$upn = ""

$export_application_permission = "C:\temp\application_perms.csv"
$export_delegated_permission = "C:\temp\delegated_perms.csv"

# Automated login to azure ad
$AppCredential = New-Object System.Management.Automation.PSCredential($upn, $password)
Connect-azureAD -Credential $AppCredential

$apps = Get-AzureADApplication -All $true
foreach ($app in $apps){

    $perms = $app.requiredResourceAccess
    foreach($perm in $perms){

        # Grab all the ResourceAppId from requiredResourceAccess array
        $res_app_id = $perm.ResourceAppId
        foreach($res_access in $perm.ResourceAccess){
            # Check if the resourceAccess Type is Role, which means its application permissions
            if($res_access.Type -eq "Role"){


                # Grab the resource id
                $res_ac = $res_access.Id
                
                # Calling azure-AD module
                Connect-azureAD -Credential $AppCredential

                # Grab all applications assigned application permissions only
                $sps = Get-AzureADServicePrincipal -All $true | Where-Object {$_.AppId -eq $res_app_id}

                foreach($sp in $sps){

                # Grab application permissions details now
                $roles = $sp.AppRoles | Where-Object {$_.Id -eq $res_ac}
                
                
                foreach($rol in $roles.value){

                $record = New-Object PSObject
                $record | Add-Member NoteProperty -Name "Application Display Name" -Value $app.displayName
                $record | Add-Member NoteProperty -Name "Permission Type" -Value $res_access.Type
                $record | Add-Member NoteProperty -Name "Permission Value" -Value $rol

                $record | Export-CSV $export_application_permission -NoTypeInformation -Append

                }

                }
                # Check if the resourceAccess Type is Scope, which means its delegated permissions
            }elseif ($res_access.Type -eq "Scope") {
                <# Action when this condition is true #>
                $res_ac = $res_access.Id
                Connect-azureAD -Credential $AppCredential
                $sps = Get-AzureADServicePrincipal -All $true | Where-Object {$_.AppId -eq $res_app_id}

                foreach($sp in $sps){

                # Grab delegated permissions details now
                $delegated_perms = $sp.oauth2PermissionScopes | Where-Object {$_.Id -eq $res_ac}
                

                foreach($rol in $delegated_perms.value){

                $record = New-Object PSObject
                $record | Add-Member NoteProperty -Name "Application Display Name" -Value $app.displayName
                $record | Add-Member NoteProperty -Name "Permission Type" -Value $res_access.Type
                $record | Add-Member NoteProperty -Name "Permission Value" -Value $rol

                $record | Export-CSV $export_delegated_permission -NoTypeInformation -Append

                }

                }
            } else {
                Write-host "Retreating........."
            }                 
        }  
    }

}


应用程序权限的 csv 文件输出如下所示。 enter image description here

我期望所有具有委托(delegate)权限的应用程序都有类似的输出

我做错了什么或遗漏了什么?

最佳答案

以下是我在跟踪所有权上下文时获取所有应用程序的所有应用程序权限/委派权限的方法。

这将生成类似于示例 CSV 输出的内容。

代码

Connect-azureAD 

$Apps = Get-AzureADApplication -All $true
$ServicePrincipals = Get-AzureADServicePrincipal -All $true

$export_application_permission = ""
$export_delegated_permission = "C:\temp\delegated_perms.csv"


$PermissionsList = $ServicePrincipals.Oauth2Permissions | Select-Object  Id, Value
$RolesList = $ServicePrincipals.AppRoles | Select-Object Id, Value



$app.RequiredResourceAccess
$Data = Foreach ($App in $Apps) {
    foreach ($Access in $App.RequiredResourceAccess) {
        foreach ($Permission in $Access.ResourceAccess) {

            switch ($Permission.Type) {
                'Scope' {
                    $PermissionName = ($PermissionsList | Where Id -eq $Permission.Id).Value 
                    break
                }
                'Role' {
                    $PermissionName = ($RolesList | Where Id -eq $Permission.Id).Value 
                    break
                }
            }

            if (!$PermissionName) { $PermissionName = $Permission.Id }
            
            [PSCustomObject]@{
                'Application Display Name' = $App.DisplayName
                'Permission Type'          = $Permission.Type
                'Permission Value'         = $PermissionName
            }
        }
    }
}

$Data | Where-Object 'Permission Type' -eq Role | Export-Csv -Path $export_application_permission -NoTypeInformation
$Data | Where-Object 'Permission Type' -eq Scope | Export-Csv -Path $export_delegated_permission -NoTypeInformation

警告

仅检查权限值(例如:User.Read.All)可能会产生误导,因为自定义应用程序也公开同名的权限,会导致您获得权限名称,但您不知道该权限背后是哪个 API(例如:它是图形、自定义应用程序还是共享某些权限名称的另一个 Microsoft API 等...)

关于原始代码的一些注释

您的原始示例存在一些效率低下的问题。

  • 连接-AzureAd。您只需要在进入循环之前连接一次,而不是像您那样在多个点连接。
  • Get-AzureADServicePrincipal 可以在循环之前调用一次,同时获取所有 Azure AD 应用程序。在循环中,您只需从初始结果中选择所需的内容,而无需一次又一次调用 cmdlet。
  • 导出 CSV - 附加。我不鼓励使用它,而是在循环之后使用它,这样您就可以访问一次文件,而不是数十次、数百次或数千次。
  • 从性能角度来看,使用哈希表转换为 PSCustomObject 比创建 PSObject 并使用 Add-member 更快(而且更干净)
# This
$record = [PSCustomObject]@{
    "Application Display Name" = $app.displayName
    "Permission Type"          = $res_access.Type
    "Permission Value"         = $rol
}

#Instead of this
$record = New-Object PSObject
$record | Add-Member NoteProperty -Name "Application Display Name" -Value $app.displayName
$record | Add-Member NoteProperty -Name "Permission Type" -Value $res_access.Type
$record | Add-Member NoteProperty -Name "Permission Value" -Value $rol

关于azure - 如何通过 PowerShell 使用 azure-AD 模块导出分配给 azure 应用程序注册的委派权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72847582/

相关文章:

powershell - 创建自定义 PSObject PowerShell 2.0

azure - 如何使用 Application Insights 在将新资源添加到资源组时创建警报

azure - 如果我的 Web api/azure 函数要处理大量请求,我应该遵循什么 Azure 架构?

sql-server - MS Access 在测试服务器和生产 SQL Server 之间切换连接

azure - Azure Sql 中的 Active Directory(AD) 身份验证不起作用

powershell - Powershell错误处理和记录

azure - 与外部客户共享文件和数据

powershell - 使用 Powershell 脚本启动的批处理文件设置环境变量

ruby-on-rails - Rails 中的 "Not found. Authentication passthru(Azure)"

azure - 使用 AZ CLI 创建 Azure 应用程序注册时出现问题