pwsh/dev/functions/processApplications.ps1 (123 lines of code) (raw):
function processApplications {
Write-Host 'Processing Service Principals - Applications'
$script:servicePrincipalsOfTypeApplication = $htServicePrincipals.Keys.where( { $htServicePrincipals.($_).servicePrincipalType -eq 'Application' -and $htServicePrincipals.($_).appOwnerOrganizationId -eq $azAPICallConf['checkContext'].Subscription.TenantId } )
if ($azAPICallConf['htParameters'].userType -eq 'Guest') {
#checking if Guest has enough permissions
$app4Test = $htServicePrincipals.($servicePrincipalsOfTypeApplication[0])
$currentTask = "getApp Test $($app4Test.appId)"
$uri = "$($azAPICallConf['azAPIEndpointUrls'].MicrosoftGraph)/v1.0/applications?`$filter=appId eq '$($app4Test.appId)'"
$method = 'GET'
$testGetApplication = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -currentTask $currentTask
if ($testGetApplication -eq 'skipApplications') {
$skipApplications = $true
Write-Host ' Guest account does not have enough permissions, skipping Applications (Secrets & Certificates)'
}
}
if (-not $skipApplications) {
$startSPApp = Get-Date
$currentDateUTC = (Get-Date).ToUniversalTime()
$script:arrayApplicationRequestResourceNotFound = [System.Collections.ArrayList]::Synchronized((New-Object System.Collections.ArrayList))
$ThrottleLimitThis = $ThrottleLimit * 2
$batchSize = [math]::ceiling($servicePrincipalsOfTypeApplication.Count / $ThrottleLimitThis)
Write-Host "Optimal batch size: $($batchSize)"
$counterBatch = [PSCustomObject] @{ Value = 0 }
$servicePrincipalsOfTypeApplicationBatch = ($servicePrincipalsOfTypeApplication) | Group-Object -Property { [math]::Floor($counterBatch.Value++ / $batchSize) }
Write-Host "Processing data in $($servicePrincipalsOfTypeApplicationBatch.Count) batches"
$servicePrincipalsOfTypeApplicationBatch | ForEach-Object -Parallel {
#region UsingVARs
$currentDateUTC = $using:currentDateUTC
#fromOtherFunctions
$azAPICallConf = $using:azAPICallConf
$scriptPath = $using:ScriptPath
#Array&HTs
$arrayApplicationRequestResourceNotFound = $using:arrayApplicationRequestResourceNotFound
$htAppDetails = $using:htAppDetails
$htServicePrincipals = $using:htServicePrincipals
#endregion UsingVARs
foreach ($entry in $_.Group) {
$sp = $htServicePrincipals.($entry)
$currentTask = "getApp $($sp.appId)"
$uri = "$($azAPICallConf['azAPIEndpointUrls'].MicrosoftGraph)/v1.0/applications?`$filter=appId eq '$($sp.appId)'"
$method = 'GET'
$getApplication = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -currentTask $currentTask
if ($getApplication -eq 'Request_ResourceNotFound') {
$null = $script:arrayApplicationRequestResourceNotFound.Add([PSCustomObject]@{
appId = $sp.appId
})
}
else {
if (($getApplication).Count -eq 0) {
Write-Host "$($sp.appId) no data returned / seems non existent?"
}
else {
$script:htAppDetails.($sp.id) = @{
servicePrincipalType = $sp.servicePrincipalType
spGraphDetails = $sp
appGraphDetails = $getApplication
}
$appPasswordCredentialsCount = ($getApplication.passwordCredentials).count
if ($appPasswordCredentialsCount -gt 0) {
$script:htAppDetails.($sp.id).appPasswordCredentialsCount = $appPasswordCredentialsCount
$appPasswordCredentialsExpiredCount = 0
$appPasswordCredentialsGracePeriodExpiryCount = 0
$appPasswordCredentialsExpiryOKCount = 0
$appPasswordCredentialsExpiryOKMoreThan2YearsCount = 0
foreach ($appPasswordCredential in $getApplication.passwordCredentials) {
$passwordExpiryTotalDays = (New-TimeSpan -Start $currentDateUTC -End $appPasswordCredential.endDateTime).TotalDays
if ($passwordExpiryTotalDays -lt 0) {
$appPasswordCredentialsExpiredCount++
}
elseif ($passwordExpiryTotalDays -lt $AADServicePrincipalExpiryWarningDays) {
$appPasswordCredentialsGracePeriodExpiryCount++
}
else {
if ($passwordExpiryTotalDays -gt 730) {
$appPasswordCredentialsExpiryOKMoreThan2YearsCount++
}
else {
$appPasswordCredentialsExpiryOKCount++
}
}
}
$script:htAppDetails.($sp.id).appPasswordCredentialsExpiredCount = $appPasswordCredentialsExpiredCount
$script:htAppDetails.($sp.id).appPasswordCredentialsGracePeriodExpiryCount = $appPasswordCredentialsGracePeriodExpiryCount
$script:htAppDetails.($sp.id).appPasswordCredentialsExpiryOKCount = $appPasswordCredentialsExpiryOKCount
$script:htAppDetails.($sp.id).appPasswordCredentialsExpiryOKMoreThan2YearsCount = $appPasswordCredentialsExpiryOKMoreThan2YearsCount
}
$appKeyCredentialsCount = ($getApplication.keyCredentials).count
if ($appKeyCredentialsCount -gt 0) {
$script:htAppDetails.($sp.id).appKeyCredentialsCount = $appKeyCredentialsCount
$appKeyCredentialsExpiredCount = 0
$appKeyCredentialsGracePeriodExpiryCount = 0
$appKeyCredentialsExpiryOKCount = 0
$appKeyCredentialsExpiryOKMoreThan2YearsCount = 0
foreach ($appKeyCredential in $getApplication.keyCredentials) {
$keyCredentialExpiryTotalDays = (New-TimeSpan -Start $currentDateUTC -End $appKeyCredential.endDateTime).TotalDays
if ($keyCredentialExpiryTotalDays -lt 0) {
$appKeyCredentialsExpiredCount++
}
elseif ($keyCredentialExpiryTotalDays -lt $AADServicePrincipalExpiryWarningDays) {
$appKeyCredentialsGracePeriodExpiryCount++
}
else {
if ($keyCredentialExpiryTotalDays -gt 730) {
$appKeyCredentialsExpiryOKMoreThan2YearsCount++
}
else {
$appKeyCredentialsExpiryOKCount++
}
}
}
$script:htAppDetails.($sp.id).appKeyCredentialsExpiredCount = $appKeyCredentialsExpiredCount
$script:htAppDetails.($sp.id).appKeyCredentialsGracePeriodExpiryCount = $appKeyCredentialsGracePeriodExpiryCount
$script:htAppDetails.($sp.id).appKeyCredentialsExpiryOKCount = $appKeyCredentialsExpiryOKCount
$script:htAppDetails.($sp.id).appKeyCredentialsExpiryOKMoreThan2YearsCount = $appKeyCredentialsExpiryOKMoreThan2YearsCount
}
}
}
}
} -ThrottleLimit ($ThrottleLimitThis)
$endSPApp = Get-Date
Write-Host "Processing Service Principals - Applications duration: $((New-TimeSpan -Start $startSPApp -End $endSPApp).TotalMinutes) minutes ($((New-TimeSpan -Start $startSPApp -End $endSPApp).TotalSeconds) seconds)"
}
}