From f668870413e5cc88bfbbe77503165b3fb5ab1f59 Mon Sep 17 00:00:00 2001 From: Tomas Kracmar Date: Tue, 16 Sep 2025 07:46:50 +0200 Subject: [PATCH] First commit --- .gitignore | 2 + Example/Example.png | Bin 0 -> 75345 bytes Example/Example.xlsx | Bin 0 -> 21040 bytes Invoke-ConditionalAccessDocumentation.ps1 | 810 ++++++++++++++++++++++ LICENSE | 21 + Readme.md | 58 ++ 6 files changed, 891 insertions(+) create mode 100644 .gitignore create mode 100644 Example/Example.png create mode 100644 Example/Example.xlsx create mode 100644 Invoke-ConditionalAccessDocumentation.ps1 create mode 100644 LICENSE create mode 100644 Readme.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f40e857 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +ConditionalAccessDocumentation.csv +ConditionalAccessDocumentation.xlsx \ No newline at end of file diff --git a/Example/Example.png b/Example/Example.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0575507245eff7f396fce73b1855cbd8c311db GIT binary patch literal 75345 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 X8GAWNaEL!@paVXHfUA4SKkoh?F*nfM literal 0 HcmV?d00001 diff --git a/Invoke-ConditionalAccessDocumentation.ps1 b/Invoke-ConditionalAccessDocumentation.ps1 new file mode 100644 index 0000000..15783f4 --- /dev/null +++ b/Invoke-ConditionalAccessDocumentation.ps1 @@ -0,0 +1,810 @@ +<#PSScriptInfo + +.VERSION 1.8.1 + +.GUID 6c861af7-d12e-4ea2-b5dc-56fee16e0107 + +.AUTHOR Nicola Suter + +.TAGS ConditionalAccess, AzureAD, Identity + +.PROJECTURI https://github.com/nicolonsky/ConditionalAccessDocumentation + +.ICONURI https://raw.githubusercontent.com/microsoftgraph/g-raph/master/g-raph.png + +.DESCRIPTION This script documents Azure AD Conditional Access Policies using the latest Microsoft.Graph PowerShell module. + +.SYNOPSIS This script retrieves all Conditional Access Policies and translates Azure AD Object IDs to display names for users, groups, directory roles, locations... + +.EXAMPLE + Connect-MgGraph -Scopes "Application.Read.All", "Group.Read.All", "Policy.Read.All", "RoleManagement.Read.Directory", "User.Read.All" + & .\Invoke-ConditionalAccessDocumentation.ps1 + Generates the documentation and exports the csv to the script directory. +.NOTES + Author: Nicola Suter + Creation Date: 31.01.2022 + Updated: 25.08.2025 +#> + +param( + [switch]$ExportExcel, + [string]$ExcelPath +) +# NOTE: Module requirements are handled programmatically below to allow auto-install. +$RequiredGraphVersion = '2.30.0' +$RequiredGraphModules = @( + 'Microsoft.Graph.Authentication', + 'Microsoft.Graph.Applications', + 'Microsoft.Graph.Identity.SignIns', + 'Microsoft.Graph.Groups', + 'Microsoft.Graph.DirectoryObjects', + 'Microsoft.Graph.Identity.DirectoryManagement', + 'Microsoft.Graph.Identity.Governance' +) + +function Ensure-NuGetProvider { + try { + if (-not (Get-PackageProvider -ListAvailable -Name 'NuGet' -ErrorAction SilentlyContinue)) { + Install-PackageProvider -Name 'NuGet' -Force -Scope CurrentUser | Out-Null + } + } catch { Write-Warning "NuGet provider installation failed: $($_.Exception.Message)" } +} + +function Ensure-PSGalleryTrusted { + try { + $repo = Get-PSRepository -Name 'PSGallery' -ErrorAction Stop + if ($repo.InstallationPolicy -ne 'Trusted') { + Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted -ErrorAction Stop + } + } catch { Write-Warning "Failed to set PSGallery trusted: $($_.Exception.Message)" } +} + +function Ensure-Module { + param( + [Parameter(Mandatory)] [string] $Name, + [Parameter(Mandatory)] [string] $Version + ) + $hasVersion = Get-Module -ListAvailable -Name $Name -ErrorAction SilentlyContinue | + Where-Object { $_.Version -eq [version]$Version } + if (-not $hasVersion) { + Write-Verbose "Installing $Name $Version for current user..." + Ensure-NuGetProvider + Ensure-PSGalleryTrusted + try { + Install-Module -Name $Name -RequiredVersion $Version -Scope CurrentUser -Force -ErrorAction Stop + } catch { + Write-Warning "Exact version $Version not available for $Name. Installing latest available version." + Install-Module -Name $Name -Scope CurrentUser -Force -ErrorAction Stop + } + } + Import-Module -Name $Name -ErrorAction Stop | Out-Null +} + + +foreach ($m in $RequiredGraphModules) { Ensure-Module -Name $m -Version $RequiredGraphVersion } + +# If Excel export requested, ensure ImportExcel module is loaded/installed +if ($ExportExcel) { + try { + Import-Module ImportExcel -ErrorAction Stop | Out-Null + } catch { + Write-Host 'Installing ImportExcel module for Excel export...' -ForegroundColor Cyan + Ensure-PSGalleryTrusted + Install-Module -Name ImportExcel -Scope CurrentUser -Force -ErrorAction Stop + Import-Module ImportExcel -ErrorAction Stop | Out-Null + } + + # --- Helpers for older ImportExcel versions --- + if (-not (Get-Command New-WorksheetName -ErrorAction SilentlyContinue)) { + function New-WorksheetName { + param([string]$Name) + if (-not $Name) { return 'Sheet' } + $san = ($Name -replace '[\\/:*?\[\]]','_') + if ($san.Length -gt 31) { $san = $san.Substring(0,31) } + if ($san -match '^\d+$') { $san = "_$san" } + return $san + } + } + + if (-not (Get-Command Set-Cell -ErrorAction SilentlyContinue)) { + function Set-Cell { + param( + [Parameter(Mandatory)][string]$Path, + [Parameter(Mandatory)][string]$WorksheetName, + [Parameter(Mandatory)][int]$Row, + [Parameter(Mandatory)][int]$Column, + [string]$Value, + [string]$Hyperlink, + [switch]$Formula + ) + # Fallback using EPPlus via ImportExcel helper cmdlets + $pkg = Open-ExcelPackage -Path $Path + try { + $ws = $pkg.Workbook.Worksheets[$WorksheetName] + if (-not $ws) { $ws = Add-WorkSheet -ExcelPackage $pkg -WorksheetName $WorksheetName } + $cell = $ws.Cells[$Row,$Column] + if ($Formula) { + # Ensure the previous text value doesn't force the cell to stay as text + try { $cell.Clear() } catch { } + if ($Value -and $Value.StartsWith('=')) { $cell.Formula = $Value.Substring(1) } else { $cell.Formula = $Value } + } else { + $cell.Value = $Value + } + if ($Hyperlink) { $cell.Hyperlink = $Hyperlink } + } + finally { + try { $pkg.Workbook.CalcMode = [OfficeOpenXml.ExcelCalcMode]::Automatic } catch { } + try { $ws.Calculate() } catch { } + try { $pkg.Save() } catch { } + try { $pkg.Dispose() } catch { } + } + } + } + + function Try-AddConditionalFormatting { + param( + [string]$Path, + [string]$WorksheetName, + [string]$Range, + [string]$RuleType, + [string]$ConditionValue, + [string]$ForegroundColor, + [string]$BackgroundColor + ) + try { + Add-ConditionalFormatting -Path $Path -WorksheetName $WorksheetName -Range $Range -RuleType $RuleType -ConditionValue $ConditionValue -ForegroundColor $ForegroundColor -BackgroundColor $BackgroundColor + } catch { + try { + $pkg = Open-ExcelPackage -Path $Path + $ws = $pkg.Workbook.Worksheets[$WorksheetName] + if ($ws) { + $cf = $ws.ConditionalFormatting.AddContainsText($Range) + $cf.Text = $ConditionValue + if ($BackgroundColor) { $cf.Style.Fill.BackgroundColor.SetColor([System.Drawing.Color]::$BackgroundColor) } + } + $pkg.Save(); $pkg.Dispose() + } catch { } + } + } + + function Try-SetColumnWidth { + param( + [string]$Path, + [string]$WorksheetName, + [int]$Column, + [double]$Width + ) + try { + Set-Column -Path $Path -WorksheetName $WorksheetName -Column $Column -Width $Width + } catch { + try { + $pkg = Open-ExcelPackage -Path $Path + $ws = $pkg.Workbook.Worksheets[$WorksheetName] + if ($ws) { $ws.Column($Column).Width = $Width } + $pkg.Save(); $pkg.Dispose() + } catch { } + } + } + + function Try-SetFormat { + param( + [Parameter(Mandatory)][string]$Path, + [Parameter(Mandatory)][string]$WorksheetName, + [Parameter(Mandatory)][string]$Range, + [switch]$Bold, + [int]$FontSize, + [string]$BackgroundColor + ) + # Attempt ImportExcel first (varies across versions) + $ok = $false + try { + Set-Format -Path $Path -WorksheetName $WorksheetName -Range $Range -Bold:$Bold -FontSize $FontSize -BackgroundColor $BackgroundColor + $ok = $true + } catch {} + if (-not $ok) { + try { + # Alternate parameter names + Set-Format -Address $Range -WorkSheetname $WorksheetName -Bold:$Bold -FontSize $FontSize -BackgroundColor $BackgroundColor -PassThru | Export-Excel -Path $Path -WorksheetName $WorksheetName -Append + $ok = $true + } catch {} + } + if (-not $ok) { + # Fallback to EPPlus directly + try { + $pkg = Open-ExcelPackage -Path $Path + $ws = $pkg.Workbook.Worksheets[$WorksheetName] + if ($ws) { + $addr = [OfficeOpenXml.ExcelAddress]::new($Range) + $cells = $ws.Cells[$addr.Address] + if ($Bold) { $cells.Style.Font.Bold = $true } + if ($FontSize -gt 0) { $cells.Style.Font.Size = $FontSize } + if ($BackgroundColor) { $cells.Style.Fill.PatternType = [OfficeOpenXml.Style.ExcelFillStyle]::Solid; $cells.Style.Fill.BackgroundColor.SetColor([System.Drawing.Color]::$BackgroundColor) } + } + $pkg.Save(); $pkg.Dispose() + } catch { } + } + } + + function Add-PolicyNamesNamedRange { + param([Parameter(Mandatory)][string]$Path) + $pkg = Open-ExcelPackage -Path $Path + try { + $ws = $pkg.Workbook.Worksheets['Master'] + if (-not $ws) { return } + # Find the column index of 'Name' in header row 1 + $lastCol = $ws.Dimension.End.Column + $nameCol = $null + for ($c=1; $c -le $lastCol; $c++) { + if (($ws.Cells[1,$c].Text) -eq 'Name') { $nameCol = $c; break } + } + if ($null -eq $nameCol) { return } + $lastRow = $ws.Dimension.End.Row + if ($lastRow -lt 2) { return } + $rangeAddress = [OfficeOpenXml.ExcelAddress]::new(2, $nameCol, $lastRow, $nameCol) + # Create or update a workbook-level named range 'PolicyNames' + $existing = $pkg.Workbook.Names['PolicyNames'] + if ($existing) { $pkg.Workbook.Names.Remove($existing) | Out-Null } + [void]$pkg.Workbook.Names.Add('PolicyNames', $ws.Cells[$rangeAddress.Address]) + $pkg.Save() + } finally { try { $pkg.Dispose() } catch { } } + } + + function Add-PolicyNameValidation { + param( + [Parameter(Mandatory)][string]$Path, + [Parameter(Mandatory)][string]$WorksheetName + ) + $pkg = Open-ExcelPackage -Path $Path + try { + $ws = $pkg.Workbook.Worksheets[$WorksheetName] + if (-not $ws) { return } + # Add a dropdown in B1 pointing to the 'PolicyNames' named range + $dv = $ws.DataValidations.AddListValidation('B1') + $dv.Formula.ExcelFormula = 'PolicyNames' + $dv.ShowErrorMessage = $true + $dv.ErrorTitle = 'Invalid selection' + $dv.Error = 'Please pick a policy name from the list.' + $pkg.Save() + } finally { try { $pkg.Dispose() } catch { } } + } +} + +# --- Ensure connection to Microsoft Graph with required scopes --- +$RequiredMgScopes = @( + 'Application.Read.All', + 'Group.Read.All', + 'Policy.Read.All', + 'RoleManagement.Read.Directory', + 'User.Read.All', + 'NetworkAccessPolicy.Read.All', # optional: for Global Secure Access profile names + 'Agreement.Read.All' # optional: for Terms of Use display names +) + +function Ensure-MgConnection { + try { $ctx = Get-MgContext -ErrorAction Stop } catch { $ctx = $null } + + $needConnect = $true + if ($ctx) { + $currentScopes = @($ctx.Scopes) + if ($currentScopes -and ($RequiredMgScopes | Where-Object { $currentScopes -contains $_ }).Count -eq $RequiredMgScopes.Count) { + $needConnect = $false + } + } + + if ($needConnect) { + Write-Host 'Connecting to Microsoft Graph...' -ForegroundColor Cyan + Connect-MgGraph -Scopes $RequiredMgScopes -NoWelcome + } +} + +Ensure-MgConnection + +function Test-Guid { + <# + .SYNOPSIS + Validates a given input string and checks string is a valid GUID + .DESCRIPTION + Validates a given input string and checks string is a valid GUID by using the .NET method Guid.TryParse + .EXAMPLE + Test-Guid -InputObject "3363e9e1-00d8-45a1-9c0c-b93ee03f8c13" + .NOTES + Uses .NET method [guid]::TryParse() + #> + [Cmdletbinding()] + [OutputType([bool])] + param + ( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipelineByPropertyName = $true)] + [AllowEmptyString()] + [string]$InputObject + ) + process { + return [guid]::TryParse($InputObject, $([ref][guid]::Empty)) + } +} + +function Resolve-MgObject { + <# + .SYNOPSIS + Resolve a Microsoft Graph item to display name + .DESCRIPTION + Resolves a Microsoft Graph Directory Object to a Display Name when possible + .EXAMPLE + + .NOTES + + #> + [Cmdletbinding()] + [OutputType([string])] + param + ( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipelineByPropertyName = $true)] + [AllowEmptyString()] + [string]$InputObject + ) + process { + if (Test-Guid -InputObject $InputObject) { + try { + # use hashtable as cache to limit API calls + if ($displayNameCache.ContainsKey($InputObject)) { + Write-Debug "Cached display name for `"$InputObject`"" + return $displayNameCache[$InputObject] + } else { + $directoryObject = Get-MgDirectoryObject -DirectoryObjectId $InputObject -ErrorAction Stop + $displayName = $directoryObject.AdditionalProperties['displayName'] + $displayNameCache[$InputObject] = $displayName + return $displayName + } + } catch { + Write-Warning "Unable to resolve directory object with ID $InputObject, might have been deleted!" + } + } + return $InputObject + } +} + +# Add GetOrDefault to hashtables +$etd = @{ + TypeName = 'System.Collections.Hashtable' + MemberType = 'Scriptmethod' + MemberName = 'GetOrDefault' + Value = { + param( + $key, + $defaultValue + ) + + if (-not [string]::IsNullOrEmpty($key)) { + if ($this.ContainsKey($key)) { + if ($this[$key].DisplayName) { + return $this[$key].DisplayName + } else { + return $this[$key] + } + } else { + return $defaultValue + } + } + } +} +Update-TypeData @etd -Force + +Write-Progress -PercentComplete -1 -Activity 'Fetching conditional access policies and related data from Graph API' + +try { + if (-not (Get-MgContext)) { Write-Warning "Not connected to Microsoft Graph. Run: Connect-MgGraph -Scopes \"Application.Read.All\",\"Group.Read.All\",\"Policy.Read.All\",\"RoleManagement.Read.Directory\",\"User.Read.All\",\"NetworkAccessPolicy.Read.All\",\"Agreement.Read.All\"" } +} catch { } + +# Get Conditional Access Policies +$conditionalAccessPolicies = Get-MgIdentityConditionalAccessPolicy -ExpandProperty '*' -All -ErrorAction Stop + +# Get Conditional Access Named / Trusted Locations +$namedLocations = Get-MgIdentityConditionalAccessNamedLocation -All -ErrorAction Stop | Group-Object -Property Id -AsHashTable +if (-not $namedLocations) { $namedLocations = @{} } + +# Get Azure AD Directory Role Templates (in latest module, use Get-MgDirectoryRoleTemplate) +try { + $directoryRoleTemplates = Get-MgDirectoryRoleTemplate -All -ErrorAction Stop | Group-Object -Property Id -AsHashTable +} catch { + Write-Warning "Directory role templates could not be retrieved (module missing or insufficient permissions). Role names will not be resolved." + $directoryRoleTemplates = @{} +} + + # Service Principals +$servicePrincipals = Get-MgServicePrincipal -All -ErrorAction Stop | Group-Object -Property AppId -AsHashTable + +# Terms of Use Agreements (for resolving TermsOfUse IDs) +try { + $termsOfUseAgreements = Get-MgIdentityGovernanceTermsOfUseAgreement -All -ErrorAction Stop | Group-Object -Property Id -AsHashTable +} catch { + Write-Warning "Terms of Use agreements could not be retrieved or permission missing (Agreement.Read.All)." + $termsOfUseAgreements = @{} +} + +# GSA network filtering (no direct beta endpoint in new modules, use Invoke-MgGraphRequest as fallback) +try { + $networkFilteringProfiles = Invoke-MgGraphRequest -Uri 'https://graph.microsoft.com/beta/networkAccess/filteringProfiles' -Method GET -OutputType PSObject -ErrorAction Stop | + Select-Object -ExpandProperty value | + Group-Object -Property id -AsHashTable +} catch { + Write-Warning "Global Secure Access filtering profiles not available or insufficient permission. Skipping." + $networkFilteringProfiles = @{} +} + +# Init report +$documentation = [System.Collections.Generic.List[Object]]::new() +# Cache for resolved display names +$displayNameCache = @{} + +# Process all Conditional Access Policies +foreach ($policy in $conditionalAccessPolicies) { + + # Display some progress (based on policy count) + $currentIndex = $conditionalAccessPolicies.indexOf($policy) + 1 + + $progress = @{ + Activity = 'Generating Conditional Access Documentation...' + PercentComplete = [Decimal]::Divide($currentIndex, $conditionalAccessPolicies.Count) * 100 + CurrentOperation = "Processing Policy `"$($policy.DisplayName)`"" + } + if ($currentIndex -eq $conditionalAccessPolicies.Count) { $progress.Add('Completed', $true) } + + Write-Progress @progress + + Write-Output "Processing policy `"$($policy.DisplayName)`"" + + try { + # Resolve object IDs of included users + $includeUsers = @($policy.Conditions?.Users?.IncludeUsers) | ForEach-Object { Resolve-MgObject -InputObject $_ } + # Resolve object IDs of excluded users + $excludeUsers = @($policy.Conditions?.Users?.ExcludeUsers) | ForEach-Object { Resolve-MgObject -InputObject $_ } + # Resolve object IDs of included groups + $includeGroups = @($policy.Conditions?.Users?.IncludeGroups) | ForEach-Object { Resolve-MgObject -InputObject $_ } + # Resolve object IDs of excluded groups + $excludeGroups = @($policy.Conditions?.Users?.ExcludeGroups) | ForEach-Object { Resolve-MgObject -InputObject $_ } + # Resolve object IDs of included roles + $includeRoles = @($policy.Conditions?.Users?.IncludeRoles) | ForEach-Object { $directoryRoleTemplates.GetOrDefault($_, $_) } + # Resolve object IDs of excluded roles + $excludeRoles = @($policy.Conditions?.Users?.ExcludeRoles) | ForEach-Object { $directoryRoleTemplates.GetOrDefault($_, $_) } + + # Resolve object IDs of included apps + $includeApps = @($policy.Conditions?.Applications?.IncludeApplications) | ForEach-Object { $servicePrincipals.GetOrDefault($_, $_) } + # Resolve object IDs of excluded apps + $excludeApps = @($policy.Conditions?.Applications?.ExcludeApplications) | ForEach-Object { $servicePrincipals.GetOrDefault($_, $_) } + + $includeServicePrincipals = [System.Collections.Generic.List[Object]]::new() + $excludeServicePrincipals = [System.Collections.Generic.List[Object]]::new() + + @($policy.Conditions?.ClientApplications?.IncludeServicePrincipals) | ForEach-Object { $includeServicePrincipals.Add($servicePrincipals.GetOrDefault($_, $_)) } + @($policy.Conditions?.ClientApplications?.ExcludeServicePrincipals) | ForEach-Object { $excludeServicePrincipals.Add($servicePrincipals.GetOrDefault($_, $_)) } + + $includeAuthenticationContext = [System.Collections.Generic.List[Object]]::new() + @($policy.Conditions?.Applications?.IncludeAuthenticationContextClassReferences) | ForEach-Object { + try { + $context = Get-MgIdentityConditionalAccessAuthenticationContextClassReference -Filter "Id eq '$PSItem'" -ErrorAction Stop + if ($context.DisplayName) { $includeAuthenticationContext.Add($context.DisplayName) } + } catch { + $includeAuthenticationContext.Add($PSItem) + } + } + + # Resolve object IDs of included/excluded locations + $includeLocations = @($policy.Conditions?.Locations?.IncludeLocations) | ForEach-Object { $namedLocations.GetOrDefault($_, $_) } + $excludeLocations = @($policy.Conditions?.Locations?.ExcludeLocations) | ForEach-Object { $namedLocations.GetOrDefault($_, $_) } + + # GSA web filtering profile (if available) + $webFilteringProfile = $null + try { + $gsaProp = $policy.SessionControls?.AdditionalProperties?['globalSecureAccessFilteringProfile'] + if ($gsaProp) { + $profileId = $gsaProp['profileId'] + if ($profileId -and $networkFilteringProfiles.ContainsKey($profileId)) { + $webFilteringProfile = $networkFilteringProfiles[$profileId].name + } + } + } catch { } + + # delimiter for arrays in csv report + $separator = "; " + + # Grant controls + $grantBuiltIn = @() + if ($policy.GrantControls?.BuiltInControls) { $grantBuiltIn += $policy.GrantControls.BuiltInControls } + if ($policy.GrantControls?.TermsOfUse) { $grantBuiltIn += 'termsOfUse' } + if ($policy.GrantControls?.AuthenticationStrength) { $grantBuiltIn += 'authenticationStrength' } + + $grantControls = $grantBuiltIn | Where-Object { $_ -ne 'authenticationStrength' } + $authStrengthName = $policy.GrantControls?.AuthenticationStrength?.DisplayName + if ($authStrengthName) { $grantControls += 'authenticationStrength' } + + $authStrengthAllowed = @($policy.GrantControls?.AuthenticationStrength?.AllowedCombinations) -join $separator + + # Session controls / misc + $signInFrequency = $null + if ($policy.SessionControls?.SignInFrequency?.Value) { + $signInFrequency = "{0} {1}" -f $policy.SessionControls.SignInFrequency.Value, $policy.SessionControls.SignInFrequency.Type + } + + $secureSignInSession = $null + $ss = $policy.SessionControls?.AdditionalProperties?['secureSignInSession'] + if ($ss) { $secureSignInSession = $ss.isEnabled } + + # Device states include/exclude (if present) + $includeDeviceStates = @($policy.Conditions?.DeviceStates?.IncludeStates) + $excludeDeviceStates = @($policy.Conditions?.DeviceStates?.ExcludeStates) + + # Include guests/external users (if present) + $includeGuestsOrExternalUserTypes = $policy.Conditions?.Users?.IncludeGuestsOrExternalUsers?.guestOrExternalUserTypes + $includeGuestsOrExternalUserTenants = @($policy.Conditions?.Users?.IncludeGuestsOrExternalUsers?.externalTenants?.AdditionalProperties?['members']) + + # Authentication flows (future-proof; may be empty) + $authenticationFlows = @($policy.Conditions?.AuthenticationFlows) + + # Applications additional properties (future-proof) + $applicationsAdditional = $null + if ($policy.Conditions?.Applications?.AdditionalProperties) { + $applicationsAdditional = ($policy.Conditions.Applications.AdditionalProperties | ConvertTo-Json -Depth 6 -Compress) + } + + # Conditions.additionalProperties (future-proof) + $conditionsAdditional = $null + if ($policy.Conditions?.AdditionalProperties) { + $conditionsAdditional = ($policy.Conditions.AdditionalProperties | ConvertTo-Json -Depth 6 -Compress) + } + + # GrantControls Terms of Use display names + $termsOfUseNames = $null + if ($policy.GrantControls?.TermsOfUse) { + $termsOfUseNames = ($policy.GrantControls.TermsOfUse | ForEach-Object { $termsOfUseAgreements.GetOrDefault($_, $_) }) -join $separator + } + + # GrantControls additional properties + $grantControlsAdditional = $null + if ($policy.GrantControls?.AdditionalProperties) { + $grantControlsAdditional = ($policy.GrantControls.AdditionalProperties | ConvertTo-Json -Depth 6 -Compress) + } + + # Session controls additional details + $cloudAppSecurityMode = $policy.SessionControls?.CloudAppSecurity?.Mode + $sessionAdditional = $null + if ($policy.SessionControls?.AdditionalProperties) { + $sessionAdditional = ($policy.SessionControls.AdditionalProperties | ConvertTo-Json -Depth 6 -Compress) + } + + # construct entry for report + $documentation.Add( + [PSCustomObject]@{ + Name = $policy.DisplayName + # Conditions + IncludeUsers = ($includeUsers -join $separator) + IncludeGroups = ($includeGroups -join $separator) + IncludeRoles = ($includeRoles -join $separator) + + ExcludeUsers = ($excludeUsers -join $separator) + ExcludeGuestOrExternalUserTypes = $policy.Conditions?.Users?.ExcludeGuestsOrExternalUsers?.guestOrExternalUserTypes + ExcludeGuestOrExternalUserTenants = (@($policy.Conditions?.Users?.ExcludeGuestsOrExternalUsers?.externalTenants?.AdditionalProperties?['members']) -join $separator) + + ExcludeGroups = ($excludeGroups -join $separator) + ExcludeRoles = ($excludeRoles -join $separator) + + IncludeApps = ($includeApps -join $separator) + ExcludeApps = ($excludeApps -join $separator) + + ApplicationFilterMode = $policy.Conditions?.Applications?.ApplicationFilter?.mode + ApplicationFilterRule = $policy.Conditions?.Applications?.ApplicationFilter?.rule + + IncludeAuthenticationContext = ($includeAuthenticationContext -join $separator) + IncludeUserActions = (@($policy.Conditions?.Applications?.IncludeUserActions) -join $separator) + ClientAppTypes = (@($policy.Conditions?.ClientAppTypes) -join $separator) + + IncludePlatforms = (@($policy.Conditions?.Platforms?.IncludePlatforms) -join $separator) + ExcludePlatforms = (@($policy.Conditions?.Platforms?.ExcludePlatforms) -join $separator) + + IncludeLocations = ($includeLocations -join $separator) + ExcludeLocations = ($excludeLocations -join $separator) + + DeviceFilterMode = $policy.Conditions?.Devices?.DeviceFilter?.Mode + DeviceFilterRule = $policy.Conditions?.Devices?.DeviceFilter?.Rule + + SignInRiskLevels = (@($policy.Conditions?.SignInRiskLevels) -join $separator) + UserRiskLevels = (@($policy.Conditions?.UserRiskLevels) -join $separator) + ServicePrincipalRiskLevels = (@($policy.Conditions?.servicePrincipalRiskLevels) -join $separator) + + # Additional/expanded condition fields + IncludeDeviceStates = (@($includeDeviceStates) -join $separator) + ExcludeDeviceStates = (@($excludeDeviceStates) -join $separator) + IncludeGuestsOrExternalUserTypes = $includeGuestsOrExternalUserTypes + IncludeGuestOrExternalUserTenants = (@($includeGuestsOrExternalUserTenants) -join $separator) + AuthenticationFlows = (@($authenticationFlows) -join $separator) + ApplicationsAdditional = $applicationsAdditional + ConditionsAdditional = $conditionsAdditional + + # Workload Identity Protection + IncludeServicePrincipals = ($includeServicePrincipals -join $separator) + ExcludeServicePrincipals = ($excludeServicePrincipals -join $separator) + ServicePrincipalFilterMode = $policy.Conditions?.ClientApplications?.ServicePrincipalFilter?.mode + ServicePrincipalFilter = $policy.Conditions?.ClientApplications?.ServicePrincipalFilter?.rule + + # Grantcontrols + GrantControls = ($grantControls -join $separator) + GrantControlsOperator = $policy.GrantControls?.Operator + AuthenticationStrength = $authStrengthName + AuthenticationStrengthAllowedCombinations = $authStrengthAllowed + TermsOfUseNames = $termsOfUseNames + GrantControlsAdditional = $grantControlsAdditional + + # Session controls + ApplicationEnforcedRestrictions = $policy.SessionControls?.ApplicationEnforcedRestrictions?.IsEnabled + CloudAppSecurity = $policy.SessionControls?.CloudAppSecurity?.IsEnabled + CloudAppSecurityMode = $cloudAppSecurityMode + DisableResilienceDefaults = $policy.SessionControls?.DisableResilienceDefaults + PersistentBrowser = $policy.SessionControls?.PersistentBrowser?.Mode + SignInFrequency = $signInFrequency + SecureSignInSession = $secureSignInSession # Require Token Protection + GlobalSecureAccessFilteringProfile = $webFilteringProfile + SessionControlsAdditional = $sessionAdditional + + # State + State = $policy.State + } + ) + } catch { + Write-Error $PSItem + } +} + + +# Build export path (script directory) +$exportPath = Join-Path $PSScriptRoot 'ConditionalAccessDocumentation.csv' + + +# Export report as csv (use semicolon delimiter to play nice with Excel in many locales) +$CsvDelimiter = ';' +$exportParams = @{ Path = $exportPath; NoTypeInformation = $true; Delimiter = $CsvDelimiter; Encoding = 'utf8BOM' } +try { + # UseQuotes is available in PowerShell 7.3+ + $exportParams['UseQuotes'] = 'AsNeeded' +} catch { } + +try { + $documentation | Export-Csv @exportParams +} catch { + Write-Warning "Export-Csv with UTF-8 BOM failed on this PowerShell version. Retrying with UTF-8 (no BOM)." + $exportParams['Encoding'] = 'utf8' + $documentation | Export-Csv @exportParams +} + +Write-Output "Exported Documentation to '$($exportPath)'" + +if ($ExportExcel) { + Write-Host 'Building Excel workbook...' -ForegroundColor Cyan + if (-not $ExcelPath) { + $ExcelPath = Join-Path $PSScriptRoot 'ConditionalAccessDocumentation.xlsx' + } + + if (Test-Path $ExcelPath) { Remove-Item $ExcelPath -Force } + + # 0) MASTER: full matrix of all fields (like the CSV) + $documentation | Export-Excel -Path $ExcelPath -WorksheetName 'Master' -TableName 'Master' -TableStyle 'Medium9' -ClearSheet -FreezeTopRow -AutoFilter + + # 1) SUMMARY: compact view (Name + State) + $summary = $documentation | Select-Object Name, State + $summary | Export-Excel -Path $ExcelPath -WorksheetName 'Summary' -TableName 'Policies' -TableStyle 'Medium6' -ClearSheet -FreezeTopRow -AutoFilter + + Try-AddConditionalFormatting -Path $ExcelPath -WorksheetName 'Summary' -Range 'B2:B1048576' -RuleType ContainsText -ConditionValue 'enabled' -ForegroundColor 'Black' -BackgroundColor 'LightGreen' + Try-AddConditionalFormatting -Path $ExcelPath -WorksheetName 'Summary' -Range 'B2:B1048576' -RuleType ContainsText -ConditionValue 'disabled' -ForegroundColor 'Black' -BackgroundColor 'LightGray' + Try-AddConditionalFormatting -Path $ExcelPath -WorksheetName 'Summary' -Range 'B2:B1048576' -RuleType ContainsText -ConditionValue 'reportOnly' -ForegroundColor 'Black' -BackgroundColor 'Khaki' + + # Make a named range of policy names for dropdowns on detail sheets + Add-PolicyNamesNamedRange -Path $ExcelPath + + # 2) DETAIL SHEETS: readable, two-column layout with formulas referencing Master + # Define the fields to show and their labels (grouped by section) + $sections = @( + @{ Title = 'General'; Fields = @( + @{ Label = 'Policy name'; Col = 'Name' }, + @{ Label = 'State'; Col = 'State' } + )}, + @{ Title = 'Users and groups'; Fields = @( + @{ Label = 'Include users'; Col = 'IncludeUsers' }, + @{ Label = 'Include groups'; Col = 'IncludeGroups' }, + @{ Label = 'Include roles'; Col = 'IncludeRoles' }, + @{ Label = 'Exclude users'; Col = 'ExcludeUsers' }, + @{ Label = 'Exclude groups'; Col = 'ExcludeGroups' }, + @{ Label = 'Exclude roles'; Col = 'ExcludeRoles' } + )}, + @{ Title = 'Applications'; Fields = @( + @{ Label = 'Include apps'; Col = 'IncludeApps' }, + @{ Label = 'Exclude apps'; Col = 'ExcludeApps' }, + @{ Label = 'Client app types';Col = 'ClientAppTypes' }, + @{ Label = 'AuthN context'; Col = 'IncludeAuthenticationContext' } + )}, + @{ Title = 'Conditions'; Fields = @( + @{ Label = 'Platforms include'; Col = 'IncludePlatforms' }, + @{ Label = 'Platforms exclude'; Col = 'ExcludePlatforms' }, + @{ Label = 'Locations include'; Col = 'IncludeLocations' }, + @{ Label = 'Locations exclude'; Col = 'ExcludeLocations' }, + @{ Label = 'Device filter mode'; Col = 'DeviceFilterMode' }, + @{ Label = 'Device filter rule'; Col = 'DeviceFilterRule' }, + @{ Label = 'Sign-in risk'; Col = 'SignInRiskLevels' }, + @{ Label = 'User risk'; Col = 'UserRiskLevels' } + )}, + @{ Title = 'Grant'; Fields = @( + @{ Label = 'Operator'; Col = 'GrantControlsOperator' }, + @{ Label = 'Controls'; Col = 'GrantControls' }, + @{ Label = 'Auth strength'; Col = 'AuthenticationStrength' }, + @{ Label = 'Allowed combos'; Col = 'AuthenticationStrengthAllowedCombinations' }, + @{ Label = 'Terms of Use'; Col = 'TermsOfUseNames' } + )}, + @{ Title = 'Session'; Fields = @( + @{ Label = 'App enforced restrictions'; Col = 'ApplicationEnforcedRestrictions' }, + @{ Label = 'Defender for Cloud Apps'; Col = 'CloudAppSecurity' }, + @{ Label = 'CAS mode'; Col = 'CloudAppSecurityMode' }, + @{ Label = 'Persistent browser'; Col = 'PersistentBrowser' }, + @{ Label = 'Sign-in frequency'; Col = 'SignInFrequency' }, + @{ Label = 'Secure sign-in session'; Col = 'SecureSignInSession' }, + @{ Label = 'GSA filtering profile'; Col = 'GlobalSecureAccessFilteringProfile' } + )} + ) + + # Build a column index for Master to generate formulas (from in-memory objects) + $first = $documentation | Select-Object -First 1 + $masterHeaders = @() + if ($first) { $masterHeaders = @($first.PSObject.Properties.Name) } + $headerIndex = @{} + for ($i=0; $i -lt $masterHeaders.Count; $i++) { $headerIndex[$masterHeaders[$i]] = $i+1 } + + foreach ($item in $documentation) { + $sheetName = New-WorksheetName -Name $item.Name + + # Create a new blank sheet + Export-Excel -Path $ExcelPath -WorksheetName $sheetName -ClearSheet | Out-Null + + # Title and key identity cell (Policy name in B1) — set to this policy's name + Set-Cell -Path $ExcelPath -WorksheetName $sheetName -Row 1 -Column 1 -Value 'Policy' + Set-Cell -Path $ExcelPath -WorksheetName $sheetName -Row 1 -Column 2 -Value $item.Name + Try-SetFormat -Path $ExcelPath -WorksheetName $sheetName -Range 'A1:B1' -Bold -FontSize 14 + + # Write detail rows explicitly into A/B without creating a table + $rowPtr = 3 + foreach ($section in $sections) { + # Section header row + Set-Cell -Path $ExcelPath -WorksheetName $sheetName -Row $rowPtr -Column 1 -Value $section.Title + Try-SetFormat -Path $ExcelPath -WorksheetName $sheetName -Range ("A$rowPtr:B$rowPtr") -Bold -BackgroundColor 'LightGray' + $rowPtr++ + + foreach ($f in $section.Fields) { + $label = $f.Label + $colName = $f.Col + Set-Cell -Path $ExcelPath -WorksheetName $sheetName -Row $rowPtr -Column 1 -Value $label + if ($headerIndex.ContainsKey($colName)) { + $formula = "=INDEX(Master[$colName], MATCH(`$B`$1, Master[Name], 0))" + Set-Cell -Path $ExcelPath -WorksheetName $sheetName -Row $rowPtr -Column 2 -Value $formula -Formula + } else { + Set-Cell -Path $ExcelPath -WorksheetName $sheetName -Row $rowPtr -Column 2 -Value '' + } + $rowPtr++ + } + + # blank line between sections + $rowPtr++ + } + + # Tidy up widths + Try-SetColumnWidth -Path $ExcelPath -WorksheetName $sheetName -Column 1 -Width 34 + Try-SetColumnWidth -Path $ExcelPath -WorksheetName $sheetName -Column 2 -Width 80 + Try-AddConditionalFormatting -Path $ExcelPath -WorksheetName $sheetName -Range 'B1:B200' -RuleType ContainsText -ConditionValue 'enabled' -ForegroundColor 'Black' -BackgroundColor 'LightGreen' + Try-AddConditionalFormatting -Path $ExcelPath -WorksheetName $sheetName -Range 'B1:B200' -RuleType ContainsText -ConditionValue 'disabled' -ForegroundColor 'Black' -BackgroundColor 'LightGray' + Try-AddConditionalFormatting -Path $ExcelPath -WorksheetName $sheetName -Range 'B1:B200' -RuleType ContainsText -ConditionValue 'reportOnly' -ForegroundColor 'Black' -BackgroundColor 'Khaki' + } + + # Hyperlinks from Summary -> policy sheets + $r = 2 + foreach ($name in $documentation | Select-Object -ExpandProperty Name) { + $ws = New-WorksheetName -Name $name + Set-Cell -Path $ExcelPath -WorksheetName 'Summary' -Row $r -Column 1 -Value $name -Hyperlink ("#'" + $ws + "'!A1") + $r++ + } + + Write-Output "Exported Excel workbook to '$ExcelPath'" +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d08edca --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Nicola Suter + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..7f8cfc1 --- /dev/null +++ b/Readme.md @@ -0,0 +1,58 @@ +# Document Conditional Access with PowerShell + +[![PSGallery Version](https://img.shields.io/powershellgallery/v/Invoke-ConditionalAccessDocumentation.svg?style=flat-square&label=PSGallery%20Version)](https://www.powershellgallery.com/packages/Invoke-ConditionalAccessDocumentation) [![PSGallery Downloads](https://img.shields.io/powershellgallery/dt/Invoke-ConditionalAccessDocumentation?style=flat-square&label=PSGallery%20Downloads)](https://www.powershellgallery.com/packages/Invoke-ConditionalAccessDocumentation) +![GitHub](https://img.shields.io/github/license/nicolonsky/conditionalaccessdocumentation?style=flat-square) +![GitHub Release Date](https://img.shields.io/github/release-date/nicolonsky/conditionalaccessdocumentation?style=flat-square) + + +This PowerShell script documents your Entra ID Conditional Access policies while translating directory object IDs of targeted users, groups and apps to readable names. This is an extended version of Daniel Chronlund’s [DCToolbox](https://github.com/DanielChronlund/DCToolbox). The script exports all data as a csv file which can be pretty formatted as excel workbook. + +1. Install this script from the PowerShell gallery (dependent modules are automatically installed): + + * `Install-Script -Name Invoke-ConditionalAccessDocumentation -Scope CurrentUser` + +2. Connect to Microsoft Graph + + * Grant initial admin consent: `Connect-MgGraph -Scopes "Application.Read.All", "Group.Read.All", "Policy.Read.All", "RoleManagement.Read.Directory", "User.Read.All" -ContextScope Process` + + * After initial admin consent has been granted you can connect with: `Connect-MgGraph` for subsequent usage + +## Usage + +Run the script with the following options: + +- Default CSV export: + + ```powershell + .\Invoke-ConditionalAccessDocumentation.ps1 + ``` + +- Export with Excel: + + ```powershell + .\Invoke-ConditionalAccessDocumentation.ps1 -ExportExcel + ``` + +- Export with Excel to a custom path: + + ```powershell + .\Invoke-ConditionalAccessDocumentation.ps1 -ExportExcel -ExcelPath "C:\Path\To\Save\ConditionalAccess.xlsx" + ``` + +- Use multi-line output (default is single-line): + + ```powershell + .\Invoke-ConditionalAccessDocumentation.ps1 -MultiLine + ``` + +4. (Optional) Pretty format the csv with excel & save it as excel workbook + + * ![Example](https://raw.githubusercontent.com/nicolonsky/ConditionalAccessDocumentation/master/Example/Example.png) + +## New Features + +- Automatic installation of required PowerShell modules if they are not present. +- CSV export with proper delimiter and encoding to ensure compatibility and readability. +- Excel export option that creates a workbook with multiple worksheets including a Master sheet, Summary sheet, and individual sheets for each Conditional Access policy. +- Readable two-column layout in the Excel export for enhanced clarity and presentation. +- Translation of directory object IDs (users, groups, apps) to human-readable names for easier analysis.