Le blog technique

Toutes les astuces #tech des collaborateurs de PI Services.

#openblogPI

Retrouvez les articles à la une

SCOM–Erreur MOMCertImport 0xc000007b

Lors de la mise en place d’un serveur Gateway dans une infrastructure SCOM 2012, le bug suivant m’a laissé perplexe pendant de longues heures… cet article vous permettra peut être de bénéficier de mes erreurs !

En suivant scrupuleusement la fiche technet détaillant l’installation du rôle Gateway, on constate que de nombreuses étapes préparatoires sont requises avant de procéder au déploiement du rôle à proprement parler.

L’une d’entre elle concerne plus spécifiquement le déploiement du certificat qui sera nécessaire à la bonne communication de la Gateway avec son Management Server (cf. http://technet.microsoft.com/en-us/library/hh467905.aspx )

Tout se passe bien jusqu’à la dernière étape, la validation du certificat par MOMCertImport qui fait remonter cette erreur :

clip_image002

The application was unable to start correctly (0xc000007b). Click OK to close the Application.

Un joli message d’erreur, détaillé et explicite comme on les aime.

Après avoir passé en revue les réponses classiques à ce genre de problème (UAC qui bloque ? Utilisation de la binaire x86 au lieu de la x64 ou vice-versa ? Et en runas administrator, ca passe ? En récupérant MOMCertImport sur un media d’installation différent ?), il s’avère finalement que MOMCertImport est en réalité incapable de s’exécuter sans certaines DLL… qui ne sont présentes que si SCOM est installé (et donc si le rôle Gateway est déjà présent !).

Il ne reste donc plus qu’à installer le rôle gateway, puis à finaliser l’import du certificat… et tant pis pour l’ordre préconisé par Technet.

A noter que cette problématique peut se présenter de façon parfaitement identique dans le cadre du déploiement d’un agent en DMZ, puisqu’il nécessite de la même façon la présence d’un certificat validé par MOMCertImport.

Windows Server 2012–Evaluer l’impact de la déduplication

Windows Server 2012 intègre la notion de déduplication des données. Cette nouvelle fonctionnalitée permettrait d’economiser de l’espace disque, mais combien?

Pour cela Microsoft a intégrer un outil d’analyse permettant de prendre une décision sur l’activation ou non de la déduplication sur certains volume. Cet outils se nomme ddpeval.exe.

L’outil est automatiquement installer lors de l’ajout de la fonction déduplication.:

image

Une fois l’outil installer, il se trouve dans le répertoire c:\Windows\system32

L’outils peut etre copier sur d’autre serveur afin de réaliser les test.

L’outils peut etre copier sur d’autre serveur afin de réaliser les test.

Lancer une invite de commande puis lancer l’outils suivi du chemin a analyser:

Attention ddpeval.exe ne peut pas etre éxécuté sur un disque system, de démarrage ou encore un volume surlequel la déduplication est deja activée. L’analyse peux prendre plusieurs heures en fonction de la volumétrie:

image

Une fois l’analyse finie un compte rendu est affiché. Dans cet exemple 25% de l’espace peut etre economisé si la compression est activée.

Pour plus de détail sur la déduplication:

http://technet.microsoft.com/fr-fr/library/hh831700.aspx

Powershell : Modifier l’affichage d’un compte sous Outlook 2010

Introduction

Dans le cadre d’une migration inter-organization Exchange 2003 vers Exchange 2010, il fallait reconfigurer le profil pour que le nom de compte dans Outlook 2010 soit mis à jour avec la nouvelle adresse email (ainsi que le nom des arborescences des emails et de dossiers publics associées).

Blog1blog2

Afin de répondre à cette problématique en impactant le moins d’utilisateurs possibles, la solution proposée réalisait des modifications via un script déployer en GPO (logon script).
Ci-dessous vous trouverez les informations nécessaires à ce paramétrage via Powershell.

Récupération des informations de comptes

Afin d’effectuer ces modifications il faut aller les chercher dans le registre.
Ainsi, la ruche "HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\" liste tout les profiles Outlook enregistré (par défaut le premier profil est appelé Outlook) pour l’utilisateur connecté.
Dans les ruches enfantes, si la clé de registre 001f6620 est présente c’est qu’il s’agit d’un compte Outlook. Cette dernière définit le nom du compte.

De plus, toujours dans les ruches sous-jacentes au nom d’un profile, si la clé 0003660a est positionné alors il s’agit d’une arborescence de emails ou de dossiers publics (ce sont celles qui nous intéressent dans le cas d’un changement de nom).
Si elle a la valeur "0x03,0x00,0x00,0x00" c’est qu’elle représente une arborescence de dossiers publics tandis que "0x01,0x00,0x00,0x00" représente la même chose pour des emails.
Le nom de l’arborescence est contenu dans la clé 001f3001.

Avec ces informations nous pouvons donc facilement retrouver le nom d’un compte et le profile associé pour le modifier. Pour modifier les noms des arborescences, nous avons les clés de registres à changer.

Modification du nom de compte

Pour modifier le nom du compte il n’existe actuellement qu’une seule méthode puisque la propriété du accessible via la librairie Interop (permettant d’interagir avec Outlook) n’est accessible qu’en lecture seule. Un module Powershell a été développé pour gérer les comptes Outlook : Outlook Account Manager. Il est disponible à cette adresse : http://psoutlookmanager.codeplex.com/

Il propose un jeu de commandes permettant de récupérer les profiles (Get-Profile), les comptes (Get-MAPIAccount) et de modifier ces derniers (Set-MAPIAccount).

Voici un exemple permettant le modification du nom d’un compte :

On récupère le compte Outlook que l’on souhaite renommer (Il faut spécifier le profil)
$Account = Get-MAPIAccount -ProfileName "Nom du profil" | Where-Object `   {$_.AccountName -eq "Mon compte à modifier"}
On change l’attribut AccountName avec le nouveau nom que l’on souhaite obtenir.
$Account.AccountName = "Nouveau nom"
On enregistre les changements sur le compte que l’on a mis à jour.
Set-MAPIAccount $Account

Il est à noter que le module Outlook Account Manager ne s’exécute qu’avec Powershell 32 bits. On peut donc lancer le script via la commande ci-dessous :
&"$env:windir\syswow64\windowspowershell\v1.0\powershell.exe" $Path
$Path représente ici le chemin du script.

Cette méthode peut être exécuter pendant qu’Outlook est lancé. Le résultat sera visible dès l’exécution du script (sans avoir à redémarrer Outlook).

Modification du nom d’affichage

Pour mettre à jour le nom d’affichage dans l’arborescence Outlook, il existe plusieurs méthodes.

La première, consiste à utiliser les classes Interop Outlook. Cela va lancer un processus Outlook en tâche de fond.
Tout d’abord on invoque une instance d’Outlook
$Outlook = New-Object -comObject Outlook.Application
$Namespace = $Outlook.GetNamespace("MAPI")

Permet d’obtenir tous les comptes.
$Accounts = $Namespace.Accounts

Cette méthode présente l’avantage d’obtenir un résultat visible même si Outlook est lancé (sans avoir à le redémarrer). Cependant, l’utilisateur sera prompté pour lui dire qu’un autre processus souhaite accéder à Outlook, et cela nécessitera donc une intervention manuelle. Il peut aussi être concevable de fermer toutes les instances d’Outlook avant d’exécuter ce script, ce qui peut être déroutant pour l’utilisateur.

Voici un exemple de code permettant la dernière proposition :
$OutlookProcesses = Get-Process | Where-Object {$_.Name -like "Outlook"}
ForEach($Outlook in $OutlookProcesses){
    Stop-Process $Outlook.Id
}

A la fin du script on n’oublie pas de fermer le processus ouvert par la création de l’objet COM :
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Outlook)

La seconde méthode consiste à modifier directement la clé de registre. Pour mettre en œuvre cette opération il faut changer la valeur de la clé "001f3001" que l’on a identifier au préalable. Attention, le type de cette clé est un tableau de bytes. Bien qu’il soit possible de donner une chaine de caractère classique (String), tout en impactant pas le fonctionnement d’Outlook, cela va modifier le type. Voici donc un exemple pour créer un tableau de bytes à partir d’une chaine de caractère :

Exemple de résultat à obtenir :
blog4

On encode une String  en tableau de bytes
$enc = [system.Text.Encoding]::UTF8
$mystring = "This is a string"
$data = $enc.GetBytes($mystring)

Chaque caractère est séparé par une valeur en byte équivalente à un zéro. Pour que notre tableau soit correct il faut ajouter ce zéro après chaque caractère.
On crée un tableau modifiable (ArrayList)
$ArrayBytes = New-Object System.Collections.ArrayList
Entre chaque byte on ajoute un zéro.
foreach($d in $data){
    $ArrayBytes.Add($d)
    $ArrayBytes.Add(0)
}

Enfin on peut modifier la valeur de la clé de registre :

Set-ItemProperty "$RegistryPath" -Name 001f3001 -Value $ArrayBytes
$RegistryPath représente le chemin vers la clé de registre.

L’avantage de cette méthode est de n’avoir pas à exécuter de processus Outlook et l’utilisateur ne se rend pas compte du changement (pas de prompt ni de fermetures intempestives d’Outlook). Cependant si Outlook est lancé, le résultat ne sera visible qu’au prochain démarrage de celui-ci.