lundi 30 novembre 2009

TUTORIEL: Intégration Exchange 2007/2010, SIPnPBX et SIP Trunk Freephonie!

Hier, j'expliquais comment intégrer Exchange UM avec Asterisk/Trixbox et Freephonie. Aujourd'hui nous allons voir comment en quelques minutes nous pouvons réitérer cette intégration avec un petit bijou de simplicité nommé PBXnSIP. Merci à Benoit Q de m'en avoir parlé, car je ne connaissais pas!

Étant parfois un peu fainéant, je ne vais pas réécrire la totalité des étapes de configuration Exchange, vous les trouverez dans la première et la seconde partie des articles consacrés à Asterisk/Trixbox.

Installation de PBXnSIP

PBXnSIP est un IP-PBX bien ficelé, qui tourne sur Windows, Linux ou Mac OS ! Contrairement à Asterisk, il n'est ni gratuit ni Open Source mais reste abordable pour des TPE/PME.
Pour mes tests, j'utilise une licence de démo permanente mais dont la durée des appels est limitée. Aucune chance donc que je ne l'utilise pour une "vraie" démo. Cependant, il est possible d'utiliser une licence de démo parfaitement fonctionnelle, mais limitée dans le temps (14 jours) -- cela est peut-être une meilleure option pour vous...

Pour mon lab, j'utilise une machine virtuelle Windows Server 2003 SP2 32-bit avec 256 Mo de mémoire. L'installation de PBXnSIP se fait sans accroc en quelques secondes. Lisez le guide d'installation et les instructions sur le site PBXnSIP (configuration du support du TOS et configuration du redémarrage du service en cas de crash... peu important dans un lab, mais à considérer en production).

Dans le même esprit que ma Trixbox, j'ai deux interfaces, dont celle connectée en interne a une route statique par mon interface privée afin de joindre mon serveur UM qui est dans un sous-réseau spécifique.

L'autre interface est bien évidemment connectée à mon réseau "maison", directement NATé à Internet via ma Freebox. Cette interface n'a aucun service type "Client Microsoft" ou "Partage de fichiers/imprimantes" et ne s'enregistre pas dans le DNS. Netbios/TCP est aussi désactivé.

Bref, comme d'habitude, adaptez votre serveur à vos besoin. L'essentiel est que vous puissiez joindre votre serveur UM d'un côté et Internet de l'autre.

Si vous avez joué avec une Trixbox, n'oubliez pas de l'éteindre, en particulier pour tester les appels entrants lorsque la configuration PBXnSIP sera terminée !

Configuration de PBXnSIP

L'interface d'administration de PBXnSIP est accessible au travers d'un navigateur. Par défaut elle s'exécute sur le port 80. Il suffit donc d'aller sur http://localhost et vous de vous authentifier avec le compte 'admin' (mot de passe = vide). Vous pourrez le changer ultérieurement.

La première étape consiste a enregistrer votre n° de licence. Pour cela allez dans "Settings" ==> "Licence". Copiez-collez le n° reçu et faites "Save".





Aller ensuite dans la configuration des domaines en cliquant sur "Domains". Vous y trouverez des domaines pré-configuré. Personnellement je les ai détruits afin de comprendre ce que je recréais au fur et à mesure. A vous de voir...

Il importe de configurer ces paramètres dans votre domaine:
  • Default Dial Plan: vous n'en avez pas pour l'instant, nous le positionnerons plus tard...
  • Calling own extension number goes to mailbox: No ==> Si vous laissez à "Yes", vous aurez des problèmes plus tard en utilisant le Play-on-Phone depuis Outlook Web App (Exchange appellera PBXnSIP qui appellera votre boîte vocale Exchange)
  • External Voice Mail System: 1000 ==> cela correspond au "Pilot Number" Exchange UM qui sera associé à votre UM IP Gateway correspondant à votre serveur PBXnSIP. J'ai volontairement utilisé le même numéro pilote que pour mon Asterisk, cela n'est pas gênant puisqu'ils ne sont pas associés à la même UM IP Gateway. 



Sauvegardez ("Save") puis allez faire un tour du côté de l'onglet "Trunks".

Configuration du SIP Trunk Exchange

Ajouter un SIP Trunk de type "SIP Gateway" avec les paramètres suivants:
  • Name: ExchangeUM
  • Type: SIP Gateway
  • Direction: Inbound and Outbound
  • Domain: 192.168.101.20
  • Account:
  • Username: Anonymous
  • Password/Password (repeat):
  • Outbound Proxy: sip:192.168.101.20:5060;transport=tcp
  • Accept Redirect: Yes ==> requis pour le support des 302/Redirect
  • Trunk requires out of band-DTMF tones: Yes ==> requis pour que le DTMF fonctionne au travers du SIP Trunk Freephonie
  • Remote Party/Privacy Indication: RFC3325 (P-Asserted-Identity)
  • Assume that calls come from: 2000 ==> fausse extension qui sera créée pour rediriger vers notre UM Auto Attendant mais qui nous servira aussi à appeler depuis Exchange vers l'extérieur



Sauvegardez avec "Save" puis créer le SIP Trunk Freephonie.


Configuration du SIP Trunk Freephonie

Ajouter un SIP Trunk de type "SIP Registration" avec les paramètres suivants:
  • Name: Freephonie
  • Type: SIP Registration
  • Direction: Inbound and Outbound
  • Domain: freephonie.net
  • Account: 09XXXXXXXX
  • Username: 09XXXXXXXX
  • Password/Password (repeat):
  • Outbound Proxy: sip:freephonie.net:5060;transport=udp
  • Remote Party/Privacy Indication: Remote Party-Id ==> Car Freephonie utilise Asterik !!!
  • Send call to extension: 2000 ==> la pseudo-extension qui sera dirigée vers l'Attendant UM de notre choix


Sauvegardez avec "Save" puis allez faire un tour du côté de l'onglet "Accounts". Au final vos SIP Trunks existants ressembleront à ceci:




Configuration des extensions 

Ajoutez les extensions 2001, 2002, ... dont les noms doivent correspondre aux extensions UM déclarées dans Exchange.

Ajoutez une extension 2000 avec un PIN/mot de passe top secret... Nommez la comme vous le souhaitez (peu importe, ce qui compte c'est qu'elle existe...). Une fois celle-ci créée, éditez les propriétés de cette extension afin d'ajouter un transfert inconditionnel vers le numéro pilote de votre standard automatique (j'utilise 1000 pour le Subscriber Access et 1900 pour l'Auto Attendant).





Au final, vos extensions ressembleront à ceci:





Nous y sommes presque, il nous reste à configurer les règles de routage. Allez pour cela dans l'onglet "Dial-Plans".

Configuration du Dial Plan 

Ajouter un Dial Plan, nommez le comme vous le souhaitez cela n'a que peu d'importance, si ce n'est de s'y retrouver dans un environnement du "monde réel" :)

Ajoutez les règles pour les numéros pilotes 1000 et 1900 vers le SIP Trunk ExchangeUM. La règle 0* permet de composer n'importe quel numéro préfixé par 0 et de passer le reste au SIP Trunk. Par exemple, composer 00112345678 passera 0112345678 au SIP Trunk Freephonie.






Note: OCS-MS est un SIP Trunk vers mon Mediation Server OCS 2007 R2 (oui ça marche aussi très bien!). Je compose 5xxxx pour appeler l'extension xxxx déclarée dans OCS (les règles de normalisation faisant le reste). 

Maintenant à vous de jouer !!! 

N'oubliez pas de créer votre UM IP Gateway dans la configuration UM d'Exchange, le Hunt Group qui va bien, et de l'associer avec le bon numéro pilote au bon UM Dial Plan.

Voilà, si je n'ai rien oublié (ce que je ne garanti pas vu que j'ai tapé cet article très très vite), votre environnement est prêt. Vous devriez vous retrouver dans un environnement fonctionnellement similaire à ce que nous avions avec Asterisk/Trixbox.

Post-mortem

Grâce à notre extension fictive, nous pouvons effectuer des appels depuis Exchange (Play-on-Phone, contacter un n° externe depuis l'annuaire...) sans devoir utiliser une "ruse" comme avec Asterisk. Bon point pour PBXnSIP.

Le MWI d'Exchange 2010 ne fonctionne cependant pas mieux. Tout comme avec Asterisk, PBXnSIP refuse les messages NOTIFY en dehors d'un dialogue SIP établi. Rigolo, quand on sait que Cisco Call Manager sait très bien le faire !

samedi 28 novembre 2009

TUTORIEL: Intégration Exchange 2007/2010, Trixbox/Asterisk et SIP Trunk Freephonie! (Seconde partie)

Dans la première partie, j'expliquais comment intégrer Exchange UM et Asterisk (sur base d'une Trixbox) avec un SIP Trunk.

L'état des lieux suite à cette première partie est celui-ci:
  • Asterisk est configuré et sait router vers Exchange UM
  • Exchange UM sait router vers Asterisk, mais cela n'est pas encore configuré
  • L'appel vers une extension non disponible sera redirigé vers Exchange UM
  • Tout utilisateur Asterisk peut appeler le "nombre pilote" de la messagerie vocale ou du standard automatique.
Nous allons dans un premier temps nous intéresser à la partie permettant de configurer la reception d'un appel avec un SIP Trunk Freephonie et de le rediriger directement vers le standard automatique Exchange.

Configuration d'une route entrante

Dans la première partie, je disais réserver l'extension 2000 pour un usage particulier. C'est ici que celle-ci intervient.

Avant de créer une route entrante, nous allons créer deux "Custom Destinations". Pour ceci, nous allons dans le menu "PBX" ==> "PBX Settings". Dans le panneau de gauche, aller dans l'onglet "Tools" puis cliquez sur "Custom Destinations".

Ajouter les destinations suivantes:

Outlook Voice Access
  • Custom Destination: app-eum,ova,1
  • Description: Outlook Voice Access
Exchange Auto Attendant
  • Custom Destination: app-eum,aa,1
  • Description: Exchange Auto Attendant
Explications:
  • Une "Custom Destination" permet de déclencher un contexte personnel tel qu'une application
  • Ici nous exécutons les sous-routines "ova" et "aa" de notre application "app-eum" que nous avons installé dans l'article précédent - La syntaxe correspond au macro language d'Asterisk
Nous pouvons maintenant créer une route entrante. Pour ceci il suffit d'aller dans l'onglet principal "Setup" puis dans la section "Inbound Call Control" et de cliquer sur "Inbound Routes".

De là, ajouter une route entrante:
  • DID Number: 2000
  • Set Destination
    • Sélectionner "Custom Destinations" ==> sélectionner "Exchange Auto Attendant"

Validez et appliquez les changements.

Configuration du SIP Trunk avec Freephonie

Créez un nouveau SIP Trunk avec les paramètres suivants:

Trunk name: Freephonie

PEER Details:
type=peer
context=from-pstn
username=09XXXXXXXX
secret=motdepassetopsecret
host=freephonie.net
fromuser=09XXXXXXXX
fromdomain=freephonie.net
insecure=port,invite
nat=yes
qualify=yes
disallow=all
allow=alaw&ulaw
dtmfmode=auto

USER Context: 09XXXXXXXX

Incoming Settings:
type=user
host=freephonie.net
disallow=all
allow=alaw&ulaw
dtmfmode=auto

Register String: 09XXXXXXXX:motdepassetopsecret@freephonie.net/2000

Validez la création de la route puis rechargez la configuration d'Asterisk.

Explications:
  • La section "PEER Details" permet d'appeler au travers du SIP Trunk Freephonie et contrôle ce contexte
  • La section "User Details" permet de contrôler le contexte des appels entrants
  • La valeur de "Register String" permet de s'authentifier auprès de Freephonie. Petite subtilité ici, le "/2000" permet de dirgier tous les appels entrants vers la route que nous avons créé précédemment, et qui porte donc le "faux DID" 2000.
Afin que les appels entrants soient bien dirigés vers votre Trixbox, assurez-vous que vous avez configuré votre compte Free en conséquence ("Rediriger les appels entrants vers le compte SIP").


Une fois cette modification effectuée, vous pouvez tester la configuration en appelant votre n°Freephonie.

Configuration de la route sortante via le SIP Trunk Freephonie

Pour créer la route sortante, allez dans l'onglet principal "Setup" puis dans la section "Basic" et de cliquer sur "Outbound Routes".

Modifier la route sortante par défaut afin qu'elle utilise le SIP Trunk Freephonie au lieu du Zaptel. Au passage, changez les règles de numérotation afin qu'elles correspondent à vos souhaits.

Ci-dessous un exemple:

Validez la création de votre route, puis appliquer les changements de configuration.

Une fois la route créée, vous devriez être capable d'appeler un numéro extérieur depuis votre SIP phone et une extension définie dans Asterisk/Trixbox (ex 2001, 2002, ...)

Configuration d'Exchange pour le "Play on Phone" et les appels sortants

Exchange UM a une fonctionnalité nommée "Play on Phone", qui permet, via Outlook Web Access/Outlook Web App de demander à Exchange de vous appeler sur un numéro que vous lui spécifiez.

Il est aussi possible d'activer les appels sortants au travers des standards automatiques, pour appeler des numéros présents dans les listes d'adresses Exchange ou dans les contacts personnels.

Pour que les fonctionnalités d'appels sortants fonctionnent, vous devrez configurer plusieurs éléments:
  • Dial Codes: au niveau de l'UM Dial Plan, permettant de reformer un numéro en fonction de lu pays/région du Dial Plan et permettant de déterminer le type de destination ("In Region" ou "International");
  • Dial Rule Groups: au niveau de l'UM Dial Plan, permettant de transposer un numéro en fonction de sa destination en un numéro formaté tel que l'UM IP Gateway (une passerelle ou un IP-PBX) l'attend.
Voici des exemples de Dial Codes et Dial Rule Groups:


Ensuite, il suffit d'autoriser (ou pas) les appels vers ces Dial Rules. Pour le "Play on Phone", cela se configure au niveau des UM Policies (stratégies UM).

Dans mon lab, j'ai par exemple une stratégie UM me permettant d'appeler des téléphones mobiles, tandis que la stratégie par défaut n'autorise que les 0[1-59]xxxxxxxx !


A partir de là, vous avez la capacité de vous faire appeler par Exchange sur un numéro français, il suffit d'aller dans Outlook Web App puis Options ==> Téléphone ==> Appelez le numéro...


Et là me direz vous "Non ça ne marche pas!!!". En effet, il faut savoir que dans notre cas Exchange UM appelle depuis l'extension "2xxx" telles que nous l'avions défini dans notre première partie.

Or, Asterisk n'est pas un Proxy SIP, c'est un Back-to-Back User Agent (B2BUA) -- si vous activez le debug sip sur Asterisk vous verrez clairement le problème:
  • Le serveur Exchange envoie une INVITE au numéro externe
  • Le serveur Asterisk répond avec un erreur 401 (non autorisé)
Le fait est que l'appelant dans notre scénario est, par exemple, 2001. Or cette extension est connue dans Asterisk et doit être authentifiée (avec un REGISTER) avant de pouvoir émettre un appel. Ceci malgré le fait que nous ayons un contexte "from-internal" et configuré un niveau bas de sécurité "insecure=invite,port" pour notre serveur Exchange. Asterisk refuse donc le "spoofing" d'identité, ce qui ne nous arrange pas dans notre cas...

J'ai trouvé deux parades:
  1. Ne pas mettre de "secret" sur l'extension qui doit pouvoir appeler via Exchange... L'extension n'ayant pas de mot de passe, un appel sans REGISTER préalable fonctionne!
  2. Utiliser le fameux UMOUTDIALPREFIX (par exemple, 5)
    • Créer un UM Dial Plan à 5 chiffres au lieu de 4
    • Lors de l'activation UM des utilisateurs, préfixez l'extension UM du chiffre choisi (par exemple, 2001 devient 52001)
    • Ajouter un Hunt Group dont le Pilot Number est 51000 et pointe vers le nouveau Dial Plan
    • Ajouter un Auto Attendant dont le Pilot Number est 51900
    • De là, il faut tout reconfigurer côté UM :(
Ensuite, il suffit de spécifier dans le fichier /etc/asterisk/global_custom.conf:

UMOUTDIALPREFIX = 5
UMVMPILOTNUMBER = 51000
UMAAPILOTNUMBER = 51900

Il ne sera plus possible d'appeler "facilement" des extensions Asterisk depuis Exchange (ex: au travers de l'Auto Attendant). Cela requerra une petite manipulation que je ne détaillerai que succinctement ici:
  • Créer un contexte "from-internal-Exchange" qui inclue le contexte "from-internal" - Définir ce contexte au niveau du SIP Trunk Exchange UM
  • Ajouter du code Asterisk dans ce contexte qui permet de tronquer le préfixe de l'extension UM lorsque le numéro appelé correspond à 52xxx
Voici ce qui conclue donc notre seconde partie, où nous avons intégré Exchange UM derrière Asterisk/Trixbox mais aussi et surtout notre SIP Trunk Freephonie.

Il va de soit qu'il est possible d'utiliser virtuellement n'importe quel SIP Trunk, voire même plusieurs numéros si votre fournisseur le supporte.

Dans ce dernier cas, il suffira de faire une route entrante par numéro, ce que j'aurai pu faire sans extension "2000" (l'intérêt de mon extension étant de pouvoir la retirer rapidement au niveau de mon SIP Trunk sans modifier la route entrante).

Post-mortem

Ce qui fonctionne bien:
  • Redirections vers la messagerie vocale
  • Accès aux standards automatiques Exchange UM
Ce qui fonctionne, mais au prix de quelques bidouilles:

  • Appels sortants, à cause de la façon dont Asterisk fonctionne - je conserve dans mon lab l'astuce de ne pas avoir de secret sur mes extensions, mais cela rend l'intégration non viable dans un environnement de production, à moins que cette fonctionnalité ne soit pas utilisée.
  • Il serait possible de mettre en oeuvre un Proxy SIP tel que SipX (qui sait aussi faire SIP Registar) et l'utiliser pour les appels sortants. Cela ajoute un serveur dans l'environnement et complifie légèrement notre environnement de tests, mais pourquoi pas...
Ce qui ne fonctionne pas du tout:
  • Indicateur de messages (MWI - Message Waiting Indicator) - Une fois encore Asterisk n'autorise pas la réception de messages de type NOTIFY en dehors d'un dialogue SIP (ayant donc commençé par un INVITE) ce qui a pour conséquence un retour avec une erreur 489 (Bad request).
  • Un patch est censé exister, il me semblait même qu'il était incorporé dans la 1.6.0. Si tel est le cas, j'ai dû rater quelque chose :p -- Il sera vraisemblablement incorporé dans la v1.6.2.

TUTORIEL: Intégration Exchange 2007/2010, Trixbox/Asterisk et SIP Trunk Freephonie! (Première partie)

Dans cette première partie nous allons aborder la configuration d'une Trixbox avec la messagerie unifiée d'Exchange 2007 ou Exchange 2010 (mon lab utilisant Exchange 2010).

Je passe les détails d'installation des deux parties, vous devez bien sûr avoir un environnement Exchange qui fonctionne parfaitement, donc avec tous les rôles requis installés (CAS, MBX, HTS, UM). Je prends donc l'hypothèse que tout fonctionne bien de ce côté là...

Votre Trixbox (http://www.trixbox.org/) doit utiliser Asterisk 1.6.x (qui supporte nativement le SIP/TCP (enfin!!!)) et disposer d'au moins une interface réseau routé vers le serveur Exchange UM. Pour la seconde partie, nous aurons besoin d'une interface réseau routée vers Internet (au travers de votre *Box) -- bien sûr ce n'est pas requis pour l'intégration Exchange UM.

Dans ma configuration j'ai donc:
  • eth0: interface "publique" - 192.168.1.7 ==> passerelle par défaut 192.168.1.1
  • eth1: interface "privée" - 192.168.100.7 ==> aucune passerelle mais une route statique car j'ai plusieurs sous réseaux vrituels
  • Assurez vous que votre Trixbox a bien accès aux deux réseaux, qu'elle peut résoudre les noms internes et externes et qu'elle a bien accès à Internet.
  • N'hésitez pas à passer du temps pour vérifier tous ces points 
  • Effectuez ensuite une mise à jour complète de votre Trixbox avec la commande "yum -y update" puis redémarrez avec "reboot".
Pour administrer votre Trixbox vous devrez définir un mot de passe au compte "maint". Vous devez effectuer ceci puis un shell après installation et configuration avec la commande "passwd-maint".

L'interface d'administration de votre Trixbox est accessible par un navigateur (ex: http://192.168.1.7 depuis mon réseau "maison"). N'utilisez pas IE8 car celle-ci fonctionne mal sous le navigateur de Microsoft. Personnellement j'utilise Firefox... :°)

Définition des numéros/noms de la configuration Asterisk 
  • Nom de mon SIP Trunk: Exchange UM 
  • Numéro Pilote pour la messagerie vocale (Pilot Number): 1000
  • Numéro Pilote pour le standard automatique (Auto Attendant): 1900
Ces valeurs seront celles reprises ultérieurement dans la configuration personnalisée d'Asterisk. Si vous souhaitez utiliser d'autres valeurs, n'hésitez pas, mais n'oubliez pas de les changer où cela est nécessaire (en général elles apparaitront en rouge dans les explications/valeurs mentionnées dans l'article).

Configuration de l'environnement Asterisk

Avant toute chose, nous allons configurer certains fichiers permettant:
  • De définir des variables globales dans la configuration d'Asterisk, et donc d'être "propre" au regard de la logique de l'IP-PBX;
  • D'ajouter une macro permettant de prendre en charge la diversion vers Exchange sans traffiquer les fichiers natifs d'Asterisk/Trixbox.
  • D'ajouter une application permettant de prendre en charge les appels entrants depuis l'extérieur (nous verrons cela dans la configuration du SIP Trunk Freephonie).
Le but de ces manœuvres, vous l'aurez peut-être compris, est de minimiser l'impact sur la configuration initiale d'Asterisk, mais aussi d'éviter en cas de mise à jour de la Trixbox un écrasement "sauvage" de nos modifications.  Nous aurons aussi la capacité de gérer les appels entrants de plusieurs manières !

Vous pouvez utiliser un shell directement sur votre serveur Trixbox, ou utiliser un client SSH pour y accéder à distance. Utilisez l'éditeur de texte de votre choix pour créer ou modifier les fichiers. Sachez qu'il est possible de modifier les fichiers existants dans la configuration Trixbox (PBX => Config file editor), mais "l'éditeur" est particulièrement simpliste et désagréable à l'usage... 

/etc/asterisk/sip_general_custom.conf

Ce fichier nous permet d'ajouter le support du SIP/TCP pour Asterisk 1.6.x et autoriser les messages SIP de type redirection (302) hors d'Asterisk. Ceci est requis car Exchange UM gère la signalisation des appels entrants sur les ports 5060 (TCP) et 5061 (TLS) au travers du service Exchange UM mais redirige ceux-ci vers le service Speech Engine qui écoute sur d'autres ports (en fonction du "recyclage"), à savoir 5065/5067 en SIP/TCP et 5066/5077 en SIP/TLS.

; Enables SIP/TCP support for Asterisk (default port is 5060)
tcpenable=yes

; Enables 302/Redirect messages outside of Asterisk
; Required for Exchange UM to redirect from port 5060 (UM listening port) to 5065/5067 (Speech Engine)
promiscredir=yes


/etc/asterisk/globals_custom.conf

; Exchange UM Configuration
UMSIPTRUNK = ExchangeUM
UMOUTDIALPREFIX =
UMVMPILOTNUMBER = 1000
UMAAPILOTNUMBER = 1900


La variable UMOUTDIALPREFIX permet d'avoir un espace d'extensions séparé entre Asterisk et Exchange. Par exemple, si les extensions Asterisk sont sous forme XXXX, alors la diversion sera faite pour l'extension Exchange XXXX. Ainsi si le prefixe est 5, l'extension UM pour l'extension Asterisk 2001 sera 52001 Dans ce cas, le Dial Plan Exchange sera configuré pour une longueur d'extension de 5.

Je reviendrai plus tard sur le pourquoi-du-comment et l'interêt du préfixe... Pour l'instant faisons sans... :)

/etc/asterisk/extensions_custom.conf

Le fichier extensions_custom.conf est inclus par le fichier extensions.conf et permet de définir des macros ou applications développées pour un besoin spécifique. C'est ce que nous allons faire ici.

Dans ce fichier, nous allons donc créer:
  • Une macro nommée "eum-vm" (en-tête [macro-eum-vm]) qui permet de gérer la diversion vers Exchange si l'extension est activé pour Exchange UM (nous reviendrons sur le "comment" lors de la configuration de nos extensions/utilisateurs Asterisk)
  • Une application nommée "app-eum" (en-tête [app-eum]) qui va permette de définir des destinations personnalisées ("Custom Destinations") que nous utiliserons plus tard. Nous distinguons deux procédures stockées dans cette application: ova et aa. "ova" pour Outlook Voice Access et "aa" pour "Auto Attendant".

[macro-eum-vm]
exten => s,1,NoOp(Entering Exchange UM Voicemail)

exten => s,n,Set(EXTTOCALL=${ARG1})
exten => s,n,Set(VMBOX=${UMDIALPREFIX}${EXTTOCALL})
exten => s,n,Set(DIALSTATUS=${ARG2})
exten => s,n,Set(REASON=unavailable)

exten => s,n,Macro(get-vmcontext,${EXTTOCALL})
exten => s,n,GotoIf($["${VMCONTEXT}"="eum"}]?eum,1)
exten => s,n,NoOp(Leaving Exchange UM Voicemail because user is not EUM-enabled)

exten => eum,1,GoSub(diversion-${DIALSTATUS},1)
exten => eum,n,SIPAddHeader(Diversion: <${vmbox}>\;reason=${REASON}\;screen=no\;privacy=off)
exten => eum,n,Dial(SIP/${UMSIPTRUNK}/${UMVMPILOTNUMBER})
exten => eum,n,NoOp(Extension is reporting ${DIALSTATUS} but is not passing to Exchange UM!)

exten => diversion-BUSY,1,Set(REASON=user-busy)
exten => diversion-BUSY,n,Return

exten => diversion-NOANSWER,1,Set(REASON=no-answer)
exten => diversion-NOANSWER,n,Return

exten => diversion-CHANUNAVAIL,1,Set(REASON=unavailable)
exten => diversion-CHANUNAVAIL,n,Return

exten => _diversion-.,1,Set(REASON=unavailable)
exten => _diversion-.,n,Return

[app-eum]
exten => ova,1,NoOp("Incoming call to Exchange UM Outlook Voice Access")
exten => ova,n,Dial(SIP/${UMSIPTRUNK}/${UMVMPILOTNUMBER})
exten => ova,n,NoOp("Call is not passing to Exchange UM!")
exten => ova,n,Playback(sorry-youre-having-problems&goodbye)
exten => ova,n,Macro(hangupcall,)

exten => aa,1,NoOp("Incoming call to Exchange UM Auto Attendant")
exten => aa,n,Dial(SIP/${UMSIPTRUNK}/${UMAAPILOTNUMBER})
exten => aa,n,NoOp("Call is not passing to Exchange UM!")
exten => aa,n,Playback(sorry-youre-having-problems&goodbye)
exten => aa,n,Macro(hangupcall,)


Explications:
  • La macro "eum-vm" recupère le contexte de messagerie vocale de l'extension (VMCONTEXT). Si celui-ci est positionné à "eum", alors Asterisk effectuera un appel vers le numéro pilote défini (que nous configurerons dans Exchange)
  • L'application "app-eum" contient les procédures stockées définies par le mot-clef "exten" et les valeurs "<nom>,<ligne>,<commande>", ce qui permet d'effectuer des sauts directs depuis d'autres contextes/macros/applications.

/etc/asterisk/extensions_override_freepbx.conf

Le problème majeur d'Asterisk et de la Trixbox est le manque de souplesse dans la configuration par l'interface (Trixbox). Aussi, il n'est pas prévu de prendre en compte un autre système de messagerie vocale que celui inclus dans l'application (au contraire de SipX, qui est prévu pour...).

L'idée est donc d'utiliser le fichier extensions_override_freepbx.conf, qui permet d'écraser une macro existante par une macro "personnelle". Nous allons donc écraser la macro "exten-vm" qui gère l'appel aux extensions/groupes et redirige vers la messagerie vocale si l'extension est activée pour, ou gère l'échec de l'appel sinon...

En utilisant cette méthode, nous conservons la logique initiale d'Asterisk/Trixbox, tout en rajoutant la gestion de la messagerie vocale d'Exchange avant celle de la messagerie vocale native.

Il suffit donc de copier-coller la macro "exten-vm" depuis le fichier extensions.conf dans le fichier extensions_override_freepbx.conf et d'ajouter les lignes en rouge. L'appel a la macro "eum-vm" est donc effectué avant la vérification de la messagerie vocale intégrée. On passe les arguments EXTTOCALL et DIALSTATUS qui correspondent au numéro d'extension appelé et à la raison d'échec de l'appel.

Voici ce que ça donne:

; Ring an extension, if the extension is busy or there is no answer send it
; to voicemail
; ARGS: $VMBOX, $EXT
[macro-exten-vm]
exten => s,1,Macro(user-callerid)
exten => s,n,Set(RingGroupMethod=none)
exten => s,n,Set(VMBOX=${ARG1})
exten => s,n,Set(EXTTOCALL=${ARG2})
exten => s,n,Set(CFUEXT=${DB(CFU/${EXTTOCALL})})
exten => s,n,Set(CFBEXT=${DB(CFB/${EXTTOCALL})})
exten => s,n,Set(RT=${IF($[$["${VMBOX}"!="novm"] | $["foo${CFUEXT}"!="foo"]]?${RINGTIMER}:"")})
exten => s,n,Macro(record-enable,${EXTTOCALL},IN)
exten => s,n,Macro(dial,${RT},${DIAL_OPTIONS},${EXTTOCALL})
;
exten => s,n,Macro(eum-vm,${EXTTOCALL},${DIALSTATUS})
;
exten => s,n,GotoIf($[ $["${VMBOX}" != "novm"] & $["${SCREEN}" != ""] & $["${DIALSTATUS}" = "NOANSWER"] ]?exit,return)
exten => s,n,Set(SV_DIALSTATUS=${DIALSTATUS})
exten => s,n,GosubIf($[$["${SV_DIALSTATUS}"="NOANSWER"] & $["${CFUEXT}"!=""] & $["${SCREEN}" = ""]]?docfu,1) ; check for CFU in use
on no answer
exten => s,n,GosubIf($[$["${SV_DIALSTATUS}"="BUSY"] & $["${CFBEXT}"!=""]]?docfb,1) ; check for CFB in use on busy
exten => s,n,Set(DIALSTATUS=${SV_DIALSTATUS})
exten => s,n,NoOp(Voicemail is '${VMBOX}')
exten => s,n,GotoIf($["${VMBOX}" = "novm"]?s-${DIALSTATUS},1) ; no voicemail in use for this extension
exten => s,n,NoOp(Sending to Voicemail box ${EXTTOCALL})
exten => s,n,Macro(vm,${VMBOX},${DIALSTATUS},${IVR_RETVM})

; Try the Call Forward on No Answer / Unavailable number
exten => docfu,1,Set(RTCFU=${IF($["${VMBOX}"!="novm"]?${RINGTIMER}:"")})
exten => docfu,n,Dial(Local/${CFUEXT}@from-internal/n,${RTCFU},${DIAL_OPTIONS})
exten => docfu,n,Return

; Try the Call Forward on Busy number
exten => docfb,1,Set(RTCFB=${IF($["${VMBOX}"!="novm"]?${RINGTIMER}:"")})
exten => docfb,n,Dial(Local/${CFBEXT}@from-internal/n,${RTCFB},${DIAL_OPTIONS})
exten => docfb,n,Return

exten => s-BUSY,1,NoOp(Extension is reporting BUSY and not passing to Voicemail)
exten => s-BUSY,n,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?exit,1)
exten => s-BUSY,n,Playtones(busy)
exten => s-BUSY,n,Busy(20)

exten => s-NOANSWER,1,NoOp(Extension is reporting NOANSWER and not passing to Voicemail)
exten => s-NOANSWER,n,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?exit,1)
exten => s-NOANSWER,n,Return

; Anything else comes here
exten => _s-.,1,Noop(IVR_RETVM: ${IVR_RETVM} IVR_CONTEXT: ${IVR_CONTEXT})
exten => _s-.,n,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?exit,1)
exten => _s-.,n,Playtones(congestion)
exten => _s-.,n,Congestion(10)

; Short burst of tones then return
exten => exit,1,Playback(beep&line-busy-transfer-menu&silence/1)
exten => exit,n(return),MacroExit()


Rechargement de la configuration Asterisk

Maintenant que nous avons configuré nos personnalisations, il est nécessaire qu'elles soient prises en compte :)
Le plus simple est de se connecter au shell et de taper asterisk.reload ou alors asterisk -r -x reload.

Création du SIP Trunk et de la route vers Exchange

Maintenant que la configuration est prise en compte, nous allons créer notre SIP Trunk vers Exchange.

Dans la console Trixbox, allez dans le menu PBX ==> PBX Settings ==> (Basic) ==> Trunks. Ajoutez alors un SIP Trunk ("Add SIP Trunk") avec les paramètres suivants:


Si vous voulez faire un copier-coller:

type=friend
host=192.168.101.20
context=from-internal
transport=tcp
insecure=invite,port
qualify=yes
canreinvite=no
disallow=all
allow=alaw&ulaw
dtmfmode=auto


Bien sûr, vous devez modifier l'attribut "host" en spécifiant l'adresse IP ou le nom d'hôte complet de votre serveur Exchange UM (ex: exum.domaine.local). J'utilise l'adresse IP pour m'affranchir de problèmes éventuels de résolution de nom, et par fainéantise aussi... :)

Explications:
  • context ==> Le contexte "from-internal" permet à Exchange d'appeler au travers d'Asterisk. L'utilisation d'un autre contexte est possible, mais Exchange ne sera pas autorisé à appeler vers l'extérieur à moins de personnaliser le contexte pour y inclure des routes.
  • insecure ==> permet d'effectuer des dialogues SIP depuis Exchange UM (pour les appels sortants) en mode "anonyme" -- ici, nous restreignons sur le verbe "INVITE" (qui initie un dialogue SIP) et sur le port. Certains utilisent "insecure=very" qui fonctionne aussi mais qui pour le coup est vraiment non sécurisé !
  • transport ==> permet de dire à Asterisk que ce SIP Trunk utilise le SIP/TCP, car sinon le transport par défaut est UDP.
  • disallow/allow ==> permet de retirer tous les codecs supportés puis de n'autoriser que G.711 a-Law et u-Law dans la négociation média (protocole SDP encapsulé dans le dialogue SIP)
  • dtmfmode ==> permet de négocier le meilleur mode pour la prise en charge du Dial Tone Multi-Frequencing au travers du codec utilisé. J'ai mis cette valeur car j'avais des soucis depuis des appels effectués par mon GSM. Il est important aussi que cela soit géré au niveau du SIP Trunk depuis Freephonie (ou tout autre SIP Trunk depuis lequel on accepte de router vers Exchange)
Voici notre SIP Trunk créé, il suffit maintenant de créer une route vers Exchange. Dans la console Trixbox, allez dans le menu PBX ==> PBX Settings ==> (Basic) ==> Outbound Routes.

Ajoutez alors une route ("Add Route") avec les paramètres suivants:

Explications:

  • Route Name: ExchangeRoute ==> mettez le nom que vous voulez :)
  • Dial Patterns: 1XXX ==> Permet de router tous les numéros à 4 chiffres commençant par 1. Mes numéros "pilote" étant 1000 et 1900, ceci explique cela...
  • Trunk Sequence ==> choissez le SIP Trunk ExchangeUM créé précédemment.
Assurez-vous que la route est prioritaire par rapport aux routes existantes, dont en particulier la route "Outbound". Une fois toutes ces modifications appliquées, cliquez sur "Apply configuration changes" en haut de la console de gestion du PBX.

Configuration des extensions/utilisateurs Asterisk

Maintenant que nous sommes prêts à nous connecter avec Exchange, nous allons créer des extensions/utilisateurs Asterisk. Dans mon environnement les extensions sont dans la plage 2001-2999, j'ai donc créé les extensions 2001, 2002, 2003... Je réserve 2000 pour un usage ultérieur (gestion des appels entrants).

Dans la console Trixbox, allez dans le menu PBX ==> PBX Settings ==> (Basic) ==> Extensions. Ajoutez alors aux moins deux extensions avec les paramètres suivants: 
  • Device Type: Generic SIP Device
  • Extension: 2XXX (où XXX est compris entre 001 et 999)
  • Display Name: Ce que vous voulez
  • Voicemail & Directory:
    • Status: Enabled
    • VM Context: eum
Voici ce que ça donne:



Explications:
  • Activation de la prise en charge de la messagerie vocale pour cette extension
  • Le VM Context permet de mettre le mot clef "eum" permettant à notre macro d'effectuer la diversion vers le numéro pilote Exchange UM. Ainsi, il est possible de basculer simplement du système de messagerie vocale intégré à celui d'Exchange... Pratique ;)
Notes:
  • Trixbox va vous avertir de deux choses:
    • Si vous n'avez pas défini de "secret" (en général il s'agit d'un PIN), l'extension pourra émettre des appels sans être authentifiée. Bien sûr dans le monde réel, mettre un mot de passe est une bonne idée, mais nous verrons plus tard pourquoi cela vas nous poser un problème...
    • Vous n'avez pas mis de "secret" sur la messagerie vocale... Pour cause, le PIN est géré par Exchange. Vous pouvez en mettre un ici, mais il ne servirait à rien.
N'oubliez pas de valider vos changements à coups de "Apply configuration changes" en haut de la console de gestion du PBX.

Configuration d'Exchange

Dans Exchange, nous devons configurer:
  • Un UM Dial Plan
    • Le mien est nommé FR-0001 et configuré ainsi:
      • Type: TelephoneExtension
      • Voip Security: Unsecured
      • Number of digits in extensions: 4
      • Sur Exchange 2010, un "Country/Region Code" est requis, utilisez 33 pour la France.
  • Une UM IP Gateway
    • Name: Trixbox
    • IP address: 192.168.x.y (l'IP interne de votre Trixbox)
    • Ne pas associer un UM Dial Plan par défaut (autant faire propre et l'associer au travers du Hunt Group)
  • Un UM Hunt Group
    • Name: HG-0001
    • Pilot Number: 1000
    • Associated Dial Plan: FR-0001
  • Un UM Auto Attendant
    • Name: FR-0001_AA
    • Pilot Number: 1900
Notes:
  • Ajoutez les packs de langue de votre choix sur votre serveur Exchange UM
  • N'oubliez pas d'associer votre serveur Exchange UM à l'UM Dial Plan nouvellement créé !!!
  • Choisissez la langue par défaut de votre Dial Plan et de votre Auto Attendant une fois le serveur associé car la liste des langues disponibles est générée en fonction des langues disponibles sur le (ou les) serveur(s) associé(s)
  • N'oubliez pas de configurer la stratégie créée par défaut (FR-0001 Default Policy) afin de simplifier la securité des codes PIN (par exemple: 4 digits, empêcher l'expiration, autoriser les PIN non complexes (cocher "Allow common patterns in PIN")
Attendez quelques minutes que la configuration soit prise en compte sur le serveur UM.

Activez alors la Messagerie Unifiée sur vos utilisateurs dont l'extension téléphonique correspond avec celle d'Asterisk/Tribox. Assurez vous que l'utilisateur A correspond à l'extension A, utilisateur B à l'extension B, etc etc...

Premiers tests, commençons (enfin) à "jouer" !

Voici les actions permettant de valider que votre intégration est un succès:
  • Connectez un SIP Phone type X-Lite, eyeBeam (payant!) ou autre... à votre Asterisk. Utilisez par exemple l'extension 2002.
  • Appelez l'extension 2001. Celle-ci étant indisponible, la diversion va s'effectuer vers Exchange UM. Magique, vous pouvez laisser un message !
  • Composez maintenant l'extension 1000, vous tombez sur Outlook Voice Access
    • Entrez un numéro d'extension, par exemple 2001 puis le PIN Exchange UM correspondant
    • Pilotez votre BàL avec la voix !
  • Composez maintenant l'extension 1900, vous tombez sur votre Auto Attendant
    • Prononcez le nom de quelqu'un pour être mis en relation!
    • Selon la configuration de votre Auto Attendant, il faudra recourir à quelques modifications...
Avant de conclure cette première partie, voici un aperçu de ma configuration:






Vous l'autrez compris, les élements ci-dessous vont permettre d'introduire la configuration des appels sortants d'Exchange UM vers le reste du monde.

Nous verrons donc ces points dans la prochaine partie:
  • Configuration du SIP Trunk vers Freephonie
  • Configuration du routage Sortant/Entrant au travers du SIP Trunk Freephonie
  • Configuration des appels sortants depuis Exchange
  • Configuration des appels entrants vers Exchange
D'ici là, amusez vous bien !!!!

Quelques astuces si cela ne fonctionne pas:
  • Depuis un shell Linux, utilisez asterisk -r pour vous connecter à la console Asterisk
  • De là, vous verrez "sans rien faire" les commandes liées aux macros et contextes s'exécuter lors d'un appel. Assurez vous que les macros que nous avons définies au début de cet article soient bien prises en compte.
  • Si vous voulez diagnostiquer les messages SIP, utilisez sip set debug ip 192.168.x.x (où bien sûr 192.168.x.x correspond à l'adresse IP de votre serveur Astrisk/Trixbox)

mardi 10 novembre 2009

INFO: Exchange Server 2010 disponible sur MSDN!

Ayet, Exchange Server 2010 RTM est "officiellement" disponible:
  • Microsoft a publié hier l'ISO d'Exchange Server 2010 sur MSDN.
  • Et la version d'évaluation est disponible sur Technet.
Le Père Noël est en avance cette année... :)

mercredi 4 novembre 2009

INFO: Exchange Server 2007 sera supporté sur Windows 2008 R2

Retournement de situation alors qu'Exchange Server 2010 est tout juste lancé officiellement!

Contrairement à ce qui avait été annoncé il y a quelques semaines, l'équipe produit Exchange Server a décidé de supporter Exchange Server 2007 sur Windows Server 2008 R2, l'annonce vient d'être effectuée sur le site de la DevTeam Exchange. Le support se fera au travers d'une mise à jour, qui sera disponible dans le courant de l'année 2010 (aucune date, ne serait-ce qu'estimée pour l'instant).

Drôle de paradoxe: d'un côté Windows Server 2008 R2 étant un système moderne et performant, ne pourra apporter que des performances accrues à Exchange Server 2007... De l'autre, le support de ce système pour la version "n-1" d'Exchange Server risque de freiner l'adoption d'Exchange Server 2010 (l'argument Windows Server 2008 R2 était tout de même un excellent argument :p). De plus, il existait de réelles questions techniques pour lesquelles le support de Windows Server 2008 R2 n'était pas souhaité (en particulier sur les changements DCOM).

Non, Exchange Server 2007 n'est pas mort :) !!! Mais la DevTeam et le support Microsoft vont sans doute difficilement apprécier de maintenir/supporter un produit sur trois systèmes d'exploitation différents [NDLR: je ne compte pas Windows Server 2003 R2] (ce qui sera une première pour Exchange Server !).

Côté OCS 2007 R2, rien de neuf pour l'instant. Pour avoir moi-même testé certains rôles, tout ne fonctionne pas avec Windows Server 2008 R2. Concernant les services de Pool, je n'ai rien remarqué de spécial (mais je n'ai pas tout testé). Pour CWA R2 c'est une autre histoire: bien qu'arrivant à s'installer et à s'activer, il est impossible de créer un site Web... question de Metabase (IIS 7.0 VS IIS 7.5). Bref, ce n'est pas gagné... :)

Affaire à suivre...

dimanche 1 novembre 2009

INFO: Mise à jour cumulative #3 pour OCS 2007 R2 et MOC 2007 R2

MAJ: Microsoft a publié ce Mardi 3 Novembre un gros executable contenant toutes les mises à jour du QFE3. L'executable s'appelle ServerUpdateInstaller.exe et est téléchargeable sur la page résumant les liens de téléchargement du QFE3.

ATTENTION toutefois: l'utilitaire de mise à niveau n'effectue pas la mise à jour de la base, vous devez récupérer le MSI OCS2009-DBUpgrade.msi - Celui-ci ne s'applique qu'à un Pool, puisqu'il patche la base de données SQL afin de modifier le schéma. Dans le cadre d'un Pool Enterprise, inutile donc de l'appliquer sur chaque serveur frontale. N'oubliez pas que cette màj de la base est requise depuis le QFE2 afin que les correctifs s'appliquent effectivement (sinon certains bugs ne sont pas corrigés).

Microsoft a publié le QFE3 pour OCS 2007 R2, dont le Build passe donc en 56. Cette mise à jour permet d'intégrer le client IM présent dans Outlook Web App d'Exchange Server 2010 avec OCS 2007 R2. Afin de faire fonctionner les deux produits ensemble, la mise à jour de l'UCMA API 2.0 doit être déployée partout (sur les serveurs d'Accès Client Exchange 2010 _et_ sur les serveurs OCS 2007 R2).

Au menu, quatre mises à jour datées d'Octobre 2009, qui viennent en sus des mises à jour de Juillet et Avril.

L'intégralité des articles liés est ici. Les liens de téléchargement des mises à jour sont quant à eux ici.

Côté client:

TUTORIEL: Construire un répartiteur de charge pour vos labs!!!

Bon, cela fait maintenant quelques mois que j'avais commençé à penser à rediger un sujet sur la répartition de charge avec OCS 2007 R2 et Exchange... mais je n'avais pas le temps.

J'avais donc mis en place dans mon lab un répartiteur de charge (aussi appelé HLB pour "Hardware Load Balancer" bien qu'il n'ait rien de matériel :)), au début un peu bancal, mais fonctionnel. Mon souci principal était qu'il ne supportait pas le mode SNAT pour OCS 2007 R2. Il tournait sur une OpenSUSE 11.1 élaguée de ses fonctions principales. La distro étant un peu vieillotte, j'ai du mettre tout un tas de mise à jour, et recompiler pas mal de packages afin d'arriver à un resultat satisfaisant... mais trop long à documenter.

N'arrivant pas à dormir ce soir, je me suis mis devant Kamelott Live VI et commençé à tout refaire, pour cela j'ai cherché une distribution Linux récente et légère. Mon choix s'est porté sur une Ubuntu Server 9.10 (basé sur Debian je crois).

Mon HLB tourne donc sur mon serveur Hyper-V R2, avec 128 Mo de mémoire, en pleine charge, je suis à 70 Mo de mémoire consommée... dur dur =°)

Le principe:

  • Une machine virtuelle Linux, basée sur un noyau 2.6.18 ou + car ce noyau support le "Transparent Proxy" de manière stable depuis cette version;
  • Pour activer les fonctionnalités de type SNAT, il faut "mangler" le protocole TCP et le manipuler de manière à arriver à devenir "transparent", cela est fait avec iptables (version 1.4.5);
  • Deux réseaux: une réseau frontal (où l'adresse virtuelle est déclarée) et un réseau dorsal (où se situent les serveurs mis en répartition de charge) -- le HLB joue à la fois un rôle de routeur, répartiteur et "translateur";
  • Pour le service de répartition de charge, je me suis basé sur l'excellent HAProxy (http://haproxy.1wt.eu/) qui est d'ailleurs utilisé dans l'appliance "Loadbalancer.org" (cette dernière utilise je pense sensiblement mêmes techniques que j'ai utilisées, mais eux sont des "pros" du réseau donc j'imagine que leur appliance fonctionne mieux ;))
Le reste est de la configuration. Dans l'exemple fourni ci-dessous, je ne respecte probablement pas toutes les "Best Practices", mais ça fonctionne plutôt pas mal !


Petite surprise, j'ai rajouté la répartition de charge Exchange 2010, avec le RPC ClientAccessArray (perso, j'adore!!!).

Voici donc les instructions, elles sont en anglais car j'en ai d'abord fait profité mes collègues Avanade et mes pairs MCM. Nul besoin de mentionner qu'il faut un minimum de connaissances Linux, et quand même quelques bonnes connaissances OCS et Exchange 2007/2010 car je n'ai presque rien détaillé de ce côté (désolé, j'essayerai de me ratrapper plus tard =)).


Cliquez sur le lien ci-dessous pour accéder aux fichiers de configuration et aux instructions (que j'essayerai de maintenir à jour au fur et à mesure de mes périgrinations =°)).




mercredi 28 octobre 2009

INFO: OCS/LCS/MOC et la mise à jour KB974571... suite et fin !

Microsoft a mis a disposition un fix permettant d'installer la mise à jour de sécurité KB974571 sur des serveurs LCS 2005/OCS 2007/OCS 2007 R2.

Il est recommandé d'appliquer le fix (il s'agit d'un petit utilitaire appelle 'ocsasnfix.exe') avant l'installation du correctif KB974571.

L'article de la base de connaissance a été mis à jour en conséquence.

mercredi 14 octobre 2009

LCS/OCS/OCS R2 -- ATTENTION, ne pas installer la MàJ Windows KB974571

(mise à jour: la DevTeam a publié l'information sur son blog officiel -http://communicationsserverteam.com/archive/2009/10/14/632.aspx)

Microsoft a publié dans son "Patch Tuesday" du 13/10 un ensemble de correctifs de securité de niveaux "Important" ou "Critique".

Cependant, suite à l'installation de ces correctif sur mon lab, mon service Front-End ne démarrait plus avec une erreur "Evaluation period has expired, etc etc".

Bref, il va sans dire que je n'ai pas de version d'évaluation, donc j'ai supprimé toutes les mises à jour installées, et cela a résolu le problème.

J'ai donc réinstallé toutes les MàJ une par une, pour finalement arriver à la KB974571 (http://support.microsoft.com/kb/974571) qui consititue une mise à jour de la CryptoAPI de Windows. Cette même API est utilisée afin de générer/valider la clef qui gère la licence sur le service Front-End. Cela ressemble donc fort à un problème de rétrocompatibilité des algorithmes de chiffrement.

Apparement, je ne suis pas tout seul: certains collègues bloggeurs reportent exactement le même problème, et nos IT l'ont rencontré aussi sur notre environnement de pré-production/qualification.

Il faut savoir aussi que le problème peut toucher les environnements LCS 2005 et OCS 2007.

Comme quoi, avoir un environnement de test est, et restera toujours une excellente idée :)

Les équipes produit Windows et OCS sont en cours d'analyse de la cause du problème. La seule méthode de résolution pour l'instant est de désinstaller la mise à jour.

lundi 12 octobre 2009

Tutoriel: Exchange 2010 - Intégration OCS dans OWA

Depuis la RC1, je me suis mis un peu plus à Exchange 2010 et ses nouvelles fonctionnalités, sauf une: l'intégration E2010/OCS 2007R2. En effet, tant qu'E2010 n'était pas RTM, nos chers IT admins à Seattle ne voulaient pas nous donner les composants d'intégration, alors je me suis dit "wait'n'see"...

Nous allons donc voir comment intégrer l'Outlook Web App d'Exchange 2010 avec OCS 2007 R2. Et comme Microsoft fait bien les choses, c'est très simple! :)

Pré-requis

Vous devez d'abord avoir:
  • Un rôle de serveur d'accès client (CAS: Client Access Server) pleinement fonctionnel et disposant d'un certificat WebServer ou équivalent, et dont le sujet (attribut Subject Name) est un nom d'hôte valide - Il ne s'agit pas nécessairement du certificat utilisé par OWA. Ce qui importe, c'est de bien noter le nom complet qualifié dans cet attribut, car c'est avec ce nom que le serveur Exchange se présentera au serveur OCS.
  • Vous devez avoir au moins un pool OCS 2007 R2 déployé et lui-même parfaîtement fonctionnel (NDLR: l'intégration n'est pas supportée avec OCS 2007).
  • Cela peut paraîtré évident, mais le(s) compte(s) utilisé(s) pour se connecter doit être activé pour Exchange et OCS. Assurez-vous que vous pouvez vous connecter avec Communicator 2007/R2 avec vos comptes de test.
Installation des binaires

Le composant est livré sous la forme d'un MSI, qui contient les binaires suivants:
  • .NET Framework 3.5.1 x64
  • Visual C++ 2008 x64 redist
  • Unified Communications Managed API 2.0 (UCMA 2.0)
  • CWAOWASPP.msi (le composant OCS pour OWA, il s'agit simplement d'une DLL qui s'enregistrera)
Tout cela est très famillier n'est-ce pas :) - Oui, à l'exception du dernier, les binaires à installer correspondent aux binaires d'OCS 2007 R2. Après installation, une mise à jour UCMA 2.0 sera nécessaire (j'ai un build 3.5.6907.45 qui n'est pas encore disponible, j'essayerai avec le build 37 tout de même par curiosité).

MAJ: Je confirme que l'UCMA 2.0 build 45 est un minimum requis pour que le chat fonctionne entre un client OWA et un client MOC, sinon seule la présence est fonctionnelle.

Tous ces composants doivent être installés dans l'ordre ci-dessus, sur chaque serveur ayant le rôle Client Access, et sur lesquels la fonctionnalité devra être activée. Bien évidemment, il est nécessaire de déployer le composant sur chaque serveur d'une même ferme. Je passe ici leur installation: sur Windows 2008 R2, le Framework 3.5.1 est déjà installé puisque c'est un pré-requis Exchange 2010.

Configuration du composant

Une fois tout ce petit monde installé, il suffit d'aller modifier le fichier Web.Config de l'application OWA. Pour cela, ouvrez un Exchange Management Shell, et tapez ceci:
notepad "$exinstall\ClientAccess\OWA\Web.Config"
Et cherchez la balise XML nommée: "IMPoolName". Il y a trois valeurs à spécifier:
  1. IMPoolName: le nom du Pool sur lequel se connecter - Personnellement j'utilise un Pool Director afin de rediriger la connection auprès du Home Pool légitime auquel appartient l'utilisateur. C'est presque essentiel dans un environnement à Pools multiples et simplifie énormément la configuration;
  2. IMCertificateIssuer: le nom distingué (Distinguished Name) de l'autorité de certification ayant émis le certificat à utiliser pour la connection MTLS sortante;
  3. IMCertificateSerialNumber: le numéro de série du certificat à utiliser.
Attention: les valeurs IMCertificateIssuer et IMCertificateSerialNumber sont très capricieuses!
  • IMCertificateIssuer doit correspondre exactement à la valeur de la propriété "Issuer" du certificat;
  • IMCertificateSerialNumber doit être au format "XX XX XX ... XX XX" c'est à dire, avec un espace entre chaque octet du noméro de série.
Vous avez deux techniques pour récupérer les bonnes valeurs:
  1. Les copier à partir d'une MMC "Certificates" qu'il vous faudra créér à la main au préalable (se référer à mes posts précédents);
  2. Utiliser la cmdlet Get-ExchangeCertificate -- Bien sûr c'est ma méthode préférée =°)
Voici une capture:


N'oubliez pas de répéter l'opération sur tous les CAS sur lesquel activer l'intégration...

Configuration d'OCS 2007 R2

Maintenant qu'Exchange est configuré, passons à OCS 2007 R2. Encore une fois c'est très simple, et dans l'absolu, complètement automatisable via le WMI.

Il suffit d'ajouter le nom complet qualifié du certificat configuré dans le Web.Config d'OWA, car je le rappelle, c'est avec ce nom que le serveur Exchange se présentera.

Note: le serveur OCS 2007 R2 doit faire confiance au certificat utilisé par le serveur Exchange, et vice-versa. Il est recommandé d'utiliser des certificats émis par la même autorité de certification, ou du moins, par une autorité de certification faisant partie de la même chaîne de certification (la racine étant bien évidemment une racine de confiance). Dans l'absolu, il serait techniquement possible d'utiliser le certificat auto-signé du serveur Exchange, mais cela ne serait pas viable dans la durée, et probablement non supporté par Microsoft.
Pour configurer l'autorisation, effectuez les manoeuvres suivantes:
  1. Ouvrez la MMC OCS 2007 R2;
  2. Selectionnez le Pool référencé dans le fichier Web.Config, effectuez un clic-droit puis selectionnez Properties ==> Front-End Properties;
  3. Dans l'onglet "Authorized Hosts", ajoutez une entrée correspondante au nom complet qualifié du certificat du serveur CAS Exchange, et assurez vous que "Treat as Authenticated" et "Throttle as Server" sont cochées;
  4. Validez et fermez la MMC OCS 2007 R2.
Il est normalement inutile de redémarrer les services "Front-End" du(des) serveur(s) du Pool, attendez simplement quelques minutes que la configuration soit appliquée (5 minutes max après une réplication AD).


Activation de la fonctionnalité

La fonctionnalité s'active ou se désactive de deux manières:

  1. Activation par application Web OWA
  2. Activation par segmentation dans une stratégie OWA (OwaPolicy)
Il va de soit que l'activation sur le serveur doit être faite avant, la stratégie OWA par défaut autorisant l'intégration IM dans OWA.

L'activation se fait par la commande Set-OWAVirtualDirectory avec les arguments "InstantMessagingType" et "InstantMessagingEnabled"

  • InstantMessagingType peut être "None", "OCS" ou "MSN";
  • InstantMessagingEnabled est un Booléen ($true ou $false).
La commande sera donc simplement celle-ci:

Set-OwaVirtualDirectory SERVEUR\WebApp -InstantMessagingType OCS -InstantMessagingEnabled $true


Une fois la WebApp configurée, il est nécessaire de la recycler (par la console IIS) ou plus simplement de redémarrer les services IIS sur le serveur CAS, à l'aide un désormais classique "iisreset /noforce" (si votre lab peine un peu, faites un iireset /stop puis un iisreset /start).

Testez l'intégration

Observez les eventlogs "Application" sur votre CAS ==> assurez vous qu'il n'y a aucune erreur de configuration, que l'application trouve bien la DLL d'intégration, etc etc... en cas de pépin, vous le verrez tout de suite.

Utilisez deux clients, ou connectez vous depuis un serveur quelconque à OWA, avec deux comptes, bien évidemment. Vous pouvez aussi utiliser deux navigateurs depuis le même poste... =°)

La première connection est toujours un peu longue, surtout dans un lab où la mémoire fait défaut. Après quelques secondes, vous retrouverez vos contacts, votre indicateur de présence ainsi que celui des autres utilisateurs. C'est simple mais tellement efficace :)

Voici une petite capture:


Et une autre avec un client MOC:


Voilà, Exchange 2010 sera disponible dans une dizaine de jours, j'aurais aimé pouvoir allez au TechEd, mais comme l'on dit chez nous "Business FIRST !!!" -- en effet, nous allons délivrer un projet Exchange 2010 chez un gros client et je ne tiens pas à rater ça! ;)

samedi 10 octobre 2009

Mettre à jour votre organisation Exchange 2010 RC1 vers la RTM

En tant que privilégiés du programme TAP, nous avons reçu les binaires Exchange 2010 RTM (build 21) !!!

Pour ceux qui mettrons leur lab à jour prochainement, voici les actions à exécuter, vous aller voir, c'est très simple:
  • Préparez à nouveau votre Active Directory: le plus simple est de faire un setup.com /preparead - ou en plusieurs étapes selon votre habitude/topologie;
  • Effectuez une mise à jour de vos serveurs/rôles selon le principe d'une mise à jour classique (ex: Service Pack) avec la commande setup.com /mode:upgrade
  1. Client Access Servers
  2. Hub Transport Servers et Edge Transport Servers
  3. Mailbox Servers
  4. Unified Messaging Servers
Sur mon lab, sous dimensionné, la mise à niveau a pris moins de 5 minutes (depuis un partage réseau de surcroit !!!). C'est hallucinant de voir la performance de Windows Server 2008 R2 en action, grâce aux pré-requis intégrés, tels que le .NET Framework, PowerShell v2, WinRM, etc...


Et voilà ce que ça donne :)


jeudi 8 octobre 2009

Exchange 2010 est RTM !!!

Alors que les MSDays viennent de se terminer en France, et que le TechEdh va bientôt avoir lieu (début Novembre à Berlin), l'équipe produit Exchange vient d'annoncer la finalisation du code d'Exchange 2010 RTM (Release To Manufacturing).

Une grande nouvelle donc, que nous attendions tous avec impatience ;)

Plus d'informations sur le blog de la DevTeam:
http://msexchangeteam.com/archive/2009/10/08/452775.aspx

Parmi les nouveautés, nous noterons en particulier:

  • Performances et capacité de haute disponibilité accrues, en combinant les couches "cluster" Windows, à la réplication continue améliorée depuis Exchange Server 2007 en introduisant le concept du Groupe de Disponibilité de Bases de Données (ou DAG, pour "Database Availability Group" en anglais).
  • Outlook Web Access, pardon, Outlook WebApp, qui s'enrichit d'une myriade de nouvelles fonctionnalités "out of the box" et très similaires à Outlook 2010 - Et qui introduit l'"Exchange Control Panel", une application Web permettant de gérer de manière simple des listes de distributions, boîtes aux lettres, etc... pour les administrateurs ou des administrateurs délégués.
  • Accès OWA Premium depuis IE, Firefox et Safari, grande démonstration d'ouverture de la part de la firme de Redmond.
  • Utilisation de PowerShell v2 et du PowerShell Remoting, mise en oeuvre des RBAC (Role-Based Access Control) qui permet de déléguer plus finement l'administration et de limiter (ou étendre) les outils/cmdlets.
  • Amélioration du rôle Unified Messaging, pour une reconnaissance vocale en français (entre autres), la possibilité d'utiliser un assistant personnel automatique, l'indicateur de message natif avec des IPPBX autres qu'OCS 2007/R2.
  • Les fameux MailTips, les surdoués de la bonne pratique de l'usage d'une messagerie :)
  • La vue sous forme de dissussions (Threading), dans OWA et Outlook 2010, tout le monde adore !
  • La recherche instantanée, et encore plein d'autres...

A dans quelques semaines, préparez vous à faire chauffer vos connexions Internet, préparez vos machines virtuelles, ça sent bon le lab "nouvelle génération" ;)

Pour notre part chez Avanade, nous étions sur le code de la RTM mais sans les corrections liées à l'internationalisation. Nous allons donc mettre à niveau dès que Microsoft nous aura fourni les binaires complémentaires (avant même la mise à disposition sur MSDN ou consors ;)) et donc pouvoir démarrer notre pilote "Enterprise Voice" avec la messagerie unifiée Exchange 2010 dans la foulée. Que du bonheur =°)

dimanche 4 octobre 2009

Configurer la passerelle XMPP pour interconnexion avec Jabber et GMail/GTalk

Preuve de la volonté de l'équipe produit Office Communications Server/Unified Communications de favoriser l'interconnexion avec les IM alternatifs (utilisant le XMPP au lieu du très standard SIP... :P), celle-ci a publié sur sont blog deux articles décrivant de manière simpe la configuration de la passerelle XMPP pour OCS. La méthode décrite est bonne, mais un peu simpliste et avec quelques erreurs, méfiez vous des nom d'hôtes/enregistrements DNS décrits.

Voici les liens:
De mon côté, ma passerelle de lab est configurée et la connexion à Jabber et GMail fonctionne. Cependant, vu que mon lab n'a pas de domaine public, c'est unilatéral (donc ça ne sert à rien :)).

Je suis donc en train de m'installer un serveur XMPP Jabber Open Source... Jabber2. Le hic, c'est que je n'ai aucune idée de s'il sera compatible avec la passerelle ou non. Cisco ayant acquis Jabber, l'ouverture de ce dernier va devenir compliquée... ( au passage: RIP Tandberg :( )

Bref, je vous tiens au courant dès que j'ai pu avancer un peu!

jeudi 1 octobre 2009

Changement dans les licences "PIC" pour OCS et passerelle XMPP

Comme vous le savez certainement déjà, la fédération avec la messagerie instantanée publique Windows Live est gratuite (dès lors que vous disposer des serveurs nécessaires à l'interconnexion) depuis Juin dernier.

Microsoft a annoncé la gratuité de la fédération avec AOL (à partir d'une CAL Standard ou via la Software Assurance).

En outre, le prix de l'abonnement pour fédération avec Yahoo! a été réduit de 50%, conséquence de la gratuité avec les autres fournisseurs.

Enfin, Microsoft a aussi publié la passerelle XMPP tant attendue permettant la fédération avec Jabber (à partir de la version 5.4) et Google Talk. Cette passerelle est un composant d'OCS 2007 R2 et fait donc partie de la suite: cela signifie que si vous avez déjà des licences OCS 2007 R2, vous n'avez aucune licence supplémentaire à acheter pour déployer ce composant, de même aucune licence cliente additionnelle n'est nécessaire, et ce composant est pleinement supporté par Microsoft.


Cependant, il sera nécessaire de déployer cette passerelle sur un serveur à part, et devra s'interconnecter avec un ou plusieurs serveurs "Edge" dans le réseau de périmètre (fédération avec Jabber externe/public) ou dans une "zone neutre" (fédération avec Jabber interne).

Pour ceux qui ne savent pas ce qu'est le XMPP, il s'agit simplement d'un protocole (eXtensible Messaging and Presence Protocol) alternatif à notre bon vieux SIP (et le XML intégré dedans entre autres) utilisé par OCS.

Passerelle XMPP pour OCS 2007 R2:
http://www.microsoft.com/downloads/details.aspx?FamilyID=aa560bfe-9960-473a-bfb8-53bff678cec4&displaylang=en

Que des bonnes nouvelles donc! :)

Le communiqué de presse complet d'Eric Swift est disponible ici (en anglais) :
http://www.microsoft.com/presspass/features/2009/oct09/10-01ucinterop.mspx

(Informations issues des release notes)


Limitations de la passerelle XMPP:
  • Messagerie instantanée et présence de base, mode texte (les autres modalités ne sont pas supportés) en peer-to-peer seulement (pas de conférence, même IM);
  • Les notes depuis les clients Communicator 2007 ne sont pas supportées;
  • Fonctionne seulement avec OCS 2007 R2 et OCS 2007, pas de support pour LCS 2005;
  • Les messages émis depuis OCS/R2 vers la passerelle n'aboutissent que sur le 1er point de présence du contact;
  • La souscription à la présence d'un utilisateurs OCS/R2 via la passerelle (ex: depuis Jabber ou Google) ne fonctionne que lorsque la présence de l'utilisateur OCS/R2 est modifiée.

jeudi 3 septembre 2009

Réoudre les erreurs 0-1-492 dans Communicator Web Access 2007 R2 sur Windows 2008

Si vous avez des erreurs 0-1-492 (Erreur: l'horloge interne de votre client n'est pas synchronisée avec celle du serveur) au moment de l'authenticiation intégrée sur un site CWA Interne, il faut vérifier le nom de service Kerberos du compte CWA doit comporter "http/fqdn.dusite.ext".

Par exemple, si votre site CWA interne est publié au niveau DNS avec le nom "cwa.societe.com", le nom de service principal sera "http/cwa.societe.com". Il n'est pas utile d'ajouter "as.cwa.societe.com" ni "download.cwa.societe.com" car ce sont des enregistrements CNAME (pointant vers "cwa.societe.com"). Le plus simple pour ajouter le nom principal Kerberos au compte CWA est d'utiliser SetSPN, par exemple:

setspn -A DOMAINE\CWAService http/cwa.societe.com

... Et de redémarrer le(s) serveur(s) (le Kerberos étant résident, un IISRESET ne résoudra probablement pas immédiatement le souci).

Malgré tout, cela peut ne pas suffire. Ce problème est récurrent dans les implémentations où le site CWA interne est mis derrière un répartiteur de charge. Il semble accentué dans une topologie multi-forêts (en particulier en mode forêt de ressource lorsque l'authentification NTLM est utilisée au niveau de la relation d'approbation (approbation de domaine, et non de forêt)).

Pour (définitivement :)) résoudre le problème, la solution de contournement est d'autoriser les accès anonymes sur la page /cwa/AuthMainCommandHandler.ashx du site CWA interne.

Microsoft n'a pas prévu de correctif car cela reviendrait à modifier le programme d'installation d'OCS 2007 R2, mais un article de la KB est en cours de rédaction, et sera probalement ensuite intégré dans la documentation.

Au lieu d'un long discours, voici un script pour le faire:

'
' $File:
' Fix-CWAUthentication.vbs
'
' $Description:
' Configures AuthMainCommandHandler.ashx on CWA Internal Web Sites to allow
' Anonymous authentication and fix CWA Authentication issues that
' may arise when deploying load-balanced CWA Web Sites.
'
' $Author:
' Benoit Boudeville
'
' $Date:
' September 3rd, 2009
'
Option Explicit
Const C_SERVER_TYPE = "Internal"

FixCWAAuthentication

Function FixCWAAuthentication
On Error Resume Next
Dim objShell, objWMIService, objItem, colItems
Dim strComputer, strSystemRoot, strCmd

FixCWAAuthentication = False
strComputer = "."

Err.Clear
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\default\rtccwa_repository")
Set colItems = objWMIService.ExecQuery("Select * from MSFT_CWASiteSetting where ServerType = '" & C_SERVER_TYPE & "'")
If Err <> 0 Then
WScript.Echo "[ERROR]: Unable to query CWA WMI Settings!"
Exit Function
End If

Set objShell = CreateObject("WScript.Shell")
strSystemRoot = objShell.ExpandEnvironmentStrings("%SystemRoot%")
For Each objItem In colItems
objShell.Run """%SystemRoot%\System32\inetsrv\appcmd.exe"" set config """ & objItem.Description & "/cwa/AuthMainCommandHandler.ashx"" -section:system.webServer/security/authentication/anonymousAuthentication /enabled:""True"" /commit:apphost", 2, True
Next
FixCWAAuthentication = True

Set objShell = Nothing
Set objItem = Nothing
Set colItems = Nothing
Set objWMIService = Nothing
End Function

mardi 25 août 2009

Exchange Server 2007 SP2

En attendant qu'Exchange Server 2010 soit RTM (une quarantaine de jours), Microsoft a enfin publié le Service Pack 2 d'Exchange Server 2007.

Page de téléchargement:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=4c4bd2a3-5e50-42b0-8bbb-2cc9afe3216a

jeudi 13 août 2009

Outils d'Administration à Distance pour Windows 7

Maintenant que Windows 7 et Windows 2008 R2 sont RTM, et que Windows Server 2008 R2 RTM sera disponible dès demain, Microsoft a dorès déjà mis à disposition les outils d'administration à distance pour Win7. Il sont disponibles ici:

http://www.microsoft.com/downloads/details.aspx?FamilyID=7d2f6ad7-656b-4313-a005-4e344e43997d&displaylang=en#filelist

Pas légers, mais tellement complets... :)