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.
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
Hallo Alexander, das Skript läuft wunderbar und ist sehr hilfreich. Vielen Dank für die Mühe!!
Hallo Johannes,
vielen Dank für das Feedback.
Viele Grüße Alexander