Private/Core/Initialize-ADData.ps1

function Initialize-ADData {

    Write-Log "Initializing AD data cache..."

    # Define property sets for each object type
    $userProperties = @(
        'SamAccountName',
        'DistinguishedName',
        'Enabled',
        'Created',
        'MemberOf',
        'ServicePrincipalNames',
        'EmailAddress',
        'DisplayName',
        'PasswordLastSet',
        'PasswordNeverExpires',
        'PasswordExpired',
        'LastLogonDate'
    )

    $computerProperties = @(
        'Name',
        'IPv4Address',
        'DistinguishedName',
        'OperatingSystem',
        'OperatingSystemVersion',
        'OperatingSystemServicePack',
        'Enabled',
        'LastLogonDate',
        'Created',
        'Modified',
        'DNSHostName',
        'SID',
        'ServicePrincipalNames',
        'MemberOf'
    )

    $groupProperties = @(
        'Name',
        'Description',
        'GroupCategory',
        'GroupScope',
        'Members',
        'MemberOf',
        'DistinguishedName',
        'Created',
        'Modified'
    )
    # Organizational Units
    # Typical OU properties are minimal; if more are needed, add them here.
    $ouProperties = @(
        'DistinguishedName',
        'Name',
        'Description',
        'Created',
        'Modified'
    )

    # Domain Controllers
    # Common properties you might need:
    $dcProperties = @(
        'DNSHostName',
        'IPv4Address',
        'HostName',
        'Site',
        'IsGlobalCatalog',
        'Enabled',
        'OperatingSystem',
        'OperatingSystemVersion'
    )

    # Replication Sites
    # `Get-ADReplicationSite` supports a limited set of properties by default.
    # We'll specify common properties if needed:
    $siteProperties = @(
        'DistinguishedName',
        'Name',
        'Location',
        'Description',
        'Created',
        'Modified'
    )

    # Trusts
    # `Get-ADTrust` supports -Properties. Use * to get all properties or customize:
    $trustProperties = @(
        'Name',
        'Source',
        'Target',
        'TrustType',
        'Direction',
        'DisallowTransivity',
        'IntraForest',
        'TGTQuota',
        'DistinguishedName'
    )

    # Retrieve and store objects
    $script:AllUsers = Get-ADUser -Filter * -Properties $userProperties
    $script:AllComputers = Get-ADComputer -Filter * -Properties $computerProperties
    $script:AllGroups = Get-ADGroup -Filter * -Properties $groupProperties
    $script:AllOUs = Get-ADOrganizationalUnit -Filter * -Properties $ouProperties
    $script:AllDCs = Get-ADDomainController -Filter * -Properties $dcProperties
    $script:ForestInfo = Get-ADForest  # no -Properties available
    $script:AllSites = Get-ADReplicationSite -Filter * -Properties $siteProperties
    $script:AllSubnets = Get-ADReplicationSubnet -Filter * -Properties *
    $script:AllSiteLinks = Get-ADReplicationSiteLink -Filter * -Properties *
    $script:AllReplConnections = Get-ADReplicationConnection -Filter * -Properties *
    $script:AllTrusts = Get-ADTrust -Filter * -Properties $trustProperties

    # Summary log
    Write-Log ("AD data cache initialized: " +
        "Users: $($script:AllUsers.Count), " +
        "Computers: $($script:AllComputers.Count), " +
        "Groups: $($script:AllGroups.Count), " +
        "OUs: $($script:AllOUs.Count), " +
        "DomainControllers: $($script:AllDCs.Count), " +
        "Sites: $($script:AllSites.Count), " +
        "Trusts: $($script:AllTrusts.Count)")

}