PI Services

Le blog des collaborateurs de PI Services

Erreur Scecli 1202

Il faut savoir que l’erreur Scecli 1202 est une erreur qui apparait dans le journal d’évènement au niveau des contrôleurs de domaine, plusieurs KB Microsoft donne des solutions qui ne sont pas compréhensible voir ci-dessous, il faut faire un regroupement d’informations :

# Erreur Scecli 1202: appliquer la KB Microsoft: http://support.microsoft.com/kb/324383/fr ou encore http://support.microsoft.com/kb/2000705

Tout d'abord sous cmd Taper RSOP (cela permet de voir les conflits niveau application des GPO qui apparait au niveau des contrôleur de domaine  PO)

Pour faire simple:
Erreur Scecli 1202 code erreur 0x534 se rapporte soit à un compte ajouter qui n'existe pas ou qui a été supprimer,
soit à une mauvaise traduction des SID en Nom GPO

Ensuite j'ai regardé le fichier c:\windows\security\logs\winlogon.log puis info (Error assigning SeSystemtimePrivilege)


J'ai relevé l'id 6AC1786C-016F-11D2-945F-00C04fB984F9 du fichier winlogon.log

sous powershell :

get-gpo -guid 6AC1786C-016F-11D2-945F-00C04fB984F9 (cela correspond à Default Domain Controllers Policy)

donc une erreur au niveau de la gpo qui s'applique sur les DC (donc configuration des ordinateurs)

puis regarder l'erreur niveau RSOP(lecture seule) computer configuration => windows setting => Local policies =>
user Rights assignment=> Acess this computer from network
puis clique droit =>properties et vu que le compte administrator n'existait pas, je l'ai supprimé sous GPMC

et gpupdate/force sous CMD et RSOP et l'erreur est corrigé.

powershell rapport-gpo

SCRIPT POWERSHELL RAPPORT GPO


Dans le cadre de la refonte et de l’audite des GPO chez un client, j’ai créé un script PowerShell dans le but de faire une remonter avec rapport html sur toutes les GPO’s du domaine puis envoie de celui-ci  dans le corps du mail.
Voici les caractéristiques du script :
-    Un script qui fait apparaitre toutes les GPO’s du domaine avec leur liaisons sur les Site, Domain et Ou
-    Les GPO’s modifier de moins de 7 jours doivent apparaitre en rouge
-    Rapport GPO sous forme de tableau et envoyer par mail
-    Copie du rapport GPO dans un répertoire du serveur (suppression automatique des rapports de plus de 30 jours

 


Tout d’abord il mettre un titre au script, il faut savoir que dans un script PowerShell tout ligne commençant par # veut dire que c’est un commentaire, PowerShell n’exécute pas ce qui suit mais cela est intéressant du point de vue afficher un commentaire

#/////////////////////////////////////////////////////////////////////////////
#//
#// Titre: GPO-Report.ps1
#// Auteur: OUASTI Khatir
#// Version: 1.0
#//
#/////////////////////////////////////////////////////////////////////////////


L’importation des modules suivant est important car il permet d’exécuter le script sans blocage (niveau droit d’exécuter le script) Et surtout charge les modules active directory et grouppolicy qui vont permettent l’exécution des commandes liés à l’AD ou au GPO
############import des modules AD et grouppolicy##########

Set-ExecutionPolicy -ExecutionPolicy Bypass
Import-Module activedirectory
Import-Module grouppolicy

 

 

Ci-dessous La construction du tableau HTML a été choisi du fait quel permet d’être intégré au corps du mail à savoir que certaines dates apparaissent en rouge c’est la solution la mieux adapter. (L’autre solution corps du mail avec fichier texte pas de couleur pas adapté).
#######construction du style et du tableau html##############

$style = @'
<style>
H3 {text-align: center;background-color: lightgreen;}
BODY{background-color:lightblue;}
TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}
TH{border-width: 1px;padding: 2px;border-style: solid;border-color: black;background-color:thistle}
TD{border-width: 1px;padding: 2px;border-style: solid;border-color: black}
</style>
'@


###les variables dates ci-dessous sont associés au nom du rapport #####


$datereport = (get-date).AddDays(0).ToString("dd-MM-yyyy")
$thedate = (get-date).AddDays(0).ToString('dd/MM/yyyy HH:mm:ss')
$resultdate = (get-date).AddDays(-7)


La commande ci-dessous permet d’afficher toutes les GPO du domaine, sort-Object permet de classer la colonne modification par ordre de date la plus récente, select-Object affiche les colonnes que l’on a choisi.

####Extraction de l'information concernant toutes les GPO’s #####

$GPO = Get-GPO -all | Sort-Object -descending modificationtime | Select-Object displayname, id, owner, creationtime ,modificationtime

 

La commande ci-dessous permet d’afficher les noms des SITES, DOMAINES ou Unités Organisationnelles auxquelles sont liées des GPO’s, il est clair que pour faire apparaitre les liaisons des GPO’s celle-ci n’est pas contenu dans la commande GET-GPO, il fallut extraire l’information à partir de la commande GET-GPOREPORT.


##########Extraction de l'information en fonction du nom de la GPO lié à une ou plusieurs OU######################

$GPOReport = Get-GPOReport -all -ReportType xml | % {
        ([Xml]$_).gpo | select name,@{n="SOMName";e={$_.LinksTo | % {$_.SOMName}}},@{n="SOMPath";e={$_.LinksTo | %{$_.SOMPath}}}}

 

Les variables $body nous permet la construction des colonnes du tableau HTML et aussi des titres du rapport. 

#############construction des colonnes du tableau html#############

$Body = "<h3>Rapport GPO journalier: $thedate</h3><br><table><tr><th>DISPLAYNAME</th><th>ID</th><th>OWNER</th><th>CREATIONTIME</th><th>MODIFICATIONTIME</th><th>LINK-OU-SITE-DOMAIN</th></tr>"

La construction de la boucle va permettre d’aller chercher chaque valeur date de la colonne modificationtime si la GPO a été modifié il y’a moins de 7 jours la date apparaitra en fond rouge sur écriture blanc.

###########construction de la boucle pour l'application de la couleur rouge pour la colonne modificationtime#######

Foreach($GPOALLDOMAIN in $GPO) {

$displayname = $GPOALLDOMAIN.displayname
$ID = $GPOALLDOMAIN.id
$owner = $GPOALLDOMAIN.owner
$creationtime = $GPOALLDOMAIN.creationtime
$modificationtime = $GPOALLDOMAIN.modificationtime


        $Body +=  "<tr><td>$displayname</td><td>$ID</td><td>$owner</td><td>$creationtime</td>"

######Application changement de couleur Rouge sur chaque cellule de la colonne modificationtime si une valeur date est supérieure à $resultdate################

    If ($GPOALLDOMAIN.modificationtime -gt $resultdate) {

        $Body += "<td bgcolor=`"`#FF0000`"><font color=`"`#FFFFFF`">$modificationtime</font></td>"

La partie du script ci-dessous permet de joindre au tableau HTML, les valeurs obtenu par les commandes GET-GPOReport et GET-GPO.

##Application d'aucune changement sur la colonne modificationtime #####

      } else {

        $Body += "<td>$modificationtime</td>"
      
     
    }


    $Result = $GPOReport | Where-Object {$_.name -eq $displayname}
    $ResultString = $Result.SOMPath -join ";"

#######comparaison entre le nom de la gpo de la commande get-gpo et get-GPOreport et ajoute le résultat $resultstring à la colonne "link" ##########

    if ($ResultString -eq "") {$Body += "<td align=center bgcolor=`"`#CCFF00`">NO-LINK</td>"}
    $Body += "<td>$ResultString</td>"
    $Body +=  "</tr>"
}
#############fin de la boucle du tableau html################

$Body += "</table>"

##############Conversion du tableau en html###################

ConvertTo-HTML -head $style -body $Body | set-content "D:\Scripts\GPO-RAPPORT\LOGS\ReportGPO-$datereport.htm"

 

Bien évidemment, il faut penser à effectuer un nettoyage automatique des rapports qui ont plus d’un mois.

##########suppressions des fichiers de plus de 30 jours #############


dir \\serveur1\d$\Scripts\GPO-RAPPORT\LOGS -recurse | where { ((get-date)-$_.lastwritetime).days -gt 30 } | Remove-Item –Force

 

 


L’envoie du rapport dans le corps du message, je l’ai effectué en version 1.0 pour plus de clarté.

###########information d'identification pour l'envoie du message et Rapport HTML intégrer au corps du message adapter pour PowerShell v1.0########

$fromaddress = "email de l'expéditeur"
$toaddress = "email du 1er destinataire"
$bccaddress = "email du 2 eme destinataire"
$CCaddress = "email du 3 eme destinataire"
$Subject = "Envoie Rapport GPO journalier (Copie dans \\serveur1\Scripts\GPO-RAPPORT\LOGS)"
$body = get-content "D:\Scripts\GPO-RAPPORT\LOGS\ReportGPO-$datereport.htm"
#$Attachment = "D:\Scripts\GPO-RAPPORT\test.txt" (non utilisé pour mon script mais pourrais servir pour joindre un fichier au mail)
$smtpserver = "smtp.domaine.com"


##########information d'authentification pour l'envoie du message##########################

$message = new-object System.Net.Mail.MailMessage
$message.From = $fromaddress
$message.To.Add($toaddress)
$message.CC.Add($CCaddress)
$message.Bcc.Add($bccaddress)
$message.IsBodyHtml = $True
$message.Subject = $Subject

# création du nouvel objet Net.Mail.Attachment($attachment) permettant #d'attacher le fichier en question.
#$attach = new-object Net.Mail.Attachment($attachment)
#$message.Attachments.Add($attach)

$message.body = $body
$CredUser = "user1"
$CredPassword = "Password"
$smtp = new-object Net.Mail.SmtpClient($smtpserver, 25)
$SMTP.EnableSsl = $true
$SMTP.Credentials = New-Object System.Net.NetworkCredential($CredUser, $CredPassword);
$smtp.Send($message)

#######################################################
 
 
SCRIPT COMPLET


#/////////////////////////////////////////////////////////////////////////////
#//
#// Titre: GPO-Report.ps1
#// Auteur: OUASTI Khatir
#// Version: 1.0
#//
#/////////////////////////////////////////////////////////////////////////////

 

#####import des modules AD et grouppolicy########################
Set-ExecutionPolicy -ExecutionPolicy Bypass
Import-Module activedirectory
Import-Module grouppolicy
###############construction du style et du tableau html##############

$style = @'
<style>
H3 {text-align: center;background-color: lightgreen;}
BODY{background-color:lightblue;}
TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}
TH{border-width: 1px;padding: 2px;border-style: solid;border-color: black;background-color:thistle}
TD{border-width: 1px;padding: 2px;border-style: solid;border-color: black}
</style>
'@
$datereport = (get-date).AddDays(0).ToString("dd-MM-yyyy")
$thedate = (get-date).AddDays(0).ToString('dd/MM/yyyy HH:mm:ss')
$resultdate = (get-date).AddDays(-7)


###Extraction de l'information concernant tout les GPO du domaine ####

 

$GPO = Get-GPO -all | Sort-Object -descending modificationtime | Select-Object displayname, id, owner, creationtime ,modificationtime

###Extraction de l'information en fonction du nom de la GPO lié à une ou plusieurs OU #####################

$GPOReport = Get-GPOReport -all -ReportType xml | % {
        ([xml]$_).gpo | select name,@{n="SOMName";e={$_.LinksTo | % {$_.SOMName}}},@{n="SOMPath";e={$_.LinksTo | %{$_.SOMPath}}}}

#######construction du style et du tableau html################

$Body = "<h3>Rapport GPO journalier: $thedate</h3><br><table><tr><th>DISPLAYNAME</th><th>ID</th><th>OWNER</th><th>CREATIONTIME</th><th>MODIFICATIONTIME</th><th>LINK-OU-SITE-DOMAIN</th></tr>"

########construction de la boucle pour l'application de la couleur rouge pour la colonne modificationtime##############################
Foreach($GPOALLDOMAIN in $GPO) {

$displayname = $GPOALLDOMAIN.displayname
$ID = $GPOALLDOMAIN.id
$owner = $GPOALLDOMAIN.owner
$creationtime = $GPOALLDOMAIN.creationtime
$modificationtime = $GPOALLDOMAIN.modificationtime


        $Body +=  "<tr><td>$displayname</td><td>$ID</td><td>$owner</td><td>$creationtime</td>"

##########Application changement de couleur Rouge sur chaque cellule de la colonne modificationtime si une valeur date est supérieure à $resultdate################

    if ($GPOALLDOMAIN.modificationtime -gt $resultdate) {

        $Body += "<td bgcolor=`"`#FF0000`"><font color=`"`#FFFFFF`">$modificationtime</font></td>"


##########Application d'aucune changement sur la colonne modificationtime #########################################

      }else {

        $Body += "<td>$modificationtime</td>"
      
     
    }

    $Result = $GPOReport | Where-Object {$_.name -eq $displayname}
    $ResultString = $Result.SOMPath -join ";"

##########comparaison entre le nom de la gpo de la commande get-gpo et get-GPOreport et ajoute le résultat $resultstring à la colonne "link" ################
    if ($ResultString -eq "") {$Body += "<td align=center bgcolor=`"`#CCFF00`">NO-LINK</td>"}
    $Body += "<td>$ResultString</td>"
    $Body +=  "</tr>"
}
########fin de la boucle du tableau html##################

$Body += "</table>"

#########Conversion du tableau en html#####################

ConvertTo-HTML -head $style -body $Body | set-content "D:\Scripts\GPO-RAPPORT\LOGS\ReportGPO-$datereport.htm"

##########suppressions des fichiers de plus de 30 jours #############


dir \\serveur1\d$\Scripts\GPO-RAPPORT\LOGS -recurse | where { ((get-date)-$_.lastwritetime).days -gt 30 } | Remove-Item -Force

###########information d'identification pour l'envoie du message et Rapport HTML intégrer au corps des messages adapter pour powershell v1.0########

$fromaddress = "email de l'expéditeur"
$toaddress = "email du 1er destinataire"
$bccaddress = "email du 2 eme destinataire"
$CCaddress = "email du 3 eme destinataire"
$Subject = "Envoie Rapport GPO journalier (Copie dans \\serveur1\Scripts\GPO-RAPPORT\LOGS)"
$body = get-content "D:\Scripts\GPO-RAPPORT\LOGS\ReportGPO-$datereport.htm"
#$Attachment = "D:\Scripts\GPO-RAPPORT\test.txt" (non utilisé pour mon script mais pourrais servir pour joindre un fichier au mail)
$smtpserver = "smtp.domaine.com"


##information d'authentification pour l'envoie du message########

$message = new-object System.Net.Mail.MailMessage
$message.From = $fromaddress
$message.To.Add($toaddress)
$message.CC.Add($CCaddress)
$message.Bcc.Add($bccaddress)
$message.IsBodyHtml = $True
$message.Subject = $Subject

# création du nouvel objet Net.Mail.Attachment($attachment) permettant d'attacher le fichier en question.
#$attach = new-object Net.Mail.Attachment($attachment)
#$message.Attachments.Add($attach)

$message.body = $body
$CredUser = "user1"
$CredPassword = "Password"
$smtp = new-object Net.Mail.SmtpClient($smtpserver, 25)
$SMTP.EnableSsl = $true
$SMTP.Credentials = New-Object System.Net.NetworkCredential($CredUser, $CredPassword);
$smtp.Send($message)

#################################################################################

Exchange : Découverte de l'agent de scripting

Introduction

Depuis Exchange 2010, il existe les agents d'extension des Cmdlets. C'est une fonctionalité méconnue (car peu documentée) et pourtant très utile dans beaucoup d'entreprise.

Ces agents permettent d'étendre les fonctionnalités de base d'Exchange. Par exemple lors de la création d'une boîte aux lettres, si une base de données n'est pas renseignée alors un agent se charge d'en choisir une automatiquement. Quelque soit le mode d'administration (Powershell ou via la console graphique EMC), l'agent se lancera. Cela vient entre autre du fait que la console Exchange ne fait qu'exécuter du Powershell en tâche de fond. Il est possible d'obtenir la liste de ces agents en exécutant la Cmdlet suivante dans une session Powershell Exchange :

Voici le résultat obtenu sur une infrastructure sans paramétrage particulier de ces agents :

Exchange Extension Agent Listing

Il existe de nombreux agents ; notamment pour la gestion de l'OAB ou des boîtes aux lettres. Dans le résultat obtenu, 2 attributs vont nous intéresser : l'activation et la priorité. Le premier permet simplement de savoir si l'agent est actuellement utilisé ou non. Le second concerne l'ordre d'application. En effet, plusieurs agents peuvent agir sur la même chose (par exemple : le choix de la base de données pour une boîte aux lettres). La priorité permet de définir l'agent qui sera utilisé (celui qui a la priorité la plus basse, les autres ne seront pas utilisés). Pour changer la priorité d'un agent, il suffit d'utiliser la commande suivante :

L'agent qui nous intéresse dans cet article est le "Scripting Agent". Nous allons voir comment l'utiliser ainsi que quels exemples d'utilisation.

L'agent de script

A contrario des autres agents, l'agent de scripting est entièrement customisable par les administrateurs Exchange. Typiquement, il va nous permettre par exemple, de réaliser certaines actions au moment de la création d'une boîte aux lettres et donc de l'exécution de la commande New-Mailbox ou Enable-Mailbox (activer/désactiver POP3/Single item recovery etc, création d'une boîte d'archive, envoi d'un mail automatique à l'utilisateur). On peux aussi imaginer un export automatique de la boîte aux lettres au format PST lorsque la commande remove-mailbox sera lancée. D'autres types d'actions sont réalisables. Elles seront détaillées plus loin dans cet article. Tout type de script Powershell peux être intégré.

Par défaut l'agent de scripting n'est pas activé. C'est pourquoi, on utilise la commande :

Cette commande active l'agent de scripting sur tous les serveurs Exchange de l'organisation.

Attention : Le fichier de configuration doit être présent sur tous vos serveurs Exchange. En effet, si l'agent de scripting est activé et que l'un des serveurs ne possède pas le fichier alors des erreurs peuvent survenir lorsque l'on appelle une commande Powershell ou lorsqu’on lance la console Exchange (impossibilité de se connecter au serveur ne possédant pas le fichier de configuration).

L'agent de scripting ne possède aucune configuration par défaut. Il convient aux administrateurs Exchange de la créer. Celle-ci se fait au travers du fichier ScriptingAgentConfig.xml qui doit être positionné dans le dossier C:\Program Files\Microsoft\Exchange Server\V14\Bin\CmdletExtensionAgents (à moduler suivant le répertoire d'installation d'Exchange). Un exemple existe dans ce même répertoire nommé ScriptingAgentConfig.xml.sample).

Ce fichier contiendra tous nos scripts d'automatisation. Regardons maintenant la hiérarchie de ce fichier XML :

La balise Configuration contient l'ensemble des scripts qui seront utilisés par l'agent de scripting. C'est la balise racine.

Les balises Feature contiennent chaque fonctionnalité que l'on souhaite ajouter. Il peut y en envoir plusieurs au sein d'une balise Configuration. Elle possède chacune 2 attributs :

  • Name : pour le nom que l'on souhaite donner à notre fonctionnalité)
  • Cmdlets : permet de spécifier les Cmdlets Powershell Exchange qui vont déclencher la fonctionnalité. S'il y en a plusieurs, elles doivent être séparées par des virgules (Exemple : "New-Mailbox,Enable-Mailbox").

La balise API Call précice à quel moment la fonctionnalité se déclenche. Elle contient aussi le script qui sera lancé au déclenchement. Il peux y en envoir plusieurs au sein d'une balise Feature. Elle possède un attribut Name qui peut avoir 4 valeurs possibles :

  • OnComplete : Le script fourni sera exécuté lorsque la commande appelé aura déjà été exécuté. Exemple : Après la création d'une boîte aux lettres, on souhaite envoyer un mail de bienvenu à l'utilisateur et activer le Single Item Recovery.
  • Validate : Utile lorsque l'on souhaite valider des attributs. Le script se déclenchera avant l'exécution de la commande. Exemple : On souhaite être sur que les attributs Location et Phone ont été renseignés ou qu'ils respectent une certaine nomenclature pendant la création d'une boîte aux lettres. Ainsi l'administrateur recevra une erreur lors de l'exécution de la commande comme si ces attributs étaient obligatoire. Lorsque le retour est $null alors l'étape de validation est un succès.
  • ProvisionDefaultProperties : Cela permet de définir des valeurs par défaut pour les propriétés d'un objet. Exemple : Lorsque l'on crée une boîte aux lettres Exchange, on peux imaginer une règle qui choisit automatiquement la base de données en fonction de la première lettre du nom de la personne. Attention, dans cet exemple, il est nécessaire de désactiver l'agent Mailbox Resources Management ou de baisser sa priorité en dessous de celle de l'agent de scripting. En effet, l'agent Mailbox Resources Management est en charge de l'attribution automatique d'une base de données si aucune n'est renseignée.
  • UpdateAffectedIConfigurable : Cette API offre la possibilité de définir des propriétés juste avant l'opération de validation.

L'ordre d'exécution des différentes API lorsque l'on exécute une commande Exchange est le suivant  :

ProvisionDefaultProperties - UpdateAffectedIConfigurable - Validate – OnComplete

L'exécution de la commande Powershell Exchange a lieu entre les étapes Validate et OnComplete.

Enfin la balise Common permet de définir des fonctions Powershell pouvant être utilisées dans les scripts des balises ApiCall (A utiliser comme une librairie). On peut aussi charger ses propres scripts Powershell.

La mise en forme du fichier ScriptingAgentConfig.xml est importante. En effet, il apparait que lorsque des espaces inutiles sont présents, Exchange génère une erreur similaire à celle ci-dessous :

ScriptingAgent Error

De plus, un événement est généré :

ScriptingAgent Error Event 

Pour ma part, afin d'éviter tout problème, je me suis rendu compte qu’il ne fallait mieux pas commenter les scripts présents dans le fichier xml.

NB : Une fois l'agent de scripting activé, les modifications du fichier ScriptingAgentConfig.xml sont prises en compte automatiquement.

Exemple d'utilisation avec l'événement OnComplete :

Lorsqu'on utilise l'API OnComplete, la variable $succeeded existe si la commande a réussi. Cela permet de gérer les cas d'échecs (il serait impossible d'effectuer un traitement sur une boîte aux lettres qui n'existerait pas).

L’exemple ci-dessous est un fichier ScriptingAgentConfig.xml permettant d’activer la boîte d’archive et le single item recovery lorsqu’une nouvelle boîte aux lettres Exchange est créée (Commande New-Mailbox et Enable-Mailbox). On remarque que l’on accède aux paramètres définis par l’utilisateur via la variable $provisioningHandler qui contient un hastable nommé UserSpecifiedParameters.

Exemple d'utilisation avec l'événement Validate : 

Ce nouvel exemple montre cette fois-ci l'usage de l'API Validate. Ici, lorsqu'une boîte aux lettres de salle est créée, on vérifie que son nom est bien du type : Salle, XX où XX est un nombre. Si le test échoue alors une erreur est retourné avec un message qui sera affiché pour l’administrateur (que l’action soit réalisée via EMS ou l’EMC).

SCOM - The RPC server is unavailable.(0x800706BA)

Le fonctionnement normal du Health Service SCOM (qu’il se trouve sur un Management server ou un agent supervisé) implique qu’il essaye régulièrement de vérifier la validité des RunAs Accounts (à chaque démarrage du service, à chaque changement de configuration, à réception d’un nouveau Management Pack etc).

Il peut arriver que cette vérification échoue, provocant alors une alerte de type The Health Service cannot verify the future validity of the RunAs account. (évènement 7016 dans le journal Operations Manager)

Cette alerte peut avoir de nombreuses origines, et le message qui l’accompagne peut normalement aider à identifier la cause.

Intéressons-nous ici plus spécifiquement à l’évènement “The RPC server is unavailable.(0x800706BA)”, observé chez un client qui dispose d’une forêt multi-domaines. Certains serveurs supervisés se trouvent dans un domaine différent de celui où se trouve le compte SCOM Action.

Ce message laisse supposer des difficultés pour joindre un contrôleur de domaine capable d’authentifier le compte.

Commençons donc par identifier quel est le DC qui est contacté, en exécutant la commande nltest /dsgetdc:corp.domaine.lan sur le serveur d’où l’erreur provient (et où corp.domaine.lan correspond au domaine qui héberge le RunAs account problématique) :

image

Le champ DC indique quel est ce contrôleur de domaine.

Il faut s’assurer qu’il est joignable sur les ports 88 (kerberos) et 389 (LDAP), et ce à la fois en passant par son FQDN et par son nom court

C’était ici la cause de notre problème : la résolution DNS ne permettait pas d’interroger ce DC via son nom court. Un simple ajout de suffixes DNS dans la configuration de la carte réseau a donc permis de corriger l’erreur.

Astuce supplémentaire : afin de forcer une revérification des credentials par le Health Service, il suffit de redémarrer ce dernier.

Desired State Configuration (Partie 5) : Création d’une ressource personnalisée

Introduction

Cet article fait partie d’une série de 5 billets sur Desired State Configuration :

Desired State Configuration est disponible comme Powershell 4.0 sur Windows 2012 R2/8.1, Windows 2012/8 et Windows 2008 R2/7.

Lors du précédent article nous avons vu l'implémentation du mode Pull via un web service.

Desired State Configuration est fourni avec un certain nombre de ressources. Malgré qu'il y en ai peu, et comme évoqué dans le précédent article, Microsoft et la communauté se sont employés à créer des nouvelles ressources. Dans cette cinquième et dernière partie, nous évoquerons la création d’une ressource personnalisée. Cette dernière permettra de prendre en charge un scénario non présent dans les ressources existantes : la présence d'un partage NFS.

Fonctionnement

Une ressource est constituée de plusieurs fichiers :

  • Un fichier .SCHEMA.MOF contenant sa définition et plus particulièrement toutes les propriétés que l'on pourra renseigner.
  • Un module Powershell contenant quelques fonctions obligatoires (.PSM1)
  • Un fichier .PSD1 représentant le manifest du module Powershell. Ce dernier contiendra les fonctions a exporter de notre module. Ce dernier est principalement utilisé pour versionner le module et avoir quelques informations dessus.

Le module Powershell doit obligatoirement comporter trois fonctions. Elles seront appelées lorsqu'un fichier de configuration contiendra une ressource du type que l'on aura créé. “Get-TargetResource” permet de récupérer la configuration telle qu'elle a été définie. “Set-TargetResource” applique une configuration (création, modification et suppression) et “Test-TargetResource” effectue le test de validité (elle retourne un booléen).

Il convient à la personne créant le module de développer le corps de ces fonctions (le squelette étant toujours identique), c'est à dire les paramètres et les process effectués.

Pré-requis

Au lancement de Powershell 4.0, il pouvait être fastidieux de développer ses propres ressources car il fallait respecter une certaine syntaxe. Cependant, Microsoft a développé un module permettant de faciliter la création de ressource à destination de DSC : xDscResourceDesigner. Ce dernier va nous permettre de générer nos fichiers automatiquement. Il est disponible en suivant le lien ci-dessous : http://gallery.technet.microsoft.com/scriptcenter/xDscResourceDesigne-Module-22eddb29

Il suffit ensuite de placer ce module dans le dossier :
C:\Program Files\WindowsPowerShell\Modules”.

DSC xDscResourceDesigner

Création de la ressource

Pour créer la ressource, on commence par définir ses propriétés avec la cmdlet “New-xDscResourceProperty”. Celles-ci possèdent à minima un nom, un type et des attributs. Ces derniers permettent de définir l'accessibilité (lecture, écriture,...). Lorsque l'on définit une nouvelle ressource, au moins une de ses propriétés devra posséder l'attribut “Key” et ne pourra être un tableau. Cet attribut permet d'indiquer la propriété utilisée lors de la recherche d'une ressource.

Dans l'exemple ci-dessous, on définit 3 propriétés :

  • le nom du partage
  • le chemin vers lequel le partage pointe
  • la présence ou l'abscence du partage
Ensuite, il est nécessaire de créer la ressource via la cmdlet “New-xDscResource”. Il faut spécifier toutes les propriétés utilisées dans cette ressource, le nom de la ressource et éventuellement le chemin où l'on va la stocker (sinon il sera placé dans un répertoire “DSCResources” à l’intérieur du répertoire dans lequel on se trouve).
Nous nous retrouvons avec le fichier .MOF ci-dessous :

Un module Powershell qui ne comprend pour l'instant que le fichier .PSM1 a aussi été généré. Il faut maintenant définir la logique de nos 3 fonctions à l'intérieur de ce module.

Get-TargetResource

Le code intégré à la fonction “Get-TargetResource” récupère le partage NFS s'il existe et retourne le chemin vers lequel il pointe. S'il n'y a pas de partage NFS avec ce nom, alors un message est écrit dans l'invite de commande Powershell.

Set-TargetRessource

Dans le code ci-dessous, on récupère un éventuel partage avec le nom défini en paramètre. Si ce dernier existe, alors on le met à jour avec le bon chemin (obligation de supprimer puis de recréer le partage NFS) sinon le partage NFS est créé. Si le partage est présent alors que la propriété “Ensure” a pour valeur “Absent” alors le partage NFS est supprimé. Il est à noter que cette fonction n'est appelée que lors de la modification d'un fichier de configuration d'un serveur ou lorsqu’une configuration est incorrecte.

NB : Lors de la génération du template de module à remplir, il est indiqué dans le corps de la fonction qu'il faut positionné la variable globale “$global:DSCMachineStatus” avec la valeur 1 si une configuration nécessite un reboot après son application.

Test-TargetResource

Cette dernière fonction valide qu'une configuration est bien appliquée. Elle vérifie l'existence du partage ainsi que le chemin vers lequel il pointe si le paramètre “Ensure” a pour valeur “Present”. Si “Ensure” vaut “Absent” alors il est vérifié que le partage NFS n'existe pas. Les différents tests retournent la valeur “$true” si la configuration est bonne et “$false” dans le cas contraire. 

A noter, qu'à la fin de notre module, la cmdlet “Export-ModuleMember” est présente et obligatoire afin que Powershell découvre correctement les méthodes de la ressource.

Génération du manifest

Enfin, il faut générer le fichier de manifest du module. Afin de réaliser cette opération, il faut utiliser la commance New-ModuleManifest en spécifiant les paramètres “FunctionsToExport”, “RequiredModules” et “Path”. Attention, le chemin indiqué doit être la racine de la ressource créée (Au même niveau que le dossier DSCResources), sinon il vous sera impossible d'importer la ressource. De même, le nom du manifest doit être le même que le nom du module.

Les autres champs du fichier .PSD1 généré peuvent aussi être spécifiés via la cmdlet précédente ou en remplissant manuellement le fichier (via un éditeur de texte). Certaines propriétés seront même automatiquement remplies (exemple : auteur avec le samaccountname de l'utilisateur ayant lancé la commande).

Voici un lien menant vers le manifest généré pour cette ressource : Manifest

Import de la ressource et utilisation

Il suffit de placer notre ressource (Répertoire C:\NFSShare dans notre exemple) dans “C:\Program Files\WindowsPowerShell\Modules\

En utilisant la commande “Get-DSCResource”, on remarque que notre ressource NFSShare est disponible. On s'aperçoit aussi que la propriété DependsOn est automatiquement rajouté sur cette ressource. Il s'agit d'une propriété par défaut disponible sur toutes les ressources DSC. Pour rappel elle permet de lier des configurations entre elles en spécifiant qu’une configuration dépend de la réussite d’une autre.
 DSC List Resources
Il est ensuite possible de générer un fichier de configuration pour un serveur. Il est nécessaire d'ajouter la commande “Import-DscResource” en renseignant le paramètre “ModuleName” dans le bloc de configuration lorsque l'on utilise des ressources personnalisées.
Enfin, on applique la configuration via la ligne de commande ci-dessous et on obtient bien la création du partage NFS :

DSC Result

Conclusion

Lors de cet article, nous avons vu la création d'une ressource permettant de gérer des partages NFS. Il est possible de l'améliorer en gérant d'autres propriétés de ce type de partage comme les permissions. 

Customiser ses pages ADFS / Ajout du suffixe UPN automatique dans l'identifiant

Préambule

L'ensemble des manipulations ont été réalisées sur une infrastructure Windows 2012 R2 / ADFS 3.0.

Problématique

Avec quelques connaissances en développement web (CSS et Javascript), il est possible de customiser les pages de logon ADFS. On peut positionner un logo qui remplacera le nom de la federation ou encore changer l'illustration par défaut. De plus, Microsoft offre aussi la possibilité de changer une partie du code Javascript et CSS. Nous verrons donc comment gérer ses templates ADFS puis je détaillerai un script Javascript permettant d'ajouter automatiquement le suffixe UPN de l'utilisateur. Ainsi toute personne souhaitant se connecter n'aura qu'à entrer son samAccountName. Attention, cette méthode n'est fonctionnelle que dans le cas où tous les utilisateurs possèdent le même suffixe UPN.

Gestion des templates ADFS

Microsoft fourni quelques indications pour customiser les pages ADFS sur le lien suivant :
http://technet.microsoft.com/en-us/library/dn280950.aspx . On retrouve notamment les modifications les plus basiques comme les changements d'images ou de messages (erreur, aide,...).

Aussi, dans ADFS 3.0, il est possible de gérer plusieurs templates via les Cmdlets Powershell adéquates. Le template de base se nomme "default". On peut d'ailleurs récupérer la liste des thèmes avec la Cmdlet Get-ADFSWebTheme. On remarque qu'il s'agit bien du template de base grâce à l'attribut IsBuiltinTheme.

Les étapes de customisation d'un thème sont les suivantes :

  • création d'un nouveau thème 
  • export des fichiers du thème 
  • modification des fichiers 
  • import des fichiers modifiés dans le thème créé

Pour ajouter un nouveau thème il suffit d'utiliser la commande New-AdfsWebTheme en spécifiant le nom du thème ainsi que les sources du nouveau thème. En général, on se basera sur le thème par défaut que l'on customisera ultérieurement.

 

Il nous faut ensuite exporter les fichiers de ce thème (vers le dossier C:\ADFSTheme par exemple) :

 

Attention le dossier d'export doit exister (il ne sera pas généré automatiquement).

On remarque que l'on a accès à un certain nombre de fichiers mais pas à tous. En général, ceux que l'on voudra customiser sont le fichier onload.js et le fichier style.css.

2014-04-18 11_53_36-SRV01673 - Remote Desktop Connection Manager v2.2

Une fois modifiée, il ne reste plus qu'à importer le fichier dans le thème nommé custom. Un exemple avec le fichier onload.js :

 

Enfin pour définir le thème custom comme actif il faut utiliser la Cmdlet ci-dessous :

 

Ajout automatique du suffixe UPN

Afin de faciliter l'expérience utilisateur lors d'un usage en situation de mobilité ou via un navigateur ne supportant pas ADFS, il peut être utile d"ajouter automatiquement le suffixe UPN lorsque ce dernier a été omis dans le formulaire d'authentification. Pour les utilisateurs ne connaissant pas les notions de nom de domain Netbios ou d'UPN, cette customisation peut être interessante. Celle-ci nécessite du code Javascript.

ADFS se base sur la valeur entrée dans le champ “UserName” avec l’ID “userNameInput” du fomulaire. Il faut donc modifier cette valeur. Une autre solution (utilisée ici), consiste à changer l’ID et le nom du champ original. Puis, on ajoute un nouveau champ, invisible à l’utilisateur et contenant la bonne valeur ainsi que l’ID et le nom mentionné précédemment. Cette seconde solution est esthétiquement plus réussi (l’utilisateur ne voit pas le changement)

Ci-dessous, se trouve le script a ajouté à la fin du fichier onload.js est à intégrer dans le thème ADFS via la méthode vu précédemment :

 

Voici les opérations réalisées par le script lorsque le formulaire est valider (via la touche “Entrée” ou un clic sur le bouton de connexion) :

  • Récupération du champ contenant l’identifiant utilisateur
  • Vérification de la présence d’un suffixe UPN

Si le suffixe est manquant :

  • On renomme le champ contenant l’identifiant utilisateur (UserName) et on change son ID (userNameInput).
  • On ajoute un nouveau champ non visible portant les valeurs initiales (Id et nom). Il contiendra la valeur entrée par l’utilisateur avec le suffixe UPN. Celles-ci seront transmises à ADFS.

Une amélioration pourrait être d'ajouter une balise “select” contenant une liste de tous les suffixes UPN possibles. Cela permettrait de gérer les infrastructures utilisant de multiples suffixes UPN.

DirSync – Erreur à l’installation de DirSync sur un serveur Windows Server 2012 R2

La problématique

Lors de l’installation de Windows Azure Active Directory Synchronization (aka “DirSync”) sous Windows Server 2012 R2, l’erreur suivante peut apparaitre :

The minimum version of Windows Powershell required is 2,0.
Please install the minimum version required (or higher) and try again.

image

Cela peut sembler étrange d’autant plus que Windows Server 2012 R2 intègre nativement la version 4.0 de PowerShell.

Explication

Il semble que ce problème soit dû à la localisation du système d’exploitation. En effet sur un système d’exploitation installé en langue française, le caractère séparateur entre les entiers et les décimales est la virgule et non le point.

Or on peut remarque que le message d’erreur indique un problème pour détecter la version PowerShell 2,0 et non 2.0.

Solution

La solution consiste tout simplement à modifier les formats de date, d’heure et de nombre et à les passer sur le format anglais.

image

Il suffit ensuite de fermer, puis de relancer l’installeur de DirSync pour que la modification soit prise en compte et que PowerShell soit bien détecté.

image

N.B. : Ne pas oublier de lancer dirsync.exe avec des droits administrateur (clic droit, puis Run As Administrator), sinon une exception .net apparaît

EXCHANGE 2013 DAG

INSTALLATION DU DAG (DATA AVAIBILITY GROUP)

Tout d’abord il faut connaitre le rôle du DAG, son but est tout simplement la haute disponibilité des BASES MAIL.

petit rappel sur les bases mail, c’est une base de donnée qui contient  les boites aux lettres (BAL) des utilisateurs de messagerie exchange et dont la limite est de 2 TB.

Tout d’abord il faut renommer les bases mail pour plus de clarté prévoir une convention de nommage

1) renommer les bases de données (avec convention de nommage simple)

image

2) création d’un compte ordinateur que l’on désactive et attribue les droits

image

Full control, celui va servir pour le DAG

3) Le serveur File Server Witness (FSW01) joue le rôle de QORUM

Il doit être ajouter au groupe (Exchange Trusted Subsystem ) dans Active Directory puis le groupe Exchange Trusted Subsystem ajouter au groupe local administrator du serveur FSW01.

Le FSW doit être créé car si le cluster passe de serveur impair à pair

On n’aura toujours 1 votant supplémentaire.

Installer la fonctionnalité du serveur de fichier

image

Puis ouvrir niveau pare-feu avancé et paramétrer

image

4) créer un groupe de disponibilité,

Figure 1

image

Figure 2

image

Figure 3 : mettre une ip pour le DAG 192.168.1.10 sur le réseau MAPIDAGNetwork

image

5) parametrer le réseau dedié au DAG01, dans notre cas

Figurer 1

image

Figure 2 : décocher register this connection’s adresses in DNS.

image

Pour regarder les configuration du DAG sur EXCH01 et EXCH02 taper la commande suivante sous Exchange management shell:

image

Voici les résultats :

EXCH01

image

EXCH02

image

6) Par defaut les reseaux mapidagnetwork et ReplicationDAG Network

Se configurer en auto avec la carte reseau en prod et l’autre pour REPLICA avec aucune passerelle activé et décocher registrer this connection in DNS, il fait la différence et les bascule automatiquement.

Pour modifier manuellement les configuration du DAG sur EXCH01 et EXCH02 faire comme ci-dessous.

Figure1 : cocher configurer manuellement les réseaux.

image

Figure 2 : soit désactiver la réplication soit afficher les détail pour modifier la configuration.

image

7) Creation de la copie passive sur les 2 serveurs EXCHANGE :

- Copie des Bases mail De EXCH01 vers EXCH02 et EXCH02 vers EXCH01

image

Figure1 : voir ci-dessous

image

Figure2 : ajouter le serveur EXCH02 puis cliquer ENREGISTRER

image

Taper la commande suivante pour fixer la configuration :

Set-DatabaseAvailabilityGroup DAG01 -ManualDagNetworkConfiguration $false

Tester le réplication avec le commande let : Test-ReplicationHealth

Ou Test-ReplicationHealth | fl

Vérification de la copie de base de données avec PowerShell:

EXCH01

image

EXCH02

image

8) Test de la bascule de la base de données

Vérification de l’utilisateur créé (kouasti) sur quelle base ? :

image

Eteindre le serveur EXCH01 sur lequel la base MBX-DAG01-DB01 est actif

Cela prend quelques secondes.

9) Test de la bascule de la base de données en mode maintenance

Effectuer ses manipulations sur le serveur ou les bases sont actives

MBX-DAG01-DB01

MBX-DAG01-DB02

Aller dans C:\Program Files\Microsoft\Exchange Server\V15\Scripts puis

Taper :

[PS] C:\Program Files\Microsoft\Exchange Server\V15\Scripts>.\StartDagServerMaintenance.ps1 -servername exch02

image

 

RESULTAT

Sur Exch01 faire get-mailboxdatabasecopystatus

image

Sur Exch02 faire get-mailboxdatabasecopystatus

image

POUR REMETTRE EN PLACE il faut stopper la maintenance:

.\StopDagServerMaintenance.ps1 -servername exch02

 

J’espère que le blog vous a éclairé sur la mise en plce sdu DAG exchange 2013

Exchange 2003 – Configuration du RPC sur HTTP

Contexte

Cet article présent la configuration du RPC/HTTP dans une architecture de type mono-serveur l’unique serveur ayant les rôles suivants :

  • Contrôleur de domaine,
  • Catalogue global,
  • Serveur Exchange,
  • Proxy RPC.

RPC/HTTP permet à une entreprise de relier ses clients Outlook mobile sans mettre en danger son environnement de production par l’ouverture de plusieurs ports (qui sont susceptibles d’être bloqués en sortie dans le réseau du client mobile) les seuls ports utilisés sont les ports TCP 80 ou TCP 443 dans le cas d’une utilisation avec SSL.

Installation du proxy RPC

- Dans « Panneau de configuration » choisir « Ajouter ou supprimer des programmes »

  • Choisir « Service de mise en réseau » puis « Détails » :

clip_image002_thumb1

- Sélectionner « Proxy RPC sur HTTP » puis lancer l’installation (le CD de Windows Server 2003 ou le dossier i386 est requis) :

clip_image003_thumb1

Configuration du répertoire RPC depuis IIS

- Depuis la console IIS (Gestionnaire des Services Internet), afficher les propriétés du dossier RPC :

clip_image004_thumb

- Dans l’onglet « Sécurité du répertoire », cliquer sur le bouton Modifier de la partie « Authentification et contrôle d’accès » :

clip_image005_thumb1

- Dans les Méthodes d’Authentification, décocher la case « Activer la connexion anonyme » et cocher « Authentification de base » :

(Une fois cette modification faite, un message d’information apparait vous signalant que le mot de passe est envoyé en clair via une connexion non-cryptée et est donc visible en utilisant un outil d’analyse de trames, bien sûr, si le SSL est déjà activé sur le site, ce message ne nous concerne pas.)

clip_image006_thumb1

Activation du SSL pour le répertoire RPC

ATTENTION ! : Cette partie nécessite que la configuration d’SSL sur le Site par Défaut IIS soit fonctionnelle, avec un certificat de paramétré. Si SSL n’est pas utilisé cette étape peut être passée.

- Depuis la console IIS (Gestionnaire des Services Internet), afficher les propriétés du dossier RPC,

- Dans l’onglet « Sécurité du répertoire », cliquer sur le bouton Modifier de la partie « Communications sécurisées » :

clip_image007_thumb1

- Cocher les cases « Requérir un canal sécurisé » ainsi que « Exiger le cryptage 128 bits »:

clip_image008_thumb1

Activation du RPC-http depuis la console Exchange

- Depuis la console « Gestionnaire système Exchange » dans le dossier « Serveurs » sur le serveur RPC-http faire clique-droit puis « Propriétés » puis cocher la case « Serveur principal RPC-http :

clip_image010_thumb1

Une erreur spécifiant qu’aucun serveur frontal Exchange n’existe est susceptible d’apparaitre. Ignorer ce message.

Configuration des ports utilisé par le serveur Proxy RPC

ATTENTION ! : Cette partie touche au registre. Avant toute modification du registre, il est fortement conseillé de sauvegarder le registre

La configuration des valeurs de registre suivantes est automatiquement exécutée lors du redémarrage suivant l’installation du Proxy RPC-HTTP (pour Exchange Server 2003 SP2). Cette partie est utile, si un reboot n’est pas envisageable ou si vous souhaitez vérifier la bonne configuration de ces valeurs.

- Chercher la clé de registre « HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Rpc\RpcProxy » :

clip_image012_thumb1

- L’attribut « ValidPorts » doit être configuré comme il ceci (le texte surligné en jaune doit être modifié en fonction de vos nom de serveurs :

NomNETBIOSduServeur:6001-6002;

FQDNInterneduServeur:6001-6002;

FQDNExterneduServeur:6001-6002;

NomNETBIOSduServeur:6004;

FQDNInterneduServeur:6004;

FQDNExterneduServeur:6004

 

Par exemple :

  • Domaine : TEST.lab
  • NomNETBIOSduServeur : EXCHANGE-SRV
  • FQDNInterneduServeur : EXCHANGE-SRV.TEST.lab
  • FQDNExterneduServeur : mail.TEST.lab

Soit :

EXCHANGE-SRV:6001-6002; EXCHANGE-SRV.TEST.lab:6001-6002; mail.TEST.lab:6001-6002; EXCHANGE-SRV:6004; EXCHANGE-SRV.TEST.lab:6004; mail.TEST.lab:6004

Active Directory – Prise en charge des scénario du type “USN Rollback”

Contexte

Suite à la restauration d’un snapshot ou d’une sauvegarde d’un contrôleur de domaine virtuel, l’erreur USN Rollback peut apparaître.

L’USN (Update Sequence Number) permet un versionning des objets utilisé par l’annuaire Active Directory, chaque modification d’un objet AD depuis un contrôleur de domaine va incrémenter le numéro USN de l’objet. En comparant entre les différents DCs leur numéro d’USN il est possible de déterminer quelle base est la plus à jour.

Lors d’une restauration d’un DC virtuel, et si l’outil de sauvegarde utilisé ne supporte pas la restauration Active Directory, il est probable qu’une erreur USN soit provoquée.

Les autres contrôleurs de domaine – en comparant leur numéro USN – vont détecter le DC restauré comme n’étant pas à jour en ne répliqueront pas avec lui.

Eviter l’USN Rollback

Les solutions suivantes permettent d’éviter une situation d’USN Rollback :

  1. Utiliser une solution de sauvegarde avec prise en charge de l’AD,
  2. Ne pas restaurer des backup dont la date excède le “Tombstone lifetime” qui est de 60 jours par défaut,
  3. Utiliser un contrôleur de domaine virtuel sous Windows Server 2012 ou ultérieur. Windows Server 2012 ajoute au contrôleurs de domaine un attribut supplémentaire (qui est géré par Hyper-V 2012) et qui évite l’USN rollback lors de la restauration d’un snapshot.

 

Symptômes de l’USN Rollback

    • La commande ”repadmin /showutdvec” retourne de différents numéros d’USN,
    • Le service NETLOGON est en pause,
    • La valeur de la clé “DSA Not Writable” est à “4”,
    • Les erreurs 2095 (NTDS Replication), 2013 (NTDS General), 2103 (USN Rollback),
    • Les réplication entrantes/sortantes sont désactivées (visible à l’aide de la commande repadmin /showrepl ),

    Résolution

    Microsoft préconise (après l’apparition d’un USN Rollback) de retirer le contrôleur de domaine défaillant, après avoir transféré les éventuels rôles FSMO qu’il héberge (NTDSUtil permet de transférer les rôles ou de les saisir s’il est impossible de les transférer correctement).
    Egalement dans le cas où la de-promotion du contrôleur de domaine ne se passe pas correctement, il faudra s’aider du switch “/forceremoval” de al commande DCPromo. Il faudra aussi bien penser à nettoyer les métadonnées du contrôleur de domaine défaillant, depuis un contrôleur de domaine fonctionnel.
    L’idéal est – lorsque l’on souhaite restaurer le snapshot d’un contrôleur de domaine alors que le snapshot ne supporte pas la VM-GenerationID – de démarrer le contrôleur de domaine directement en mode DSRM. Une fois démarré en mode DSRM, mettre la valeur de registre “database restored from backup” à “1”.
    Si le contrôleur de domaine a déjà été démarré en mode “normal”, il faudra le retirer (après avoir pris soin de récupérer les rôles hébergés).
    (Source :