Outlook App, ADFS et certificat

Ca ne marche pas. Le Azure MFA fonctionne, le O365 MFA fonctionne, mais sur la partie certificat, il n’y a pas de popup présentant les certificats disponibles, il n’y a pas non plus de sélection automatique du certificat. A priori pas de volonté de MS de supporter ce scénario, pourtant très demandé des sociétés qui glissent vers le Cloud depuis un SI très contrôle.

Enough said…

Outlook 2016 et Kerberos

Contexte : Exchange 2010 et 2016 en cohabitation, client 2010 et 2016, authentification NTLM

Petite mésaventure : une fois installé Exchange 2016 en coexistence avec Exchange 2010, les clients Outlook 2010 fonctionnent correctement, mais pas les Outlook 2016 : ceux-ci n’arrivent pas à interroger le service Autodiscover.

Un petit tour dans les logs IIS montrent bien des connexions provenant de ces clients sur le service AutoD, mais sans information d’identification, avec donc une tentative d’accès Anonyme qui est rejetée.

Comparaison sur les traces Fiddler entre un client Outlook 2010 et un client Outlook 2016 : le client Outlook 2010 tente une authentification en Kerberos, puis bascule sur NTLM. Le client Outlook 2016 tente une authentification Kerberos… et voila.

Je n’ai pas configuré l’authentification Kerberos sur Exchange 2016, et celui-ci n’est pas utilisé sur l’ancienne plate-forme… par contre une tentative de bascule vers Kerberos avait été réalisée par le passée. La configuration avait été enlevée, sauf les SPN qui étaient configurés sur le CAS Array 2010.

Résolution : purge des SPN via setspn -D et ca remarche…

 

 

 

 

 

 

Azure Ressource Manager : un template JSON

Un petit template JSON que j’apprécie particulièrement, il permet de construire très rapidement des labs complets en mode IaaS via Azure ARM v2.
Toutes les VM sont créés de façon identique, dans une bulle complétement autonome au niveau stockage et réseau. Les OS sont hardcodés sur du 2012 R2, mais cela n’est pas compliqué à changer.

Pour l’utiliser, une fois basculé en mode ARM :

New-AzureResourceGroup -Name testARMBJDC -Location "north europe" -TemplateFile .\ARM.json -Verbose 

En argument :

      locationFromTemplate : l’emplacement où déployer les VM (qui peut être différent de l’emplacement où est “créer” le resourcegroup)

 

      nameFromTemplate : le nom utilisé pour construire les différentes ressources (stockage, réseau, etc.)

 

      vmSize : la taille des VM

 

      vnet_AddressSpace : le réseau

 

      publicip_DNS : le nom public des VM, attention car si ce nom existe deja, le déploiment sera en échec!

 

      vm_name : le nom des serveurs

 

      vm_admin : le nom de l’administrateur

 

      vm_pwd : le mot de passe par défaut

 

    vm_count : le nombre de VM a créer

Le code du JSON :

{
  "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json",
  "contentVersion": "1.0.0.0",
 
  "parameters": {
	"location" : {
		"type": "String",
		"defaultValue": "West Europe",
		"allowedValues": [
			"Central US",
			"South Central US",
			"East US",
			"West US",
			"North Central US",
			"East US 2",
			"North Europe",
			"West Europe",
			"Southeast Asia",
			"East Asia",
			"Japan West",
			"Japan East",
			"Brazil South"			
		],
		"metadata": {
			"Description": "Datacenter Location"
		}
	},
	"name": {
		"type": "String",
		"defaultValue": "testbrucejdc",
		"metadata": {
			"Description": "Root named used for resources"
		}
	},
	"vmSize" : {
		"type": "String",
		"defaultValue": "Basic_A1",
		"metadata": {
			"Description": "VM Size"
		}
	},
	"vnet_AddressSpace": {
		"type": "String",
		"defaultValue": "172.16.0.0/24",
		"metadata": {
			"Description": "Virtual Network subnet"
		}
	},
	"publicip_DNS": {
		"type": "String",
		"defaultValue": "testbrucejdc",
		"metadata": {
			"Description": "VM public IP DNS"
		}
	},
	"vm_name": {
		"type": "String",
		"defaultValue": "SRV",
		"metadata": {
			"Description": "VM Name"
		}
	},
	"vm_admin": {
		"type": "String",
		"defaultValue": "bjdc",
		"metadata": {
			"Description": "VM admin username"
		}
	},
	"vm_pwd": {
		"type": "SecureString",
		"defaultValue": "Premier*01",
		"metadata": {
			"Description": "VM admin password"
		}
	},
	
	"vm_count": {
		"type": "int",
		"defaultValue": 1,
		"metadata": {
			"Description": "Number of VM"
		}
	}
  },
    
  "variables": {	
	"author" : "brucejdc@brucejdc.fr",
	"storage_name" : "[toLower(concat(parameters('name'),'storage'))]",
	"storage_type": "Standard_LRS",
	"storage_uri" : "[concat('https://',variables('storage_name'),'.blob.core.windows.net')]",
	
	"vnet_name": "[concat(parameters('name'),'vnet')]",
	"vnet_ID": "[resourceId('Microsoft.Network/virtualNetworks',variables('vnet_name'))]",
	"vnet_subnet_name": "Subnet1",
	"vnet_subnet_ref": "[concat(variables('vnet_ID'),'/subnets/',variables('vnet_subnet_name'))]",
	
	"publicIP_Name": "[concat(parameters('name'),'ip')]",
	"publicIP_Type": "Dynamic",
	
	"eth_name": "eth"
	},
  
  "resources": [
 	{
		"type": "Microsoft.Storage/storageAccounts",
		"name": "[variables('storage_name')]",
		"apiVersion": "2015-05-01-preview",
		"location": "[parameters('location')]",
		"properties": {
			"accountType": "[variables('storage_type')]"
		}
	},
	
	{
		"APIversion" : "2015-05-01-preview",
		"type": "Microsoft.Network/virtualNetworks",
		"name": "[variables('vnet_name')]",		
		"location": "[parameters('location')]",
		"properties": {
			"addressspace": {
				"addressPrefixes": [
					"[parameters('vnet_AddressSpace')]"
				]
			},
			"subnets": [
				{
					"name": "[variables('vnet_subnet_name')]",
					"properties": {
						"addressPrefix": "[parameters('vnet_AddressSpace')]"
					}
				}
			]
		}		
	},
	
	{
		"apiVersion": "2014-12-01-preview",
		"type": "Microsoft.Network/publicIPAddresses",
		"name": "[concat(variables('publicIP_Name'),copyIndex())]",
		"location": "[parameters('location')]",
		"dependsOn" : [
			"[resourceId('Microsoft.Network/virtualNetworks',variables('vnet_name'))]"
		],
		"properties": {
			"publicIPAllocationMethod": "[variables('publicIP_Type')]",
			"dnsSettings": {
				"domainNameLabel": "[concat(parameters('publicip_DNS'),copyIndex())]"
			}
		},
		
		"copy": {
			"name": "[variables('publicIP_Name')]",
			"count": "[parameters('vm_count')]"
		}
	},
	
   {
        "apiVersion": "2015-05-01-preview",
        "type": "Microsoft.Network/networkInterfaces",
        "name": "[concat(variables('eth_name'), copyIndex())]",
        "location": "[parameters('location')]",
		"dependsOn" : [
			"[resourceId('Microsoft.Network/virtualNetworks',variables('vnet_name'))]",
			"[resourceId('Microsoft.Network/publicIPAddresses',concat(variables('publicIP_Name'),copyIndex()))]"
		],
        "properties": {
            "ipConfigurations": [
                {
                    "name": "ipconfig1",
                    "properties": {
                        "privateIPAllocationMethod": "Dynamic",
						"subnet": {
                            "id": "[variables('vnet_subnet_ref')]"
                        },
						"PublicIpAddress": {
							"Id": "[resourceId('Microsoft.Network/publicIPAddresses',concat(variables('publicIP_Name'),copyIndex()))]"
						}
                    }
                }
            ]
        },
		"copy": {
			"name": "[variables('eth_name')]",
			"count": "[parameters('vm_count')]"
		}
    },
	
	{
        "apiVersion": "2015-05-01-preview",
        "type": "Microsoft.Compute/virtualMachines",
        "name": "[concat(parameters('vm_name'), copyIndex())]",
        "location": "[parameters('location')]",
		"dependsOn" : [
			"[resourceId('Microsoft.Network/publicIPAddresses',concat(variables('publicIP_Name'),copyIndex()))]",
			"[resourceId('Microsoft.Storage/storageAccounts',variables('storage_name'))]",
			"[resourceId('Microsoft.Network/networkInterfaces',concat(variables('eth_name'), copyIndex()))]"
		],
        "properties": {
            "hardwareProfile": {
                "vmSize": "[parameters('vmSize')]"
            },
            "osProfile": {
                "computername": "[concat(parameters('vm_name'), copyIndex())]",
                "adminUsername": "[parameters('vm_admin')]",
                "adminPassword": "[parameters('vm_pwd')]"
            },
            
            "storageProfile": {
                "imageReference": {
                    "publisher": "MicrosoftWindowsServer",
                    "offer": "WindowsServer",
                    "sku": "2012-R2-Datacenter",
                    "version": "latest"
                },
				"osDisk" : {
					"name": "[parameters('vm_name')]",
					"createOption": "FromImage",
					"caching": "ReadWrite",
					"vhd": {
						"uri": "[concat(variables('storage_uri'),'/vhds/',parameters('vm_name'),copyIndex(),'.vhd')]"		
					
					}
				}
            },
			"networkProfile" : {
				"networkInterfaces": [
					{
						"id" : "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('eth_name'),copyIndex()))]"
					}
				]
			}
        },
		"copy": {
			"name": "[parameters('vm_name')]",
			"count": "[parameters('vm_count')]"			
		}
    }
  ]
}

Installer Active Directory Certificate Services en Powershell

La première étape est l’installation du rôle Active Directory Certificate Services (AD CS) :

PS C:\Users\brucejdc> Import-Module servermanager
PS C:\Users\brucejdc> Install-WindowsFeature -Name ADCS-Cert-Authority -IncludeManagementTools

Comme pour ADDS, nous disposons de deux modules :
– le module de deploiement : ADCSDeployment
– le mode d’administration : DCSAdministration

Nous commencerons par le module de déploiement, le listing des cmdlets nous retournes :

PS C:\Users\brucejdc> Get-Command -Module  ADCSDeployment

CommandType     Name
-----------     ----
Cmdlet          Install-AdcsCertificationAuthority
Cmdlet          Install-AdcsEnrollmentPolicyWebService
Cmdlet          Install-AdcsEnrollmentWebService
Cmdlet          Install-AdcsNetworkDeviceEnrollmentService
Cmdlet          Install-AdcsOnlineResponder
Cmdlet          Install-AdcsWebEnrollment
Cmdlet          Uninstall-AdcsCertificationAuthority
Cmdlet          Uninstall-AdcsEnrollmentPolicyWebService
Cmdlet          Uninstall-AdcsEnrollmentWebService
Cmdlet          Uninstall-AdcsNetworkDeviceEnrollmentService
Cmdlet          Uninstall-AdcsOnlineResponder
Cmdlet          Uninstall-AdcsWebEnrollment

La compréhension des cmdlets est plutôt simple : une cmdlet d’installation, une cmdlet de désinstallation.
Pour le déploiement de l’autorité de certification, la cmdlet correspondante est Install-AdcsCertificationAuthority.

NAME
    Install-AdcsCertificationAuthority

SYNTAX
    Install-AdcsCertificationAuthority [-AllowAdministratorInteraction]
    [-ValidityPeriod <ValidityPeriod> {Hours | Days | Weeks | Months | Years}]
    [-ValidityPeriodUnits <int>] [-CACommonName <string>]
    [-CADistinguishedNameSuffix <string>] [-CAType <CAType> {EnterpriseRootCA
    | EnterpriseSubordinateCA | StandaloneRootCA | StandaloneSubordinateCA}]
    [-CryptoProviderName <string>] [-DatabaseDirectory <string>]
    [-HashAlgorithmName <string>] [-IgnoreUnicode] [-KeyLength <int>]
    [-LogDirectory <string>] [-OutputCertRequestFile <string>]
    [-OverwriteExistingCAinDS] [-OverwriteExistingKey] [-ParentCA <string>]
    [-OverwriteExistingDatabase] [-Credential <pscredential>] [-Force]
    [-WhatIf] [-Confirm]  [<CommonParameters>]

    Install-AdcsCertificationAuthority [-AllowAdministratorInteraction]
    [-CertFilePassword <securestring>] [-CertFile <string>] [-CAType <CAType>
    {EnterpriseRootCA | EnterpriseSubordinateCA | StandaloneRootCA |
    StandaloneSubordinateCA}] [-CertificateID <string>] [-DatabaseDirectory
    <string>] [-LogDirectory <string>] [-OverwriteExistingKey]
    [-OverwriteExistingDatabase] [-Credential <pscredential>] [-Force]
    [-WhatIf] [-Confirm]  [<CommonParameters>]

    Install-AdcsCertificationAuthority [-AllowAdministratorInteraction]
    [-ValidityPeriod <ValidityPeriod> {Hours | Days | Weeks | Months | Years}]
    [-ValidityPeriodUnits <int>] [-CADistinguishedNameSuffix <string>]
    [-CAType <CAType> {EnterpriseRootCA | EnterpriseSubordinateCA |
    StandaloneRootCA | StandaloneSubordinateCA}] [-CryptoProviderName
    <string>] [-DatabaseDirectory <string>] [-HashAlgorithmName <string>]
    [-IgnoreUnicode] [-KeyContainerName <string>] [-LogDirectory <string>]
    [-OutputCertRequestFile <string>] [-OverwriteExistingCAinDS] [-ParentCA
    <string>] [-OverwriteExistingDatabase] [-Credential <pscredential>]
    [-Force] [-WhatIf] [-Confirm]  [<CommonParameters>]

Une installation simple sera de cette forme, le paramètre -WhatIf permettra de vérifier les paramètres positionnés avant de lancer l’installation proprement dite :

PS C:\Users\brucejdc> Install-AdcsCertificationAuthority -CACommonName "BJDC-CA"  -CAType EnterpriseRootCA  -whatif
What if: Performing the operation "Install-AdcsCertificationAuthority" on target
 "BJDC-DC0".
Certification authority will be installed with the following properties:
                    CAType:                             EnterpriseRootCA
                    CACommonName                        BJDC-CA
                    CADistinguishedNameSuffix           DC=brucejdc,DC=local
                    CADistinguishedName:                CN=BJDC-CA,DC=brucejdc,DC=local
                    IgnoreUnicode:                      False
                    OverwriteExistingKey:               False
                    OverwriteExistingCAinDS:            False
                    ValidityPeriod:                     Years
                    ValidityPeriodUnits:                5
                    CryptoProviderName:                 RSA#Microsoft SoftwareKey Storage Provider
                    HashAlgorithmName:                  SHA1
                    KeyLength:                          2048
                    KeyContainerName:
                    AllowAdministratorInteraction:      False
                    CertFile:
                    CertificateID:
                    OutputCertRequestFile:
                    DatabaseDirectory:                  C:\Windows\system32\CertLog
                    LogDirectory:                       C:\Windows\system32\CertLog
                    OverwriteExistingDatabase:          False
                    ParentCA:

Il suffit de lancer la cmdlet sans -WhatIf pour installer l’autorité de certification.

PS C:\Users\brucejdc> Install-AdcsCertificationAuthority -CACommonName "BJDC-CA"  -CAType EnterpriseRootCA

Confirm
Are you sure you want to perform this action?
Performing the operation "Install-AdcsCertificationAuthority" on target "BJDC-DC0".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):y

                                ErrorId ErrorString
                                ------- -----------
                                      0

Il ne vous reste plus qu’à configurer votre nouvelle autorité de certification!

Mise à jour du schéma des bases des données Exchange 2013

Je vous fais un petit résumé sur ce post Exchange 2013 database schema updates du blog EHLO concernant la mise à jour des bases.

Je trouve ce post intéressant dans le sens où la cmdlet Update-DatabaseSchema m’avait effectivement interpellé.

Mais d’abord, pourquoi faire une mise à jour de schéma de base de données, et qu’est-ce que cela implique?
La mise à jour d’un serveur Mailbox Exchange peut parfois induire des modifications dans la structure des bases de données Exchange, que ce soit pour des améliorations de performances, des correctifs (heureusement c’est un scénario relativement rare) ou pour apporter de nouvelles fonctionnalités. Il est cependant inconcevable aujourd’hui de perdre les mécanismes de haute disponibilité lors d’une phase de mise à jour tel que cela pouvait être le cas dans les versions précédentes, où dès lors qu’une base de données était mise à jour dans une DAG, les nœuds non patchés ne pouvaient plus monter cette base. Cela impliquait un chemin de migration long et compliqué, avec un risque opérationnel parfois critique.

La réponse apportée par l’équipe Exchange est de planifier cette mise à jour de schéma une fois tous les membres du DAG mis à jour. Concrètement, les bases de données disposent de nouveaux attributs, certains sont liés à la base de données physiquement sur le serveur :
– CurrentSchemaVersion
– RequestedSchemaVersion

D’autres aux bases de données en DAG :
– MinimumSupportedDatabaseSchemaVersion
– MaximumSupportedDatabaseSchemaVersion
– RequestedDatabaseSchemaVersion

Concrètement depuis le CU3, lorsque vous mettez à jour un serveur membre d’un DAG, celui-ci lance automatiquement cette cmdlet pour chaque base de données. L’attribut MaximumSupportedDatabaseSchemaVersion n’est mis à jour que lorsque tous les membres du DAG ont été mis à jour, si c’est le cas alors l’attribut RequestedDatabaseSchemaVersion est provisionné pour indiquer qu’une mise à jour de schéma est demandée. Celle-ci ne sera effective qu’après avoir démontée et remontée la base!

Pour rappel, le schéma d’une base de données Exchange 2013 est très différent de celui des versions passées : il existe une table globale des boites aux lettres, puis chaque boite aux lettres disposent de ses propres tables. Lors de la mise à jour du schéma, seul la table globale est mise à jour dans un premier temps. Le schéma des tables des boites aux lettres individuelles n’est mis à jour que lors du prochain accès à celle-ci. On peut obtenir le schéma d’une BAL via la cmdlet Get-MailboxStatistics ‘utilisateur’ | Select CurrentSchemaVersion

Cela semble impliquer qu’il ne sera pas possible d’intégrer dans un DAG un serveur Exchange qui ne disposent pas du CU nécessaire pour supporter la version actuelle des bases de données.
Mise à jour 16/01/2014 : on peut ajouter dans un DAG des serveurs disposant de CU inférieur à celui nécessaire pour le schéma de base de données, mais il sera impossible d’activer la base sur le serveur.

Ces changements semblent importants, mais il faut se rappeler qu’ils ont déjà été testés et approuvés sur O365, le mécanisme aujourd’hui semble donc assez robuste.

Installer une nouvelle Forêt en Powershell

L’installation d’une forêt en Powershell peut paraitre intimidant de premier abord, pourtant cela n’est pas beaucoup plus compliquer que l’installation via dcpromo, la plupart des options se ressemblent forcement.

Pour installer le rôle AD Directory Services, vous avez plusieurs méthodes en ligne de commande, voici la plus récente :

PS C:\Users\brucejdc> Import-Module ServerManager
PS C:\Users\brucejdc> Install-WindowsFeature -Name "AD-Domain-Services" -IncludeManagementTools

Après l’installation du rôle AD Directory Services, si vous essayez de charger le module ActiveDirectory, celui-ci vous retourne un warning pour la création du PSDrive correspondant à l’AD :

PS C:\Users\brucejdc> import-module activedirectory
WARNING: Error initializing default drive: 'Unable to find a default server
with Active Directory Web Services running.'.

Les commandes sont cependant disponibles, mais aucune ne sert à créer la nouvelle forêt. Vous devez pour cela utiliser un module à part :

import-module ADDSDeployment

Vous disposez à partir de ce moment des cmdlets suivantes :

PS C:\Users\brucejdc> get-command -Module ADDSDeployment | select name

Name
----
Add-ADDSReadOnlyDomainControllerAccount
Install-ADDSDomain
Install-ADDSDomainController
Install-ADDSForest
Test-ADDSDomainControllerInstallation
Test-ADDSDomainControllerUninstallation
Test-ADDSDomainInstallation
Test-ADDSForestInstallation
Test-ADDSReadOnlyDomainControllerAccountCreation
Uninstall-ADDSDomainController

C’est la cmdet Install-ADForst qui permet de créer une nouvelle forêt. Vous pouvez aussi voir que ce module gère la création de nouveaux domaines et domain controlleurs.

L’aide de cette cmdlet nous fournis les paramètres disponibles, il n’y a qu’un seul ParameterSet possible :

NAME
    Install-ADDSForest

SYNTAX
    Install-ADDSForest -DomainName <string> [-SkipPreChecks]
    [-SafeModeAdministratorPassword <securestring>] [-CreateDnsDelegation]
    [-DatabasePath <string>] [-DnsDelegationCredential <pscredential>]
    [-NoDnsOnNetwork] [-DomainMode <DomainMode> {Win2008 | Win2008R2 | Win2012
    | Win2012R2 | Default}] [-DomainNetbiosName <string>] [-ForestMode
    <ForestMode> {Win2008 | Win2008R2 | Win2012 | Win2012R2 | Default}]
    [-InstallDns] [-LogPath <string>] [-NoRebootOnCompletion]
    [-SkipAutoConfigureDns] [-SysvolPath <string>] [-Force] [-WhatIf]
    [-Confirm]  [<CommonParameters>]

Il suffit alors de lancer la cmdlet suivante pour créer simplement une nouvelle forêt :

PS C:\Users\brucejdc> Install-ADDSForest -DomainName "brucejdc.local" -SafeModeAdministratorPassword (Read-Host "Mdp de récupération" -asSecureString) -DomainNetbiosName "bjdc" 

La cmdlet vous demandera le mot de passe servant à démarrer le serveur en mode restauration.

Vous pouvez lancer la cmdlet avec l’option -WhatIf qui donnera un récapitulatif (bref) des paramètres d’installation. L’option -InstallDNS n’est pas spécifiée car elle est appliquée par défaut sur une nouvelle forêt, si vous ne spécifiez pas les niveaux fonctionnels, ceux-ci sont crées au niveau le plus haut possible.

 

Cas d’usage : la réversibilité d’Office 365

Grâce à l’un de mes clients, j’ai pu valider la réversibilité d’Office 365 vers une offre On-Premise.

Le client avait migré l’ensemble de son infrastructure Exchange 2003 vers une offre BPOS (alors basée sur Exchange 2007), il avait alors suivi les différentes évolutions de la plateforme BPOS jusqu’à l’offre O365 actuelle basée sur Exchange 2013. Les orientations stratégiques qui l’avaient amené dans le Cloud ayant changés avec le temps, celui-ci souhaitait ré internaliser sa messagerie dans une organisation Exchange 2013 On-Premise.

Nous lui avons proposé un chemin de migration personnalisé prenant en compte ses particularités, avec la création d’une organisation locale Exchange 2013, puis la migration des différentes ressources depuis O365 vers Exchange.

Dans un environnement Active Directory relativement simple, l’installation d’Exchange 2013 ne pose pas de problème à partir du moment où l’on prend en compte la création d’un point de configuration Autodiscover, celui-ci doit être géré pour éviter que les clients internes ne soient redirigés automatiquement vers Exchange 2013 dès la fin de l’installation. Plusieurs méthodes permettent de contourner ce problème, pour ma part j’ai choisi de créer manuellement un SCP pointant vers le service Autodiscover O365. Alternativement, on peut changer le SCP du premier serveur installé via la cmdlet Set-ClientAccessServer, mais dans ce cas il est souhaitable de réaliser l’installation du premier serveur en heure non ouvrée. Dans cette configuration, les clients Outlook récupèrent le SCP le plus ancien, ce qui permet de travailler tranquillement par la suite.

Il est nécessaire de changer le mode de synchronisation de DirSync si celui-ci n’est pas en mode de coexistence, une partie des attributs O365 sont alors synchronisés avec l’annuaire local. Il faut cependant rattraper une partie des attributs AD, ceux-ci ne sont pas dans l’état attendu du mode Hybride, il faudra alors rattraper un certain nombre d’attributs, tel que l’ExchangeGUID qui servira lors des déplacements de boîtes aux lettres. La conversion des utilisateurs en RemoteMailbox permet d’arriver dans un état relativement proche de la cible, il est cependant souhaitable de sauvegarder l’ensemble des attributs AD locaux liés à Exchange avant de travailler sur la partie DirSync et le rattrapage.

Il est important d’avoir à minima une synchronisation des mots de passes avec 0365 et des UPN correspondants à l’adresse email, ce qui permet d’avoir une authentification identique sur les deux organisations. C’est d’autant plus pertinent qu’il faudra tôt ou tard basculer les services Autodiscover depuis O365 vers Exchange, avec à la fois une authentification vers Exchange, puis vers O365 pour les clients Outlooks. Accessoirement, cela permet de régler de façon transparente certains problèmes liés au Credential Manager apparu depuis Windows 7.

Une fois Exchange installé j’ai choisi d’utiliser l’assistant du mode Hybride pour créer automatiquement la configuration nécessaire, bien qu’il soit tout à fait possible de configurer manuellement chacun des aspects du mode Hybride :
– le routage des emails entre O365 et Exchange On-Premise
– la création d’une relation de Fédération, qui servira entre autre à partager les informations de disponibilité
– l’accès aux WebServices On-Premise (autodiscover, disponibilité, migration des BAL)

Les déplacements de données sont réalisés via le proxy MRS, la création d’un « Migration Endpoint » doit donc être prévue côté O365. Une fois celui-ci en place, les déplacements se font par lot via des fichiers CSV, très confortable, avec une étape de finalisation à la main de l’administrateur. Les mêmes limitations que celles liés à une migration Exchange vers O365 existent, en particulier les accès aux ressources partagées ou la configuration des périphériques ActiveSync.

Dans le cas de notre client, le processus de migration devait respecter une limite de temps stricte, la migration des 800 boites aux lettres a été réalisée en moins d’un mois.

Installation d’Exchange 2013 CU2, Windows Server 2012 et VMWare 5

Aujourd’hui j’ai installé Exchange 2013 sur un environnement virtualisé sous VSphere 5… enfin j’ai essayé! L’installation devait être effectuée sur un autre lecteur que celui du système, sans succès, par contre sur la même machine, l’installation sur le C fonctionne correctement.

Lors de l’installation de la partie Transport, l’installation s’arrête sur une erreur de droit d’accès concernant une fabrique DCOM. Les différents symptômes sont les suivants :
– dans le journal des évènements : des erreurs MSExchangeSetup 1002

Retrieving the COM class factory for component with CLSID {2DC947D7-A2DC-4276-A554-891346CE2032} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

– dans le journal de sécurité, après avoir activé l’audit du lecteur : des entrées Audit Failure 4656, Removable Storage

Log Name:      Security
Source:        Microsoft-Windows-Security-Auditing
Date:          9/11/2013 8:46:40 AM
Event ID:      4656
Task Category: Removable Storage
Level:         Information
Keywords:      Audit Failure
User:          N/A
Computer:      BLABLABLA.brucejdc.local
Description:
A handle to an object was requested.

Subject:
            Security ID:                 NETWORK SERVICE
            Account Name:                       BLABLABLA$
            Account Domain:                   BRUCEJDC
            Logon ID:                   0x3E4

Object:
            Object Server:             Security
            Object Type:               File
            Object Name:              F:\Exchange\FIP-FS\Bin\FSCConfigurationServer.exe
            Handle ID:                  0x0
            Resource Attributes:    -

Process Information:
            Process ID:                  0x2fc
            Process Name:            C:\Windows\System32\svchost.exe

Access Request Information:
            Transaction ID:                       {00000000-0000-0000-0000-000000000000}
            Accesses:                    SYNCHRONIZE
                                               ReadData (or ListDirectory)
                                               Execute/Traverse
                                               ReadAttributes

C’est l’entrée du journal de sécurité qui est la plus parlante : les droits demandés sont des plus classiques (lecture, execution), par contre la source est du type “Removable Storage”. En effet avec VSphere 5, les disques présentés sont hotswap, ils peuvent être changé à chaud. Hors il existe une erreur sur Windows Server 2012 qui bloque pas mal d’accès sur les fichiers dès lors que ceux-ci sont sur un disque hot swap et que l’accès en audit sur les fichiers est configuré pour l’audit ou laissé en non configuré.

Il existe deux solutions : configurer l’audit pour ne pas auditer les accès aux fichiers, ou appliquer la KB 2811670 (https://support.microsoft.com/en-us/kb/2811670).
Attention a bien prendre la KB en anglais, la procédure complète n’est pas indiquée dans la version française.

Exchange 2013 : les cycles de mise à jour par Cumulative Update

Dans le modèle de mise à jour d’Exchange 2013, chaque Cumulative Update (CU) comprend l’intégralité des binaires d’installation d’Exchange, un Cumulative Update peut donc aussi bien servir à installer un nouveau serveur Exchange, comme mettre à jour un serveur existant.

On peut s’attendre à la sortie d’environ 4 Cumulative Update par an (un tous les 3 mois environ), dont l’un est classé Service Pack. Il n’y a pas de différence fondamental entre un Cumulative Update et un Service Pack, la dénomination Service Pack est utilisée dans le modèle du cycle de vie du produit. Certains partenaires qui garantissent la compatibilité de leurs propres produits avec Exchange ne peuvent pas suivre le cycle des Cumulative Update, trop rapide, et garantissent la supportablité par rapport aux Service Pack.

Il est possible de mettre à jour un serveur Exchange 2013 RTM directement avec le dernier Cumulative Update en date, cependant il faut prendre en compte un autre facteur, moins connu mais très important : les Cumulative Update ne sont supportés que jusqu’à la version N-2. La mise à jour vers le Cumulative Update 5 par exemple n’est supportée et surtout testée que pour les 2 précédant Cumulative Update, soit le Cumulative Update 4 (qui correspondant au Service Pack 1) et le Cumulative Update 3. Rien n’empêche de réaliser une mise à jour depuis la RTM, le Cumulative Update 1 ou 2, cependant ces chemins de mise à jour n’ont pas été validés par Microsoft. Dans la pratique, cela peut engendrer un certain nombre de problèmes, des étapes portées par les Cumulative Update intermédiaires ne sont pas forcément joués comme prévus.

Il existe des patchs indépendants, en général liés à des problèmes critiques, et qui sont intégrés dans le prochain Cumulative Update.

Pour la mise à jour de l’infrastructure, il n’y a pas d’ordre particulier, les nouveaux rôles Exchange 2013 n’ont presque pas d’affinités avec la version utilisée, un FrontEnd en CU4 peut toujours communiquer avec un BackEnd CU5 par exemple.

Un seul cas particulier à ma connaissance, si vous avez un DAG mise à jour vers un CU particulier, vous pouvez toujours joindre à ce DAG un serveur dans un CU inférieur, mais si il y a une mise à jour du schéma des bases de données entre les deux versions, le nouveau membre n’arrivera pas à répliquer les bases.