Functions/Add-AHResourceToAddMyIPTo.ps1

Function Add-AHResourceToAddMyIPTo {
    <#
.SYNOPSIS
    Adds a resource to the list of resources to add or remove my IP to.
.DESCRIPTION
    Adds a resource to the list of resources to add or remove my IP to. The list is then used by other cmdlets found in the LINK section of the help.
.PARAMETER ResourceId
    Define the resource to be added
.PARAMETER ResourceGroupName
    The name of a resource group. All resources in the resource group will be added.
.EXAMPLE
    Add-AHResourceToAddMyIPTo -ResourceId /subscriptions/xxxxxxxx-a123-asdf-1234-123456abcdef/resourceGroups/Test1RG/providers/Microsoft.Storage/storageAccounts/sa2
    Add-AHResourceToAddMyIPTo -ResourceId /subscriptions/xxxxxxxx-a123-asdf-1234-123456abcdef/resourceGroups/Test1RG/providers/Microsoft.KeyVault/vaults/KV5
    Add-AHResourceToAddMyIPTo -ResourceId /subscriptions/xxxxxxxx-a123-asdf-1234-123456abcdef/resourceGroups/Test1RG/providers/Microsoft.Sql/servers/ss1

    Adds a storage account, key vault, and sql server to the list
.EXAMPLE
    Add-AHResourceToAddMyIPTo -GUI

    Use the GUI to select the resources to add to the list.
.EXAMPLE
    Add-AHResourceToAddMyIPTo -ResourceGroupName Test1RG
    Add-AHMyIPToResources
    #do my work here
    Remove-AHMyIPFromResources
    (Get-AHResourceToAddMyIPTo).Id | Remove-AHResourceToAddMyIPTo
    Add-AHResourceToAddMyIPTo -ResourceGroupName Test2RG

    Adds all resources in the Test1RG resource group to the list, then adds my public IP to the firewall rules on those resource, then removes access to resources, then clears the list to start work in another resource group
.INPUTS
    String
.OUTPUTS
.NOTES
    Author: Paul Harrison
.LINK
    Get-AHResourceToAddMyIPTo
    Remove-AHResourceToAddMyIPTo
    Export-AHMyResourcesToAddMyIPTo
    Import-AHMyResourcesToAddMyIPTo
    Add-AHMyIPToResources
    Remove-AHMyIPFromResources
    Get-AHMyPublicIP
#>

    [CmdletBinding()]
    param(
        [Parameter(ParameterSetName = "ResourceId", Mandatory = $true, ValueFromPipeline = $true)]
        [string]
        $ResourceID,

        [Parameter(ParameterSetName = "ResourceGroup", Mandatory = $true)]
        [string]
        $ResourceGroupName,

        [parameter(ParameterSetName = "GUI", Mandatory = $true)]
        [switch]
        $GUI
    )
    begin {
        If ($Null -eq $Script:ResourceToAddMyIPTo) {
            $Script:ResourceToAddMyIPTo = @()
        }
    }

    process {
        If ($GUI) {
            If ('System.Management.Automation.ServerRemoteDebugger' -eq [System.Management.Automation.Runspaces.Runspace]::DefaultRunspace.Debugger.GetType().FullName) {
                throw "The GUI switch can only be used on a local host and cannot be used from a remote session."
            }
            elseif ((get-item env:/).Name -contains 'AZURE_HTTP_USER_AGENT') {
                throw "The GUI switch can only be used on a local host and cannot be used from Azure Cloud Shell."
            }           

            $Resources = Get-AzResource | Out-GridView -PassThru -Title 'Select the resources to add your IP to' 
            If (-not $?) {
                Throw "Something went wrong"
            }
            Else {
                ForEach ($Resource in $Resources) {
                    Add-AHResourceToAddMyIPTo -ResourceID $Resource.ResourceId
                }
            }
        }
        ElseIf ($ResourceID) {
            $MyResource = Get-AzResource -ResourceId $ResourceID
            If (-not $?) {
                #The resource no longer exists
                return 
            }
            Else {
                $Script:ResourceToAddMyIPTo += [PSCustomObject]@{
                    subscription = $MyResource.ResourceId.Split('/')[2] #this is faster than querying context, if this doesn't work at somepoint then replace with (Get-AzContext).Subscription.Id
                    Type         = $MyResource.Type
                    Id           = $MyResource.ResourceId
                }
            }
        }
        ElseIf ($ResourceGroupName) {
            $Resources = Get-AzResource -ResourceGroupName $ResourceGroupName
            If (-not $?) {
                Throw "The resource group $ResourceGroupName does not exist."
            }
            Else {
                ForEach ($Resource in $Resources) {
                    Add-AHResourceToAddMyIPTo -ResourceID $Resource.ResourceId
                }
            }


        }
    }

}