M365cde.ConditionalAccessNamedIP.psm1

<#
.SYNOPSIS
Retrieves IP addresses associated with named locations in Conditional Access.
 
.DESCRIPTION
The `Get-ConditionalAccessNamedIP` function retrieves IP addresses from named locations in Conditional Access policies. You can filter the results based on whether the location is trusted or untrusted.
 
.PARAMETER IsTrusted
Specifies that only trusted named locations should be considered. If this switch is used, the function will return IP addresses associated with trusted locations.
 
.PARAMETER IsUntrusted
Specifies that only untrusted named locations should be considered. If this switch is used, the function will return IP addresses associated with untrusted locations.
 
.EXAMPLE
Get-ConditionalAccessNamedIP -IsTrusted
# Retrieves IP addresses from trusted named locations.
 
.EXAMPLE
Get-ConditionalAccessNamedIP -IsUntrusted
# Retrieves IP addresses from untrusted named locations.
 
.NOTES
- Requires connection to Microsoft Graph using `Connect-MgGraph`.
- The function uses the `Get-MgIdentityConditionalAccessNamedLocation` cmdlet.
- IP addresses are returned as an array of strings.
#>


function Get-ConditionalAccessNamedIP {
    [CmdletBinding(DefaultParameterSetName = 'All')]
    param (
        [Parameter(ParameterSetName = 'Trusted')]
        [switch]$IsTrusted,

        [Parameter(ParameterSetName = 'Untrusted')]
        [switch]$IsUntrusted
    )

    # Connect to Graph
    if (-not (Get-MgContext)) {
        # Connect to Graph
        Connect-MgGraph -Scopes "Policy.Read.All" -NoWelcome
    }

    # Get all named locations from conditional access
    [array]$CAKnownLocations = Get-MgIdentityConditionalAccessNamedLocation -All

    # Filter by trusted or untrusted
    if ($IsTrusted -eq $true) {
        $CAKnownLocations = $CAKnownLocations | Where-Object { $_.AdditionalProperties.isTrusted -eq $true }
    }
    elseif ($IsUntrusted -eq $true) {
        $CAKnownLocations = $CAKnownLocations | Where-Object { $_.AdditionalProperties.isTrusted -eq $false }
    }

    #Prepare the arrays
    [array]$CAIPAddressRanges = $Null
    [array]$CAIPAddresses = $Null

    # Iterate through each named location and get the IP ranges
    ForEach ($Location in $CAKnownLocations) {
    $IPRanges = $Null
    $IPRanges = $Location.AdditionalProperties['ipRanges']
    If ($IPRanges) {
        foreach ($Address in $IPRanges) {
            $item = New-Object PSObject -Property @{
                Range = $Address['cidrAddress']
                DisplayName = $Location.DisplayName
            }
            $CAIPAddressRanges += $item
        }
    }
    }

    # Iterate through each IP range and get the IP addresses by Get-Subnet
    foreach ($range in $CAIPAddressRanges) {
        $subnet = Get-Subnet $range.Range

        $NetworkAdress = New-Object PSObject -Property @{
            IP = $subnet.NetworkAddress.IPAddressToSTring
            NamedLocation = $range.DisplayName
        }

        $BroadcastAddress = New-Object PSObject -Property @{
            IP = $subnet.BroadcastAddress.IPAddressToSTring
            NamedLocation = $range.DisplayName
        }

        $CAIPAddresses += $NetworkAdress
        $CAIPAddresses += $BroadcastAddress

        foreach ($item in $subnet.HostAddresses) {
            $HostAddresses = New-Object PSObject -Property @{
                IP = $item
                NamedLocation = $range.DisplayName
            }
            $CAIPAddresses += $HostAddresses
        }
    }

    # Return the IP addresses
    $CAIPAddresses
}

Export-ModuleMember -Function Get-ConditionalAccessNamedIP