Public/Get-ADEntryGroups.ps1

function Get-ADEntryGroups {
    <#
    .SYNOPSIS
        Возвращает список групп для указанного Distinguished Name
    .DESCRIPTION
        Возвращает список всех групп, членом которых является объект с указанным Distinguished Name
    .EXAMPLE
        PS C:\> Get-ADEntryGroups -DistinguishedName 'CN=Владимир Ильичев,OU=Отдел эксплуатации информационных систем,OU=Staffing Establishment,OU=.Users,DC=corp,DC=atmd,DC=ru'
        Функция возвращает объект SearchResultCollection, сожержащий группы.
    .INPUTS
        Distinguished Name объекта Active Directory
    .OUTPUTS
        SearchResultCollection с перечнем групп.
    .NOTES
        Функция использует фильтр (member:1.2.840.113556.1.4.1941:=$DistinguishedName) и добавляет к этому списку Primary Group.
        Почему надо добавлять основную группу отдельно - можно почитать тут: https://sergeyvasin.net/2017/09/18/primary-group/
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)]
        [System.String]
        $DistinguishedName
    )

    begin {
        Write-Warning -Message 'The function <Get-ADEntryGroups> is deprecated. Use the module <ArielAD> instead.'
        try {
            if ($IsLinux) {
                throw [System.Configuration.ConfigurationException]::New('This operation system does not supported.')
            }
            $DistinguishedName = $DistinguishedName.ToLower()
            $Domain = $DistinguishedName.Substring($DistinguishedName.IndexOf("dc="))
            # Как можно догодаться, Dn - это DN. Если нет - ошибка.
            if ($DistinguishedName -Match '^(?:(?<cn>CN=(?<name>(?:[^,]|\,)*)),)?(?:(?<path>(?:(?:CN|OU)=(?:[^,]|\,)+,?)+),)?(?<domain>(?:DC=(?:[^,]|\,)+,?)+)$') {
                $vDomainDirectoryEntry = New-Object System.DirectoryServices.DirectoryEntry($("LDAP://$Domain"))
                $vDirectorySearcher = New-Object System.DirectoryServices.DirectorySearcher($vDomainDirectoryEntry)
            }
            # Иначе - ошибка
            else {
                throw "Не удается привести значение <$Domain> к виду DN."
            }
        }
        catch {
            #$PSCmdlet.ThrowTerminatingError($PSItem)
            Write-Error -Exception $PSItem.Exeception
        }
    }
    process {
        try {
            if ($IsLinux) {
                throw [System.Configuration.ConfigurationException]::New('This operation system does not supported.')
            }
            # Старый "трюк" по поиску всех групп. Вернее, всех, кроме Primary Group.
            $vDirectorySearcher.Filter = "(member:1.2.840.113556.1.4.1941:=$DistinguishedName)"
            $Result = $vDirectorySearcher.FindAll()

            # Теперь необходимо получить Primary Group. Для этого нам нужен SID "домена" Primary Group ID.
            # Вот это SID домена.
            $vDomainSID = ConvertTo-SID -ByteArray $vDomainDirectoryEntry.Properties.objectsid

            # Для Primary Group ID нужен сам объект, у которого мы посмтрим Properties.primarygroupid
            $vDirectorySearcher.Filter = "(distinguishedName=$DistinguishedName)"
            $vCurrentADObject = $vDirectorySearcher.FindOne()
            # Имея SID и Primary Group ID можем получить и группу.
            $vDirectorySearcher.Filter = "(objectSID=$($vDomainSID + '-' + $vCurrentADObject.Properties.primarygroupid))"
            $vPrimaryGroup = $vDirectorySearcher.FindAll()
            # Добавляем найденную группу к списку.
            $Result += $vPrimaryGroup
        }
        catch {
            #$PSCmdlet.ThrowTerminatingError($PSItem)
            Write-Error -Exception $PSItem.Exeception
        }
    }
    end {
        return $Result
    }
}