internal/functions/Get-ADGraphCache.ps1

function Get-ADGraphCache {
    <#
    .SYNOPSIS
    Queries information from the Active Directory and caches them.
 
    .DESCRIPTION
    Queries information from the Active Directory and caches them.
    This includes all users and groups of the named domain.
 
    .PARAMETER Domain
    The Domain which should be queried. This is used to connect to the server.
 
    .PARAMETER ReturnType
    Should the array of all users and groups be returned or the Indexed HashTable?
 
    .EXAMPLE
    Get-ADGraphCache -Domain "myDomain" -ReturnType HashTable
    Queries all Users/Groups as a HashTable
 
    .NOTES
    General notes
    #>

    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')]
    param (
        [Parameter(Mandatory = $true)]
        [string[]]$Domain,
        [ValidateSet("Array", "HashTable")]
        [Parameter(Mandatory = $true)]
        $ReturnType
    )
    if (!$global:ADGraphCacheTable) { $global:ADGraphCacheTable = @{} }
    $domainKey = $Domain -join ";"
    Write-PSFMessage "Query AD-Cache-Data, domainKey=$domainKey and ReturnType=$ReturnType"
    if ($global:ADGraphCacheTable.Contains($domainKey)) {
        Write-PSFMessage "Information cached"
        $cacheData = $global:ADGraphCacheTable[$domainKey]
    }
    else {
        Write-PSFMessage "Initial query"
        $allExistingGroupsAndUsers = @()
        foreach ($targetDomain in $Domain) {
            $allExistingGroupsAndUsers += Get-ADUser -filter { ( (ObjectClass -eq "user") -and (objectCategory -eq "Person")) } -properties CanonicalName, SamAccountName, Displayname, Description, memberOf, ObjectClass -server $targetDomain
            $allExistingGroupsAndUsers += Get-ADGroup -filter { (ObjectClass -eq "group") } -properties CanonicalName, SamAccountName, Displayname, Description, memberOf, members, ObjectClass -server $targetDomain
        }
        # Save all groups/users in one HashTable
        $allExistingGroupsAndUsersHash = @{ }
        $allExistingGroupsAndUsers | ForEach-Object { $allExistingGroupsAndUsersHash.Add($_.DistinguishedName, $_) }
        $cacheData = @{
            "Array"     = $allExistingGroupsAndUsers
            "HashTable" = $allExistingGroupsAndUsersHash
        }
        # $cacheData.add("Array",$allExistingGroupsAndUsers )
        # $cacheData.add("HashTable",$allExistingGroupsAndUsersHash)
        $global:ADGraphCacheTable[$domainKey] = $cacheData
    }
    $cacheData[$ReturnType]
}