Get-AadServicePrincipalAccess.ps1


<#
.SYNOPSIS
Gets information for what access a Service Principal/Application has access to.
 
.DESCRIPTION
Gets information for what access a Service Principal/Application has access to.
 
.PARAMETER Id
Provide the Service Principal ID
 
.EXAMPLE
Get-AadServicePrincipalAccess -Id 'Your Application Name, AppId, or Service Principal Object Id'
 
.NOTES
General notes
#>

Set-Alias -Name Get-AadSpAccess -Value Get-AadServicePrincipalAccess
function Get-AadServicePrincipalAccess
{
    param(
        [Parameter(
            mandatory=$true,
            ValueFromPipeline = $true)]
        $Id
    )

    # REQUIRE AadSupport Session
    RequireConnectAadSupport
    # END REGION

    $TenantDomain = $Global:AadSupport.Session.TenantDomain

    $sp = (Get-AadServicePrincipal -Id $Id)
    
    if(-not $sp)
    {
        throw "'$Id' not found in '$TenantDomain'"
    }

    Write-Host "Enterprise App (ServicePrincipal)" -ForegroundColor Yellow
    $sp | Select-Object DisplayName, AppId, ObjectId | Format-Table 

    if($sp.count -gt 1)
    {
        throw "'$Id' query returned more than one result. Please provide a unique Service Principal Identifier"
    }


    Write-Host "++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
    Write-Host "Getting Azure AD Directory Roles assigned to Service Principal..." -ForegroundColor Yellow
    Get-AadServicePrincipalAdminRoles -ObjectId $sp.ObjectId

    Write-Host "++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
    Write-Host "Getting App Roles (Application Permissions) assigned to Service Principal..." -ForegroundColor Yellow
    Get-AadServicePrincipalAppRoles -ObjectId $sp.ObjectId

    Write-Host "++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
    Write-Host "Getting OAuth2PermissionGrants (Delegated Permissions) assigned to Service Principal..." -ForegroundColor Yellow
    Get-AadServicePrincipalGrants -ObjectId $sp.ObjectId

    Write-Host "++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
    Write-Host "Getting Key Vault Access assigned to Service Principal..." -ForegroundColor Yellow
    Get-AadServicePrincipalKeyVaultAccess -ObjectId $sp.ObjectId

    Write-Host "++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
    Write-Host "Getting Azure Roles assigned to Service Principal..." -ForegroundColor Yellow
    Get-AadServicePrincipalAzureRoles -Id $sp.ServicePrincipalNames[0]
}


<#
.SYNOPSIS
#
 
.DESCRIPTION
Long description
 
.PARAMETER ObjectId
Parameter description
 
.EXAMPLE
An example
 
.NOTES
General notes
#>

Set-Alias -Name Get-AadSpAdminRoles -Value Get-AadServicePrincipalAdminRoles
function Get-AadServicePrincipalAdminRoles {
# THIS FUNCTION IS STANDALONE
    param(
        [Parameter(
            mandatory=$true,
            ValueFromPipeline = $true)]
        $ObjectId
    )


    $roles = Get-AzureADDirectoryRole
    $AdminRoleList = @()

    $AadAdminCount = 0
    foreach ($role in $roles) {
        $members = Get-AzureADDirectoryRoleMember -ObjectId $role.ObjectId
        foreach ($member in $members) {
            if($member.ObjectId -eq $ObjectId) {
                $AdminRoleList += [PSCustomObject]@{
                    RoleDisplayName = $role.DisplayName;
                    RoleId = $role.ObjectId;
                }
                $AadAdminCount++
            }
        } 
    }

    # Output Admin Roles
    $AdminRoleList | Format-Table RoleDisplayName, RoleId

    if ($AadAdminCount -eq 0) {
        Write-Host "None"
        Write-Host ""
        return
    }

    Write-Host "To remove a Directory Role... (Example)"
    $ExampleId = $AdminRoleList[0].RoleId
    Write-Host "Remove-AzureADDirectoryRoleMember -ObjectId $ExampleId -MemberId $ObjectId"
    Write-Host ""

}


<#
.SYNOPSIS
#
 
.DESCRIPTION
Long description
 
.PARAMETER ObjectId
Parameter description
 
.EXAMPLE
An example
 
.NOTES
General notes
#>

Set-Alias -Name Get-AadSpGrants -Value Get-AadServicePrincipalGrants
function Get-AadServicePrincipalGrants {
# THIS FUNCTION IS STANDALONE
    param(
        [Parameter(
            mandatory=$true,
            ValueFromPipeline = $true)]
        $ObjectId
    )

    $GrantList = @()

    $grants = Get-AzureADServicePrincipalOAuth2PermissionGrant -ObjectId $ObjectId
    $count = 0
    foreach ($grant in $grants) {
        
        $resource = (Get-AzureADServicePrincipal -ObjectId $grant.ResourceId)

        if ($grant.ConsentType -eq "AllPrincipals") {
            $PrincipalId = "AllPrincipals"
        }
        else {
            $PrincipalId = (Get-AzureAdUser -ObjectId $grant.PrincipalId).UserPrincipalName
        }

        $GrantList += [PSCustomObject]@{
            Resource = $resource.DisplayName;
            PrincipalId = $PrincipalId
            Id = $grant.ObjectId
            Scope = $grant.Scope
        }
        $count++
    }

    # Output App Roles
    $GrantList | Sort-Object Resource | Format-List

    if ($count -eq 0) {
        Write-Host "None"
        Write-Host ""
        return
    }

    Write-Host "To remove a OAuth2 permission grant... (Example)"
    $ExampleId = $GrantList[0].Id
    Write-Host "Remove-AzureADOAuth2PermissionGrant -ObjectId $ExampleId"
    Write-Host ""
    
}


function Get-AadServicePrincipalKeyVaultAccess {
    # THIS FUNCTION IS STANDALONE
    param(
        [Parameter(
            mandatory=$true,
            ValueFromPipeline = $true)]
        $ObjectId
    )

    $subscriptions = Get-AzSubscription -TenantId $Global:AadSupport.Session.TenantId

    $Policies = @()

    $count = 0
    foreach($sub in $subscriptions) {
        
        if($sub.Name -ne "Access to Azure Active Directory")
        {
            Write-Verbose "Checking Subscription '$($sub.Name) (Id:$($sub.id))' "
            Set-AzContext -SubscriptionId $sub.id | Out-Null
            $KeyVaults = Get-AzKeyVault
            foreach($KeyVaultItem in $KeyVaults)
            {
                $KeyVaultName = $KeyVaultItem.VaultName
                Write-Verbose "Checking Key Vault '$KeyVaultName'"
                $kv = Get-AzKeyVault -VaultName $KeyVaultName
                foreach($policy in $kv.AccessPolicies)
                {
                    if($policy.ObjectId -eq $ObjectId)
                    {
                        $CustomResult = [ordered]@{}
                        $CustomResult.KeyVaultName = $KeyVaultName
                        $CustomResult.PermissionsToSecrets = $policy.PermissionsToSecrets
                        $CustomResult.PermissionsToKeys = $policy.PermissionsToKeys
                        $CustomResult.PermissionsToCertificates = $policy.PermissionsToCertificates
                        $CustomResult.PermissionsToStorage = $policy.PermissionsToStorage
                        
                        Write-ObjectToHost $CustomResult
                        $count++
                    }
                }

                if ($count -eq 0) {
                    Write-Host "None"
                    Write-Host ""
                }

                $count = 0
            }
        }
    }
}



function Get-AadServicePrincipalAzureRoles {
    # THIS FUNCTION IS STANDALONE
    param(
        [Parameter(
            mandatory=$true,
            ValueFromPipeline = $true)]
        $Id
    )

    $subscriptions = Get-AzSubscription -TenantId $Global:AadSupport.Session.TenantId

    $Count = 0
    foreach($sub in $subscriptions) {
        
        if($sub.Name -ne "Access to Azure Active Directory")
        {
            Write-Verbose "Checking Subscription '$($sub.Name) (Id:$($sub.id))' "
            Set-AzContext -SubscriptionId $sub.id | Out-Null

            # Get Role Assignments
            $RoleAssignments = Get-AzRoleAssignment -ServicePrincipalName $Id

            # If Role Assignment > Write to screen
            if($RoleAssignments)
            {
                foreach($Role in $RoleAssignments)
                {
                    $CustomResult = [ordered]@{}
                    $CustomResult.Scope = $Role.Scope
                    $CustomResult.RoleName = $Role.RoleDefinitionName
    
                    Write-ObjectToHost $CustomResult 
                }
                
                $Count++
            }
        }
    }

    if($Count = 0)
    {
        Write-Host "None"
        Write-Host ""
    }

    return
}