Public/Get-IDIDevice.ps1

function Get-IDIDevice{
    <#
    .SYNOPSIS
        Get Intune Device and compile notes (json) into the output
 
    .DESCRIPTION
        Get Intune Device and compile notes (json) into the output
 
    .PARAMETER ScopeTag
        Get Intune Devices with specific scope tag
 
    .PARAMETER Group
        Get Intune Devices within a specific group
 
    .PARAMETER User
        Get Intune Devices from a specific user (UPN)
 
    .PARAMETER deviceName
        Get Intune Devices by name
 
    .PARAMETER id
        Get Intune Devices by id (deviceID)
 
    .PARAMETER azureADDeviceId
        Get Intune Device by azureADDeviceId
 
    .PARAMETER All
        Get all Intune Devices
 
    .PARAMETER Grid
        Switch to select Intune Devices out of a GridView
 
    .PARAMETER Progress
        Switch to show progress for loading notes
 
    #>


    param (
        #[parameter(Mandatory = $false, HelpMessage = "Get Intune Devices with specific scope tag")]
        #[ValidateNotNullOrEmpty()]
        #[string]$ScopeTag,

        [parameter(Mandatory = $false, HelpMessage = "Get Intune Devices within a specific group")]
        [ValidateNotNullOrEmpty()]
        [string]$Group,

        [parameter(Mandatory = $false, HelpMessage = "Get Intune Devices from a specific primary user (UPN)")]
        [ValidateNotNullOrEmpty()]
        [string]$User,

        [parameter(Mandatory = $false, HelpMessage = "Get Intune Devices by Device Name")]
        [ValidateNotNullOrEmpty()]
        [string]$deviceName,

        [parameter(Mandatory = $false, HelpMessage = "Get Intune Devices by id")]
        [ValidateNotNullOrEmpty()]
        [string]$id,

        [parameter(Mandatory = $false, HelpMessage = "Get Intune Devices by azureADDeviceId")]
        [ValidateNotNullOrEmpty()]
        [string]$azureADDeviceId,

        [parameter(Mandatory = $false, HelpMessage = "Get all Intune Devices")]
        [ValidateNotNullOrEmpty()]
        [switch]$All,

        [parameter(Mandatory = $false, HelpMessage = "Switch to select Intune Devices out of a GridView")]
        [ValidateNotNullOrEmpty()]
        [switch]$Grid,

        [parameter(Mandatory = $false, HelpMessage = "Switch to show progress for loading notes")]
        [ValidateNotNullOrEmpty()]
        [switch]$Progress

    )

    # Set script variable for error action preference
    $ErrorActionPreference = "Stop"

    # Colection Variable
    $SelectedIDIDevices = @()

    if($All){
        Write-Verbose "Get all managed Devices from Intune..."
        if($Progress){Write-Output "Reading all managed devices, progress starts shortly..."}
        $uri = "https://graph.microsoft.com/beta/deviceManagement/managedDevices"
        $Method = "GET"
        $IntuneDevices = (Invoke-PagingRequest -URI $uri -Method $Method)
        
        $global:IDIDevices_all = $IntuneDevices
        Write-Verbose "All devices ($($global:IDIDevices_all.count)) saved in `$global:IDIDevices_all"
    
    }elseif($ScopeTag){
        # tbd
        Write-Warning "Parameter -ScopeTag is in the making, please use anotherone in the meantime"

    }elseif($Group){
        Write-Verbose "Get group ID for $Group ..."
        $uri = "https://graph.microsoft.com/beta/groups?`$filter=displayName%20eq%20'$Group'"
        $GroupID = (Invoke-MSGraphRequest -HttpMethod GET -Url $uri -ErrorAction Stop).value.id
        
        Write-Verbose "Get group members for ID: $GroupID ..."
        $uri = "https://graph.microsoft.com/beta/groups('$GroupID')/transitiveMembers"
        $Method = "GET"
        $GroupMembersID = (Invoke-PagingRequest -URI $uri -Method $Method).deviceId
        
        Write-Verbose "Call function with -azureADDeviceId ($($GroupMembersID.count) members found)..."
        foreach($AADDID in $GroupMembersID){
            if($AADDID){  $IntuneDevices += Get-IDIDevice -azureADDeviceId $AADDID    }
        }
        
    }elseif($User){
        Write-Verbose "Get managed Intune Devices where user is: $User ..."
        $uri = "https://graph.microsoft.com/beta/deviceManagement/managedDevices?`$filter=userPrincipalName%20eq%20'$User'"     
        $IntuneDevices = (Invoke-MSGraphRequest -HttpMethod GET -Url $uri -ErrorAction Stop).value
    }elseif($deviceName){
        Write-Verbose "Get managed Device from Intune with name: $deviceName ..."
        $uri = "https://graph.microsoft.com/beta/deviceManagement/managedDevices?`$filter=deviceName%20eq%20'$deviceName'"     
        $IntuneDevices = (Invoke-MSGraphRequest -HttpMethod GET -Url $uri -ErrorAction Stop).value
        
    }elseif($id){
        Write-Verbose "Get managed Device from Intune by id: $id ..."
        $uri = "https://graph.microsoft.com/beta/deviceManagement/managedDevices('$id')"
        $IntuneDevices = (Invoke-MSGraphRequest -HttpMethod GET -Url $uri -ErrorAction Stop)

    }elseif($azureADDeviceId){
        Write-Verbose "Get managed Device from Intune by azureADDeviceId: $azureADDeviceId ..."
        $uri = "https://graph.microsoft.com/beta/deviceManagement/managedDevices?`$filter=azureADDeviceId%20eq%20'$azureADDeviceId'"     
        $IntuneDevices = (Invoke-MSGraphRequest -HttpMethod GET -Url $uri -ErrorAction Stop).value

    }elseif($Grid)
    {
        $SelectedIDIDevices = Get-IDIDevice -All | Out-GridView -Title "Please select your devices" -OutputMode Multiple
        return $SelectedIDIDevices
        break

    }else{
        Write-Warning "No Parameter specified for Get-IDIDevice"
    }

    if(!$IntuneDevices){
        Write-Warning "No device was found with the specified search criteria."
    }else{
        Write-Verbose "Get notes for selected managed Device from Intune ..."
        if($Progress){
            # Variables for write Progress
            $TotalItems = $IntuneDevices.Count
            $CurrentItem = 0
            $PercentComplete = 0
        }
        if($IntuneDevices.count -gt 1){
            foreach($IntuneDevice in $IntuneDevices){
                if($Progress){
                    Write-Progress -Activity "Reading notes from $TotalItems devices..." -Status "$PercentComplete% Complete:" -PercentComplete $PercentComplete
                    $CurrentItem++
                    $PercentComplete = [int](($CurrentItem / $TotalItems) * 100)
                }
                $SelectedIDIDevices += Get-IDIDeviceNotes -IDIDevice $IntuneDevice
            }
        }else{  $SelectedIDIDevices = Get-IDIDeviceNotes -IDIDevice $IntuneDevices[0]   }
        
        return $SelectedIDIDevices
    }
}