Public/Get-PIMRole.ps1
<# .SYNOPSIS Gets all Entra ID PIM roles for the signed-in user using Microsoft Graph API. .DESCRIPTION Stores eligible PIM roles in userprofile for use in "Request-PIMActivation" .EXAMPLE Get-PIMRole -Tenant "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" Activate all roles .PARAMETER TenantId Specifies the Tenant Id .NOTES Inspiration: Sankara Narayanan M S Link: https://github.com/SankaraHQ/PIM-AutoActivator .COMPONENT TrustyTools #> function Get-PIMRole { [CmdletBinding()] param ( [Parameter(Mandatory = $true, HelpMessage = 'Tenant Id is required')] [ValidateNotNullOrEmpty()] [string]$TenantId ) BEGIN { $PIMPath = Join-Path -Path (Split-Path $Profile) -ChildPath "PIMs" New-Item -Path $PIMPath -ItemType Directory -ErrorAction SilentlyContinue | Out-Null $EligiblePIMRoles = New-Object System.Collections.Generic.List[System.Object] } PROCESS { # Connect to Graph try { Connect-MgGraph -TenantId $tenantId -Scopes "RoleEligibilitySchedule.Read.Directory, RoleManagement.ReadWrite.Directory, RoleManagement.Read.Directory, RoleManagement.Read.All, RoleEligibilitySchedule.ReadWrite.Directory" -NoWelcome -ErrorAction Stop } catch { Write-Error "Unable to connect to MS Graph" Write-Error $_.Exception.Message break } # Get user id $MgContext = Get-MgContext if ( $MgContext ) { Write-Information "`nSuccessfully connected to $($MgContext.AppName)" try { $CurrentUser = Get-MgUser -UserId $MgContext.Account -ErrorAction Stop } catch { Write-Error "Unable to fetch users id" Write-Error $_.Exception.Message } } else { Write-Error "Unable to connect to MS Graph" break } # Get all role definitions try { Write-Information "Getting all role definitions..." $AllRoleDefinitions = Get-MgRoleManagementDirectoryRoleDefinition -ErrorAction Stop } catch { Write-Error $_.Exception.Message } # Get eligible roles try { Write-Information "Getting eligible roles for $($CurrentUser.UserPrincipalName)..." $EligibleRoles = Get-MgRoleManagementDirectoryRoleEligibilityScheduleInstance -Filter "principalId eq '$($CurrentUser.Id)'" -ErrorAction Stop } catch { Write-Error $_.Exception.Message } # Create nice file foreach ( $EligibleRole in $EligibleRoles ) { $RoleDefinition = $AllRoleDefinitions | Where-Object { $_.Id -eq $EligibleRole.RoleDefinitionId } $CleanDefinition = [PSCustomObject]@{ TenantId = $TenantId UserPrincipalName = $CurrentUser.UserPrincipalName DisplayName = $CurrentUser.DisplayName PrincipalId = $EligibleRole.PrincipalId AppScopeId = $EligibleRole.AppScopeId DirectoryScopeId = $EligibleRole.DirectoryScopeId Id = $EligibleRole.Id RoleDefinitionId = $EligibleRole.RoleDefinitionId EndDateTime = $EligibleRole.EndDateTime MemberType = $EligibleRole.MemberType RoleEligibilityScheduleId = $EligibleRole.RoleEligibilityScheduleId StartDateTime = $EligibleRole.StartDateTime Description = $RoleDefinition.Description RoleName = $RoleDefinition.DisplayName IsBuiltIn = $RoleDefinition.IsBuiltIn } $EligiblePIMRoles.Add( $CleanDefinition ) } $EligiblePIMRoles | Select-Object -Property RoleName, Description } END { $EligiblePIMRoles | ConvertTo-Json | Out-File -FilePath ( Join-Path -Path $PIMPath -ChildPath eligible_roles.json ) -Force } } |