Tuesday, October 14, 2025

Power shell - extract IP

 # Define file paths

$jsonPath = "D:\Azure_IP\ServiceTags_Public_20251006.json"

$idCsvPath = "D:\Azure_IP\ids.csv"

$outputFolder = "D:\Azure_IP\Subnets"

# Create output folder if missing

if (!(Test-Path -Path $outputFolder)) {

    New-Item -ItemType Directory -Path $outputFolder | Out-Null

}


# Load and parse JSON

try {

    $jsonRaw = Get-Content -Raw -Path $jsonPath -ErrorAction Stop

    $json = $jsonRaw | ConvertFrom-Json -ErrorAction Stop

} catch {

    Write-Error "Failed to read/parse JSON at '$jsonPath'. $_"

    exit 1

}


# Ensure values array exists

if (-not $json.PSObject.Properties.Name -contains 'values' -or -not $json.values) {

    Write-Error "JSON does not contain a 'values' array."

    exit 1

}

$values = $json.values


# Read IDs from CSV or plain text file (supports:

#  - CSV with header 'Id'

#  - CSV with another header (first column used)

#  - Plain text file with one ID per line)

$ids = @()

try {

    $csv = Import-Csv -Path $idCsvPath -ErrorAction Stop

    if ($csv.Count -gt 0) {

        $firstProps = $csv[0].PSObject.Properties | ForEach-Object { $_.Name }

        if ($firstProps -contains 'Id') {

            $ids = $csv | ForEach-Object { $_.Id }

        } else {

            # take the first property/column if Id header is not present

            $firstProp = $firstProps[0]

            $ids = $csv | ForEach-Object { $_.$firstProp }

        }

    } else {

        # empty CSV, fall back to Get-Content

        $ids = Get-Content -Path $idCsvPath | Where-Object { $_ -and $_.Trim() -ne "" }

    }

} catch {

    # Import-Csv failed -> try reading as plain text lines

    Write-Verbose "Import-Csv failed, trying Get-Content: $_"

    $ids = Get-Content -Path $idCsvPath -ErrorAction Stop | Where-Object { $_ -and $_.Trim() -ne "" }

}


if ($ids.Count -eq 0) {

    Write-Warning "No IDs found in '$idCsvPath'. Nothing to process."

    exit 0

}


# Process each ID

foreach ($rawId in $ids) {

    $id = [string]$rawId

    $id = $id.Trim()

    if ([string]::IsNullOrWhiteSpace($id)) { continue }


    # Find matching value object by id (case-insensitive)

    $match = $values | Where-Object {

        $objId = ""

        if ($_.PSObject.Properties.Name -contains 'id') { $objId = $_.id }

        elseif ($_.PSObject.Properties.Name -contains 'Id') { $objId = $_.Id }

        else { $objId = $_ | Select-Object -ExpandProperty id -ErrorAction SilentlyContinue }

        return ($objId -as [string]) -ne $null -and ($objId -ieq $id)

    }


    if (-not $match) {

        Write-Warning "No matching entry found in JSON for Id: '$id'"

        continue

    }


    # Extract addressPrefixes - safe navigation

    $prefixes = $null

    try {

        $prefixes = $match.properties.addressPrefixes

    } catch {

        $prefixes = $null

    }


    # Prepare safe filename (replace invalid filename chars)

    $safeName = $id -replace '[\\/:*?"<>|]', '_'

    $outFile = Join-Path $outputFolder ("{0}.csv" -f $safeName)


    if ($null -eq $prefixes) {

        # Write empty CSV with header only

        @([PSCustomObject]@{ addressPrefix = "" }) |

            Select-Object -First 0 | # no rows

            Export-Csv -Path $outFile -NoTypeInformation -Encoding UTF8 -Force

        Write-Host "No addressPrefixes for '$id' — created empty CSV with header: $outFile"

        continue

    }


    # Ensure prefixes is an array/list (if single string, convert to array)

    if ($prefixes -is [string]) {

        $prefixes = ,$prefixes

    }


    # Convert to objects and export

    $rows = $prefixes | ForEach-Object {

        [PSCustomObject]@{

            addressPrefix = $_

        }

    }


    $rows | Export-Csv -Path $outFile -NoTypeInformation -Encoding UTF8 -Force


    Write-Host "Exported $($rows.Count) prefixes for '$id' → $outFile"

}


Write-Host "Done."

Install-Module Microsoft.PowerApps.Administration.PowerShell

 Install-Module Microsoft.PowerApps.Administration.PowerShell

Add-PowerAppsAccount

Get-AdminPowerAppEnvironment -EnvironmentName "<your environment name>" | Select-Object EnvironmentName,LinkedFabricCapacity

If LinkedFabricCapacity is blank or $null, Dataverse still can’t see any valid Fabric capacity — likely due to trial/shared issue.