Exchange Schema Versions

Below is a list of Exchange versions and related schema versions.

Forest
For the forest, you can find out the current schema version by consulting the rangeUpper property of CN=ms-Exch-Schema-Version-Pt,cn=schema,cn=configuration,. To read the forest version, consult the objectVersion property of cn=,cn=Microsoft Exchange,cn=Services,cn=Configuration,.

For example, to find out the current Exchange forest schema version and forest version, use a tool like ADSIEDIT or use PowerShell (replace ‘Contoso’ with the name of your Exchange organization):

$RootDSE= ([ADSI]"").distinguishedName
([ADSI]"LDAP://CN=ms-Exch-Schema-Version-Pt,CN=Schema,CN=Configuration,$RootDSE").rangeUpper
([ADSI]"LDAP://cn=Contoso,cn=Microsoft Exchange,cn=Services,cn=Configuration,$RootDSE").objectVersion

Note that the values of these two properties do not always match for matching schema versions. Also, before Exchange 2003 objectVersion didn’t exist so you need to query rangeUpper in that case.

Domain
Besides the forest schema version there’s also a domain schema version (i.e. ForestPrep versus DomainPrep). To find out the schema version of the domain, query the objectVersion property in the Microsoft Exchange System Objects container of the .

$RootDSE= ([ADSI]"").distinguishedName
([ADSI]"LDAP://CN=Microsoft Exchange System Objects,$RootDSE").objectVersion

Versions

ExchangeForest
(rangeUpper)
Forest
(objectVersion)
Domain
(objectVersion)
2019 CU2-CU3(*)170011675413237
2019 CU1170001675213236
2019 RTM170001675113236
2016 CU13-CU14(*)153321621713237
2016 CU12153321621513236
2016 CU11153321621413236
2016 CU7-CU10(*)153321621313236
2016 CU6153301621313236
2016 CU4-CU5(*)153261621313236
2016 CU3153261621213236
2016 CU2153251621213236
2016 CU1153231621113236
2016 RTM153171621013236
2016 Preview153171604113236
2013 CU23153121613313237
2013 CU22153121613113236
2013 CU10-CU21(*)153121613013236
2013 CU7-CU9 (*)153121596513236
2013 CU6153031596513236
2013 CU5153001587013236
2013 SP1152921584413236
2013 CU3152831576313236
2013 CU2152811568813236
2013 CU1152541561413236
2013 RTM151371544913236
2010 SP3147341432213040
2010 SP2147321424713040
2010 SP1147261321413040
2010 RTM146221264012639
2007 SP3146251122211221
2007 SP2146221122211221
2007 SP1111161122111221
2007 RTM106371066610628
2003 SP2687069036936
2003 RTM687069036936
2000 SP34406N/A4406
2000 RTM4397N/A4406

*) Be advised that if later builds run the same schema versions as its predecessor, that does not necessarily mean you do not need prepare Active Directory (/PrepareAD). Preparing Active Directory may also introduce changes in the Role-Based Access Control configuration, for example. Consult the KB article of the update for guidance.

25 thoughts on “Exchange Schema Versions

  1. Exchange 2013 CU8 and Exchange 2013 Cu9 stay at the same versions as Exchange 2013 CU7
    rangeupper 15312 Forest(objectVersion)=15965; Domain(objectVersion)=13236

    Like

  2. Thank you very much for the comprehensive invormation about the Exchange schema version.
    For those who like to use a single script to test the current version:

    $ExchSchemaVersions = @{
    “4397-N/A-4406” = “2000 RTM”
    “4406-N/A-4406” = “2000 SP3”
    “6870-6903-6936” = “2003 RTM/SP2”
    “10637-10666-10628” = “2007 RTM”
    “11116-11221-11221” = “2007 SP1”
    “14622-11222-11221” = “2007 SP2”
    “14625-11222-11221” = “2007 SP3”
    “14622-12640-12639” = “2010 RTM”
    “14726-13214-13040” = “2010 SP1”
    “14732-14247-13040” = “2010 SP2”
    “14734-14322-13040” = “2010 SP3”
    “15137-15449-13236” = “2013”
    “15254-15614-13236” = “2013 CU1”
    “15281-15688-13236” = “2013 CU2”
    “15283-15763-13236” = “2013 CU3”
    “15292-15844-13236” = “2013 SP1/CU4”
    “15300-15870-13236” = “2013 CU5”
    “15303-15965-13236” = “2013 CU6”
    “15312-15965-13236” = “2013 CU7-9”
    “15317-16041-13236” = “2016 Preview”
    }
    $ExForestRangeUpper = Get-ADObject -Filter “CN -eq ‘ms-Exch-Schema-Version-Pt'” `
    -Searchbase “$( $RootDSE.SchemaNamingContext )” `
    -SearchScope OneLevel `
    -Property “rangeupper” |
    Select -expand rangeupper
    $ExForestObjectVersion = Get-ADObject -Filter “objectClass -eq ‘msExchOrganizationContainer'” `
    -Searchbase “CN=Microsoft Exchange,CN=Services,$( $RootDSE.configurationNamingContext )” `
    -SearchScope OneLevel `
    -Property “objectVersion” |
    Select -expand objectVersion

    $ExDomainObjectVersion = Get-ADObject `
    -Filter “CN -eq ‘Microsoft Exchange System Objects'” `
    -Searchbase “$( $RootDSe.rootDomainNamingContext )” `
    -SearchScope OneLevel `
    -Property “objectVersion” |
    Select -expand objectVersion
    “” |
    Select @{ n=”SchemaType”; e={ “Exchange” } },
    @{ n=”VersionNumber”; e={ “$ExForestRangeUpper – $ExForestObjectVersion – $ExDomainObjectVersion” } },
    @{ n=”VersionName”; e={
    if( $ExchSchemaVersions.ContainsKey( “$ExForestRangeUpper-$ExForestObjectVersion-$ExDomainObjectVersion” ) ) {
    $ExchSchemaVersions.”$ExForestRangeUpper-$ExForestObjectVersion-$ExDomainObjectVersion”
    } else {
    “TBD”
    }
    } }

    Like

  3. I have no attributes listed under my ms-Exch-Schema-Version-Pt ? I installed Ex2013 Cu12 and want to verify I see the correct range upper version.

    Like

  4. It Looks like here is a small typ in your code sample in Lines 3

    Current: “LDAP://cn=,cn=Microsoft ….”
    a placeholder for something like “” is not visible

    Better “LDAP://cn=%orgname%,cn=Microsoft ….”

    Frank

    Like

  5. Just wanting to clarify: Does the 2019 Preview and 2016 CU7-CU10(*) have the same versions of Forest (rangeUpper), Forest (objectVersion), and Domain (objectVersion).

    Thanks!

    Like

  6. Instead of separate commands, use this to check all 3 main schema values in one hit:

    #Displays current AD Schema info

    $RootDSE = ([ADSI]””).distinguishedName
    $OrgName = (Get-OrganizationConfig).name

    $obj = new-object psobject -property @{
    ForestRangeUpper = ([ADSI]”LDAP://CN=ms-Exch-Schema-Version-Pt,CN=Schema,CN=Configuration,$RootDSE”).rangeUpper
    ForestObjectVersion = ([ADSI]”LDAP://cn=$OrgName,cn=Microsoft Exchange,cn=Services,cn=Configuration,$RootDSE”).objectVersion
    DomainObjectVersion = ([ADSI]”LDAP://CN=Microsoft Exchange System Objects,$RootDSE”).objectVersion
    }

    $obj | select ForestRangeUpper,ForestObjectVersion,DomainObjectVersion

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s