Public/Get-UserADEntry.ps1

function Get-UserADEntry {
    <#
    .SYNOPSIS
        Получает объект AD по лоигну пользователя.
    .DESCRIPTION
        Возвращает Directory Entry на основании SamAccountName.
    .PARAMETER SamAccountName
        SamAccountName для поиска в каталоге.
    .PARAMETER Domain
        Указывает на домен для поиска.
        Если ничего не указано, поиск будет выполнен в текущем домене.
    .EXAMPLE
        $vADUser = Get-UserADEntry -SamAccountName $vUserLoginName
        Write-Host $vADUser.mail
    .INPUTS
        SamAccountName и, опционально, домен пользователя.
    .NOTES
        Функция ориентирована на использование в скрипта, которые выполняются от имени пользователя.
        Функция позволяет получать данные о пользователе не использую модуль ActiveDirectory.
        Опциональный параметр -Domain может быть либо в формате FQDN, либо - DN.
    #>

    [CmdletBinding()]
    [OutputType([System.DirectoryServices.DirectoryEntry])]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)]
        [System.String]
        $SamAccountName,
        [Parameter(Mandatory = $false, ValueFromPipeline = $false, Position = 1)]
        [System.String]
        $Domain
    )
    begin {
        Write-Warning -Message 'The function <Get-UserADEntry> is deprecated. Use the module <ArielAD> instead.'
        try {
            if ($IsLinux) {
                throw [System.Configuration.ConfigurationException]::New('This operation system does not supported.')
            }
            if ($Domain) {
                # Если домен похож на FQDN...
                if ($Domain -Match "(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}$)") {
                    $arr = $Domain.Split('.')
                    for ($i = 0; $i -lt $arr.count; $i++) {
                        $arr[$i] = 'DC=' + $arr[$i]
                    }
                    $Domain = $arr -join ','
                }
                # Теперь домен должен быть корректным DN
                if ($Domain -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."
                }
            }
            else {
                $vDirectorySearcher = New-Object System.DirectoryServices.DirectorySearcher
            }
        }
        catch {
            #$PSCmdlet.ThrowTerminatingError($PSItem)
            Write-Error -Exception $PSItem.Exeception
        }
    }

    process {
        try {
            if ($IsLinux) {
                throw [System.Configuration.ConfigurationException]::New('This operation system does not supported.')
            }
            $vDirectorySearcher.Filter = "(&(objectCategory=User)(samAccountName=$SamAccountName))"
            $Result = ($vDirectorySearcher.FindOne()).GetDirectoryEntry()
        }
        catch {
            #$PSCmdlet.ThrowTerminatingError($PSItem)
            Write-Error -Exception $PSItem.Exeception
        }
    }

    end {
        return $Result
    }
}