Exchange Schema Version mit Powershell herausfinden

The estimated reading time 6 minutes

Während meiner täglichen Arbeit sehe ich viele unterschiedliche Active Directory und Exchange Umgebungen, deshalb brauche ich eine schnelle Methode um Exchange Schema Version und andere Konfigrationsversion zu bestimmen. Nach einem Update ist es ebenfalls ratsam die Versionen nochmals abzuprüfen. Es gibt hier bereits einige Links, welche teilweise Schema Version überprüfen, allerdings kaum ein Skript welches alle 3 ObjectVersionen überprüft. Aus diesem Grund habe ich ein Skript zur Bestimmung entwickelt welches in vielen Umgebungen funktionieren sollte. In meiner Testumgebung befindet sich ein Windows Server 2019 Core DC, ein Exchange 2019 Core und ein management Server (Windows Server 2019). Funktioniert auch mit älteren Exchange Server Versionen.
Zunächst mal das Ergebnis des Skriptes:

Damit das Skript funktioniert müssen einige Voraussetzungen auf dem ausführenden Server vorhanden sein.
1. Das Skript muss auf einem Server ausgeführt werden (kein Client mit RSAT unterstützt)
2.Execution Policy (das Skript ist nicht signiert, daher muss diese umgangen werden/ temporär ausgeschaltet werden)
3. Active Directory Powershell Modul
Das AD Modul muss ebenfalls installiert sein, da einige Elemente Cmdlets verwenden. Ich komme nachher nochmals darauf zurück.
Wenn du nun sagst, alles klar; hier schon mal das Skript zum Download.
(HINWEIS: auf einem Exchange Server ist das AD Powershell Modul immer schon installiert).

>>DOWNLOAD-LINK<<

oder man kann auch die Powershell Konsole zum runterladen verwenden.

$url = "https://blog.it-koehler.com/wp-content/uploads/2019/04/ad-schema-version-exchange-0.1.zip"
$dest = "C:\temp\ad-schema-version-exchange-0.1.zip"
Start-BitsTransfer -Source "$url" -Destination "$dest"

RAW Skript

<#
#### requires active directory powershell module on Windows Server####
<#
.SYNOPSIS
shows exchange schema version, objectVersion (Default),objectVersion (Configuration)
https://docs.microsoft.com/en-us/exchange/plan-and-deploy/prepare-ad-and-domains?view=exchserver-2019
.DESCRIPTION

.PARAMETER 
no parameters required
.INPUTS
none
.OUTPUTS

.NOTES
   Version:        0.1
   Author:         Alexander Koehler
   Creation Date:  Thursday, April 11th 2019, 8:25:41 pm
   File: ad-schema-version-exchange-0.1.ps1
   Copyright (c) 2019 blog.it-koehler.com
HISTORY:
Date      	          By	Comments
----------	          ---	----------------------------------------------------------

.LINK
   https://blog.it-koehler.com/en/

.COMPONENT
 Required Modules: ActiveDirectory Powershell (RSAT)

.LICENSE
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the Software), to deal
in the Software without restriction, including without limitation the rights
to use copy, modify, merge, publish, distribute sublicense and /or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
 
.EXAMPLE
change to the directory where script is stored then you can execute it with .\ad-schema-version-exchange-0.1.ps1
#>

#check if Powershell module is installed 
if((Get-WindowsFeature RSAT-AD-PowerShell).Installed){
   
  #get active directory information
  $schemaPath = (Get-ADRootDSE).schemaNamingContext
  #get exchange schema version
  Function Get-ExchangeUpperRange
  {
     Param(
     [parameter(Mandatory=$true)]
     [ValidateNotNullOrEmpty()]
     [Alias("Schemapath")]
     [String[]]
     $RootDSE
   )
  # additional information see https://eightwone.com/references/schema-versions/
  $schemaPath = "$RootDSE"
  $schemaobj = (Get-ADObject -filter * -SearchBase $schemaPath -Properties * | Where-Object {$_.Name -eq "ms-Exch-Schema-Version-Pt"})
  $rangeupper = $schemaobj.rangeUpper
  Write-Output "Exchange Schemaversion: $rangeupper"
  }
  #get exchange object version configuration  
  Function Get-ExchangeObjConf
  {
  $domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() 
  $distname = $domain.GetDirectoryEntry().distinguishedName 
  $config = [ADSI]"LDAP://CN=Microsoft Exchange,CN=Services,CN=Configuration,$distname" 
  $orgName = $config.psbase.children | Where-Object {$_.objectClass -eq 'msExchOrganizationContainer'} 
  $ldappath = (($orgName).Path)
  $objconfig = ([ADSI]"$ldappath")
  $objconfigver = $objconfig.objectVersion
  Write-Output "Exchange objectVersion (Configuration): $objconfigver"
  }
    #get exchange object configuration (default )  
  Function Get-ExchangeObjDefaultConf
  {
  $domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() 
  $distname = $domain.GetDirectoryEntry().distinguishedName 
  $objdefault = ([ADSI]"LDAP://CN=Microsoft Exchange System Objects,$distname")
  $objdefaultver =$objdefault.objectVersion
  Write-Output "Exchange objectVersion (Default): $objdefaultver"
  }
  Write-Host "### Exchange Active Directory versions ###"
  Get-ExchangeUpperRange -RootDSE "$schemaPath"
  Get-ExchangeObjDefaultConf
  Get-ExchangeObjConf 
  Write-Host " "
  Write-Host "###### additional links:" -ForegroundColor Yellow
  Write-Host "See also this link to check your schema version EX2019: https://docs.microsoft.com/en-us/exchange/plan-and-deploy/prepare-ad-and-domains?view=exchserver-2019#exchange-active-directory-versions" -ForegroundColor Yellow
  Write-Host "See also this link to check your schema version EX2016:https://docs.microsoft.com/en-us/exchange/plan-and-deploy/prepare-ad-and-domains?view=exchserver-2016#exchange-active-directory-versions" -ForegroundColor Yellow
  pause
  
  }
  else{
  
    throw "no active directory powershell module detected please check RSAT Tools 'Get-WindowsFeature RSAT-AD-PowerShell' please install RSAT Tools first on this machine before executing this script
    Import-Module ServerManager
    Add-WindowsFeature -Name 'RSAT-AD-PowerShell' -IncludeAllSubFeature "
 }  

Diejenigen, die sich mit PS Skripten auskennen, können hier aufhören zu lesen.
Für alle anderen, die nicht genau wissen was mit den oberen Punkten gemeint ist, hier noch einige wichtige Schritte um die Voraussetzungen zu schaffen.
Speichert das Skript als „.ps1“ Datei, damit der Server weiß es handelt sich um ein PowerShell Skript.

1.Execution Policy verhindert das ausführen von nicht signierten Skripten.

die Execution Policy sollte nur für diese Aufgabe ausgemacht werden, nach Beendigung auch wieder anschalten nicht vergessen.
Get-ExecutionPolicy
Set-ExecutionPolicy Unrestricted -Force

2.Active Directory PowerShell Module nicht installiert

Wer die Fehlermeldung sieht, sollte sie einfach mal lesen. Das Modul lässt sich einfach ebenfalls per Powershell nachinstallieren.

Import-Module ServerManager
Add-WindowsFeature -Name "RSAT-AD-PowerShell" -IncludeAllSubFeature

Nach dem das Skript ausgeführt wurde und die AD Versionen bekannt sind, die Execution Policy wieder aktivieren.

Set-ExecutionPolicy Restricted -Force

Wer das AD Modul ebenfalls wieder entfernen möchte, kann dies mit folgendem Befehl tun (Es wird dann aber ein Neustart fällig).

Remove-WindowsFeature -Name "RSAT-AD-PowerShell"

Wenn euch der Artikel gefallen hat, dann drückt auf „Helpful“. Wenn Fragen / Anregungen sind einfach einen Kommentar da lassen.
Viel Spaß beim Testen

Print Friendly, PDF & Email
Was this article helpful?
YesNo
0 0 votes
Article Rating
Abonnieren
Benachrichtige mich bei
guest
2 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
Johannes
Johannes
3 Jahre zuvor

Hallo Alexander, das Skript läuft wunderbar und ist sehr hilfreich. Vielen Dank für die Mühe!!