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
Exchange | Forest (rangeUpper) | Forest (objectVersion) | Domain (objectVersion) |
---|---|---|---|
2019 CU13 | 17003 | 16761 | 13243 |
2019 CU12 | 17003 | 16760 | 13243 |
2016 CU23 | 15334 | 16223 | 13243 |
2019 CU11 | 17003 | 16759 | 13242 |
2016 CU22 | 15334 | 16222 | 13242 |
2013 CU23 w/KB5004778 | 15312 | 16133 | 13237 |
2019 CU10 | 17003 | 16758 | 13241 |
2019 CU9 | 17002 | 16757 | 13240 |
2019 CU8 | 17002 | 16756 | 13239 |
2019 CU7 | 17001 | 16755 | 13238 |
2019 CU2-CU6(*) | 17001 | 16754 | 13237 |
2019 CU1 | 17000 | 16752 | 13236 |
2019 RTM | 17000 | 16751 | 13236 |
2016 CU21 | 15334 | 16221 | 13241 |
2016 CU20 | 15333 | 16220 | 13240 |
2016 CU19 | 15333 | 16219 | 13239 |
2016 CU18 | 15332 | 16218 | 13238 |
2016 CU13-CU17(*) | 15332 | 16217 | 13237 |
2016 CU12 | 15332 | 16215 | 13236 |
2016 CU11 | 15332 | 16214 | 13236 |
2016 CU7-CU10(*) | 15332 | 16213 | 13236 |
2016 CU6 | 15330 | 16213 | 13236 |
2016 CU4-CU5(*) | 15326 | 16213 | 13236 |
2016 CU3 | 15326 | 16212 | 13236 |
2016 CU2 | 15325 | 16212 | 13236 |
2016 CU1 | 15323 | 16211 | 13236 |
2016 RTM | 15317 | 16210 | 13236 |
2016 Preview | 15317 | 16041 | 13236 |
2013 CU23 | 15312 | 16133 | 13237 |
2013 CU22 | 15312 | 16131 | 13236 |
2013 CU10-CU21(*) | 15312 | 16130 | 13236 |
2013 CU7-CU9 (*) | 15312 | 15965 | 13236 |
2013 CU6 | 15303 | 15965 | 13236 |
2013 CU5 | 15300 | 15870 | 13236 |
2013 SP1 | 15292 | 15844 | 13236 |
2013 CU3 | 15283 | 15763 | 13236 |
2013 CU2 | 15281 | 15688 | 13236 |
2013 CU1 | 15254 | 15614 | 13236 |
2013 RTM | 15137 | 15449 | 13236 |
2010 SP3 | 14734 | 14322 | 13040 |
2010 SP2 | 14732 | 14247 | 13040 |
2010 SP1 | 14726 | 13214 | 13040 |
2010 RTM | 14622 | 12640 | 12639 |
2007 SP3 | 14625 | 11222 | 11221 |
2007 SP2 | 14622 | 11222 | 11221 |
2007 SP1 | 11116 | 11221 | 11221 |
2007 RTM | 10637 | 10666 | 10628 |
2003 SP2 | 6870 | 6903 | 6936 |
2003 RTM | 6870 | 6903 | 6936 |
2000 SP3 | 4406 | N/A | 4406 |
2000 RTM | 4397 | N/A | 4406 |
*) 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.
Nice, to see such useful information in tabular format. Keep it up.
LikeLike
Very good, thank.
LikeLike
Exchange 2013 CU1: Forest(rangeUpper)=15254; Forest(objectVersion)=15614; Domain(objectVersion)=13236
LikeLike
Thanks (forget to add those apparently)
LikeLike
Thank you for the inspiration. Updated … http://wp.me/p3F67S-2K
LikeLike
Thank you!!
LikeLike
Thanks, came in handy!
LikeLike
Exchange 2013 CU8 and Exchange 2013 Cu9 stay at the same versions as Exchange 2013 CU7
rangeupper 15312 Forest(objectVersion)=15965; Domain(objectVersion)=13236
LikeLike
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”
}
} }
LikeLike
Sorry, forgot one line at the begining of the script:
$RootDSE = Get-ADRootDSE
LikeLike
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.
LikeLike
You did run the first line to get the forest DN?
$RootDSE=([ADSI]”).distinguishedName
([ADSI]”LDAP://CN=ms-Exch-Schema-Version-Pt,CN=Schema,CN=Configuration,$RootDSE”).rangeUpper
LikeLike
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
LikeLike
Lost in HTML formatting 🙂 – Corrected, thanks!
LikeLike
Hi there,
To add to this great list, Exchange 2016 CU5 is: Forest(rangeUpper)=15326; Forest(objectVersion)=16213; Domain(objectVersion)=13236
LikeLike
Yeah, hasn’t changed since last CU (same for Ex2016) but forgot to reflect here. Thanks for the heads-up!
LikeLike
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!
LikeLike
Correct for Ex2019 preview
LikeLike
Do we have a new # for 2016 CU12?
LikeLike
Yes – table updated
LikeLike
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
LikeLike
Thank you !!!
LikeLike
Do you have new #s for 2016 CU14? Thank you for keeping this table. I’ve used it several times in the past.
LikeLike
No schema update for CU14- will update
LikeLike
Thank you!!!
LikeLike
This is the best one-stop-shop for Schema versioning when it comes to upgrading Exchange. Thanks a bunch.
LikeLike
Thanks for keeping this article updated.
LikeLike
Thanks for the quick posting of the Exchange 2013 CU23+SU values Michel
LikeLike
Very useful and helpful article. Thank you for constantly updating.
LikeLike
very very useful and helpful!
Thanks for updating!
LikeLike
Was there a new schema version number for the Exchange 2013 May 2022 security update? The last SU listed above was the July 2021 SU (KB5004778). – Thanks!
LikeLike
No. Like KB5004778 (Jun21), KB5014260 (May22) was no exception to the “rule” that SUs don’t update schemas, but you need to prep the forest/domain to implement AD-level “hardening changes” related to the underlying CVE’s. See https://learn.microsoft.com/en-us/exchange/prepare-active-directory-and-domains-exchange-2013-help
LikeLike
Great article, Thanks Michel
It looks like copy paste error on the latest FObjver and DObjver
EXCHANGE FOREST (RANGEUPPER) FOREST (OBJECTVERSION) DOMAIN
2019 CU13 17003 13243 16761
2019 CU12 17003 16760 13243
LikeLike
Thanks for catching that.
LikeLike