Bruce JDC Blog

Aller au contenu | Aller au menu | Aller à la recherche

Exchange

Fil des billets

2013 juil. 12

Nouveau blog!

Bonjour, Mon nouveau blog est disponible sur http://blog.brucejdc.fr

2013 juil. 8

Get group membership (recursive and take care of circular nested group)

# get group members recursive, ignored circular nested group

param(

[parameter(mandatory=$true,position=0)]

$group

)

 

# get group members recursive, ignored circular nested group

param(

[parameter(mandatory=$true,position=0)]

$group

)

 

$Global:members = @()

$Global:list_members_extended = @()

 

function mygroup($name) {

            foreach ($groupe in (get-distributiongroupmember $name | group-object RecipientType)) {

                        if ($groupe.name -eq "MailUniversalDistributionGroup")     {                     

                                               $groupe.group | foreach {

                                                           if ($Global:list_members_extended -notcontains $_.name) {

                                                                                  $Global:list_members_extended += $_.name

                                                                                  mygroup $_.name

                                                           }

                                               }

                        } else {

                                   $Global:members += $groupe.group | select alias

                        }

            }         

}

mygroup $group

return ($members)

2013 mar. 27

Purger un domaine des adresses emails

# bjdc-del-emailaddr
#
# Supprimer toutes les addresses smtp liées à un domaine
#
# Condition : les objets ne doivent pas être soumis à une Email Address Policy qui repositionne le domaine à enlever
#
# Entree :
#  Domain : nom de domaine, obligatoire
#  Type : type d'objet à sauvegarder, obligatoire, choisir entre Mailbox, Contact ou DistrGroup
#  NewDomain : le nouveau domaine à mettre en PrimarySmtpAddress si besoin

# Author Bruce JDC

param(
[parameter(Mandatory=$true,Position=0)]
[ValidateNotNullOrEmpty()]
[String] $Domain,
[parameter(Mandatory=$true,Position=1)]
[ValidateNotNullOrEmpty()]
[ValidateSet("Mailbox","Contact","DistrGroup")]
[String] $Type,
[parameter(Mandatory=$true,Position=2)]
[ValidateNotNullOrEmpty()]
[String] $NewDomain
)

# chargement du snapin EMS
if (!(get-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin)) {
    Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin
}

# filtre pipeline
filter filter_domain {
 if ($_.SmtpAddress -like $Fdomain) {
  Write-Output $_
 }
}

switch ($Type) {
 "Mailbox" {$cmd = 'Get-Mailbox' ; break }
 "Contact" {$cmd = 'Get-MailContact' ; break }
 "DistrGroup" {$cmd = 'Get-DistributionGroup' ; break }
 # si on passe dans default, c'est qu'il y a un gros problème
 default {exit}
}

$FDomain = '*@'+ $Domain 


$r = Invoke-Expression ($cmd + ' -ResultSize unlimited -Filter { Emailaddresses -like $Fdomain }')
if ($r) {
 foreach ($mb in $r) {
  # Si le domaine est utilisé dans la primary, on doit changer celui ci
  if ($mb.PrimarySmtpAddress -like $FDomain) {
   Write-Host ("Changement d'adresse principale : " + $mb.PrimarySmtpAddress + " devient " + ($mb.PrimarySmtpAddress.Local + '@'+$NewDomain))
   switch ($Type) {
    "Mailbox" {$mb |Set-Mailbox -PrimarySmtpAddress ($mb.PrimarySmtpAddress.Local + '@'+$NewDomain) -EmailAddressPolicyEnabled $false}
    "Contact" {$mb | Set-MailContact -PrimarySmtpAddress ($mb.PrimarySmtpAddress.Local + '@'+$NewDomain)-EmailAddressPolicyEnabled  $false}
    "DistrGroup" {$mb | Set-DistributionGroup -PrimarySmtpAddress ($mb.PrimarySmtpAddress.Local + '@'+$NewDomain) -EmailAddressPolicyEnabled $false}
    # si on passe dans default, c'est qu'il y a un gros problème
    default {exit}
   } 
  }
  
  
  $mb = $mb | Update-List -Property EmailAddresses -Remove ($mb.emailaddresses | filter_domain)
  switch ($Type) {
   "Mailbox" {$mb | Set-Mailbox}
   "Contact" { $mb.ExternalEmailAddress = ($mb.PrimarySmtpAddress.ToString()) ;
   $mb.HiddenFromAddressListsEnabled = $true ;
   $mb | Set-MailContact}
   "DistrGroup" {$mb | Set-DistributionGroup}
   # si on passe dans default, c'est qu'il y a un gros problème
   default {exit}
  }
 }
} else {
 Write-Host "Aucun résultat"
}

2013 mar. 22

Lorsque vous reconnectez une boite aux lettres, l'utilisateur n'a plus accès à OWA

Sous Exchange 2007, après avoir réconnecté une boite aux lettres à un utilisateur (par exemple lors d'une conversion Linked -> Normal ou inverse), il arrive que les WebServices liés à la boite aux lettres ne fonctionnent plus correctement avec les symptomes suivants :

  • Impossible d'ouvrir le gestionnaire d'absence
  • Après l'ouverture d'OWA, celui ci demande le choix de la langue mais tombe en erreur juste après

Il suffit d'enlever et remettre les droits de l'utilisateur pour que cela refonctionne.

2013 mar. 6

Manipulation des Linked Mailbox 2

Un script pour convertir une boite aux lettres normals en LinkedMailbox

Param(

parameter(Mandatory=$true) String $user,

parameter(Mandatory=$true) String $targetDC,

parameter(Mandatory=$true) String $targetAccount )

 

Import-Module activedirectory

$mb = get-mailbox $user

Disable-Mailbox $mb

$cred = Get-Credential "A valid target domain account"

Write-Host "Please wait AD refresh"

do {

start-sleep -Seconds 10

Connect-Mailbox -Identity $mb.DisplayName -Database $mb.Database -User ((Get-ADDomain).netbiosname+'\'+$mb.SamAccountName) -LinkedMasterAccount $targetaccount -LinkedDomainController $targetDC -LinkedCredential $cred

} while (!$?)

2013 mar. 4

Manipulation des Linked Mailbox

Je travaille actuellement dans un environnement "Foret de ressource - Foret d'utilisateur", ce qui passe par des LinkedMailbox. Ce type de boite aux lettres permet de faire résider la boite aux lettres dans une forêt différente du compte de l'utilisateur.

Lors d'un changement de type de BAL (LinkedMailbox -> Autre Mailbox ou opération inverse), il faut déconnecter systématiquement la boite aux lettres pour pouvoir la convertir. Cette opération est réalisable en powershell, mais le résultat est souvent frustrant car il faut attendre un certain delai pour que la réplication AD et mise à jour du cache Exchange permette la reconnexion de la BAL. On peut forcer cette mise à jour avec Clean-MailboxDatabase, qui va comparer les BAL physiques avec les comptes de l'annuaire, mais dans un environnement large, cela peut surcharger inutilement les serveurs alors qu'avec un peu de patience, cela se fait tout seul.

Voici un petit exemple de script pour pouvoir la réaliser, qui peut être adapté pour des besoins plus spécifique. Attention, le Disable-Mailbox fait sauter plusieurs attributs Exchange, en particulier tous les CustomAttribute!

Param(
parameter(Mandatory=$true)
String $user
)
Import-Module activedirectory
$mb = get-mailbox $user
Disable-Mailbox $mb
Write-Host "Merci d'attendre la mise à jour AD"
do { 
	start-sleep -Seconds 10
	Connect-Mailbox -Identity $mb.DisplayName -Database $mb.Database  -User ((Get-ADDomain).netbiosname+'\'+$mb.SamAccountName)
} while (!$?)

2013 fév. 21

Exchange 2013 : Safety Net

Lors des Techday de cette année, Scott Schnoll nous a présenté lors de sa session un nouveau dispositif remplaçant le transport dumpster d'Exchange : Safety Net. Il n'a malheureusement pas eu le temps de complétement développer le sujet, c'est pourquoi un certain nombre de questions restait ouvert, surtout par rapport au Shadow Redundancy.

Pour rappel, le Sadow Redundancy est un mécanisme de protection des messages en transit, lors de chaque passage de passerelle N, la passerelle N-1 conserve une copie du message pendant un certain delai, puis interroge la passerelle N pour savoir si elle a réussi à délivrer le message. En cas de problème, le message peut être retransmis à une autre passerelle.

Safety Net ne remplace pas Shadow Redundancy, il le complète en protégeant le message après sa livraison, et il nécessite Shadow Redundancy pour fonctionner. Lors d'une bascule de base dans un DAG, Safety Net complète le mécanisme de réplication des LOG pour resoumettre les messages non intégrés dans la nouvelle copie active d'une base. A la différence du Transport Dumpster, plusieurs optimisations ont été apportées, dont la fin de la limitation de taille du dumpster, les messages étant conservés par défaut 2 jours.

L'article Technet sur le sujet se trouve ici :http://technet.microsoft.com/us-en/library/jj657495.aspx

2013 fév. 14

Créer un connecteur de récéption Open Relay pour les applications non auth.

Get-TransportServer | New-ReceiveConnector -Name "Relai Applicatif" -Bindings "0.0.0.0:25" -Custom -RemoteIPRanges "IPApplications1","IPApplications2" -AuthMechanism "TLS,EXternalAuthoritative" -PermissionGroups "ExchangeServers,AnonymousUsers"

2013 fév. 7

Create a Shared address space between two Exchange Forest

This is a script to help implement this scenario : http://technet.microsoft.com/en-us/library/bb676395(v=exchg.141).aspx

$domain = "mydomain.com"
$remoteHUB = "10.10.10.10", "10.10.10.11"

# Create Receive Connector

Get-TransportServer | New-ReceiveConnector -name "Relay $domain" -Bindings "0.0.0.0:25" -RemoteIPRanges $remoteHUB -Custom -PermissionGroups AnonymousUsers 

# Create SendConnector

New-SendConnector -Name "Relay $domain" -AddressSpaces "smtp:$domain;1"  -Enabled  -SmartHosts $remoteHUB -Usage Custom -whatif

#check with telnet on port 25 that each HUB can access the remote HUB
Read-Host "Check that telnet on port 25 work for each HUB -> Remote HUB"

# Create the domain as Internal Relay
New-AcceptedDomain -name $domain -DomainName $domain -DomainType InternalRelay

2013 fév. 1

Vous n'arrivez pas à enlever une permission sur un objet : l'ACL n'existe pas sur l'objet!

Dans ce billet je vais parler d'une situation frustrante lorsque l’on souhaite nettoyer les ACL des boites aux lettres. Rien de plus frustrant lorsque l’on regarde les permissions d’un BAL avec Get-MailboxPermission de voir toutes ces permissions en S-1-5-************ révélatrices de comptes supprimés.

Même si il n’y a aucun risque de sécurité (la partie RID du SID ne sera jamais réutilisée par Active Directory), j’aime bien ne voir que les permissions pertinentes pour un objet. Dans mon cas, lorsque j’essaie de nettoyer une permission, la réponse de la cmdlet powershell me laisse perplexe : « /// Can't remove the access control entry on the object "CN=John Doe,OU=Users, DC=contoso,DC=local" for account "contso\johndoe" because the ACE doesn't exist on the object. /// » Pourtant je vois bien une permission sur cette BAL. D’ailleurs c’est un pipe entre un Get et un Remove, je n’ai rien copié / coller. Je fais un Get-ADUser sur le SID indiqué, rien ; surtout que le SID que j’ai indiqué ne fait pas parti de mon domaine !

En fait c’est un sIDHistory.
Pour les migrateurs Exchange, cela ne veut pas dire grand-chose, par contre c’est mieux connu par ceux qui font des migrations Active Directory. Comme l’indique les différentes fiches Technet, le sIDHistory sert lors d’une migration entre foret, le sID de la forêt d’origine d’un compte est repris dans cette attribut pour préserver au compte l’accès aux ressources de sa forêt d’origine, même après une migration. Lors du passage de la commande Remove-MailboxPermission, celle-ci résout bien le sIDHistory sur l’utilisateur, mais n’essai d’enlever que la partie sID, et pas le sIDHistory.

Il n’y a que deux solutions de contournement :

  • Utiliser une console d’administration Exchange 2003
  • Purger le sIDHistory du compte avant d’enlever cette permission
Sources :

http://technet.microsoft.com/en-us/library/cc974384(v=ws.10).aspx

2013 janv. 28

Le proxy ActiveSync d’Exchange 2007/2010 ne communique pas avec Exchange 2003 (Event 1034)

Lors d’une migration d’Exchange 2003 vers Exchange 2010, on utilise généralement une feuille de route (par exemple http://technet.microsoft.com/fr-fr/exdeploy2010/default.aspx) qui permet de ne pas oublier les grandes étapes indispensables au bon fonctionnement d’une coexistence entre les différentes versions d’Exchange.

Plusieurs tests peuvent être réalisés avant de basculer les flux Internet d’Exchange 2003 vers Exchange 2010, mais cela n’est pas toujours évident avec le flux ActiveSync. En cas de dysfonctionnement, la première démarche est d’ouvrir le journal d’évènement des différents serveurs impliqués. Dans le cas d’un problème de communication entre le proxy Exchange 2007 ou 2010 et Exchange 2003, on remarquera la présence régulière d’évènements MSExchange ActiveSync 1034 : « the proxy request to %1 has timed out » en Warning.

Pour expliquer ce dysfonctionnement, il faut se rappeler que la méthodologie de migration proposées par Microsoft se base sur des environnements « standards », mais qui ne sont pas forcément standard chez nos clients ! En effet, même si un client essaye de respecter les « Best Practices » via le BPA, certaines contraintes peuvent l’amener à sortir des rails.

Dans notre cas, il s’agit souvent d’un problème lié à la sécurité, en effet, par défaut les services web d’Exchange sont proposés en HTTP et HTTPS, dans le cas d’Exchange 2003, le répertoire /Microsoft-Server-Activesync est proposé dans ces deux protocoles, mais pour des raisons de sécurité, les administrateurs obligent la connexion en HTTPS. Hors le proxy ActiveSync d’Exchange se connecte sur le répertoire virtuel /Microsoft-Server-Activesync, mais en http, il ne sait pas négocier du https.

Pour résoudre le problème, rien de plus simple : dans la console d’administration IIS, sur le répertoire virtuel /Microsoft-Server-Activesync, il suffit de décocher dans la partie Directory Security l’option « Require secure channel (SSL) ». Un petit IISreset sur chaque serveur Exchange et le flux ActiveSync devrait reprendre sans problème.

2013 janv. 3

Bienvenue sur mon blog!

J'espère par ce blog vous faire découvrir mon parcours dans la maitrise de la messagerie Exchange et des différentes technologies qui gravitent autour.

Vous pouvez me retrouver sur les forums Technet de Microsoft sous le même pseudonyme Bruce JDC