PI Services

Le blog des collaborateurs de PI Services

MDT 2013 – Déployer Microsoft Office 2013

Part 2 – Paramétrage Office 2013

Cet article traite l’intégration de la suite Microsoft Office 2013 dans l’outil Microsoft Deployment Toolkit 2013.

Paramétrage et automatisation Office 2013

Ce chapitre nécessite que vous disposiez d’une version Office 2013 en version Volume License.

Pourquoi utiliser Office Customization Tool ?

Dès maintenant, l'application Office 2013 est prête à être déployée. Cependant, il n’y a aucun mécanisme d’automatisation adapté à un déploiement via MDT. L’installation du produit sera similaire à une installation classique par un DVD (ou tout autre support) avec l’assistant d’installation. L’intérêt de cette option n’est pas adapté à un mode de déploiement de postes de travail industrialisé.

Pour automatiser l’installation de la suite Office, il est nécessaire de générer un fichier de configuration depuis l'outil Office Customization Tool.

Premier paramétrage

Pour commencer, sélectionner dans le Deployment Workbench l'application puis un clic droit. Sélectionner ensuite Properties

1

Dans la nouvelle fenêtre, vous constaterez qu’il y a quatre Onglets :

          o General

          o Details

          o Dependencies

          o Office Products

3

Onglet général (commun pour toutes les applications):

Cet onglet permet de définir les informations suivantes :

· Nom, Commentaire, Version, Langage, Répertoire source, le GUID de l’application.

Sur la partie inférieure de la fenêtre, nous trouvons deux options:

· Masquer l’application

· L’application ne sera pas visible sur la partie Applications lors d’un déploiement Lite Touch

· Activer l’application

          o Décocher cette option rend l’application indisponible pour les déploiements

Onglet Détails (commun pour toutes les applications):

5

Onglet Dependencies (commun pour toutes les applications):

7

Onglet Office Products (propre et dédié à la personnalisation des applications Office):

9

C’est dans cet onglet que l’automatisation du logiciel va prendre forme. Pour le moment, une grande partie des champs sont bloqués. Sélectionner le menu déroulant Office Product to Install et Cliquez sur ProPlus.

11

Remarque : Si vous ne voyez pas le bouton Office Customization Tooll en bas à droite de la fenêtre, c’est que vous utilisez une version Retail. Néanmoins vous pourrez tout de même configurer l’installation sans l’Office Customization Tool. (Traité dans le paragraphe ci-dessous)

Sélectionner l’élément ProPlus dans le menu déroulant. Les champs sont maintenant accessibles et paramétrables. Voici quelques une des options :

· Office language : Si votre répertoire d’installation comporte plusieurs langues, sélectionner celle que vous souhaitez installer.

· Product Key : Ajoute la licence du produit

· Display Level : Paramètre le niveau d’information durant l’installation à l’utilisateur. Trois niveaux sont disponibles :

          o None : Aucune fenêtre ne sera affichée durant l’installation

          o Basics : Le minimum d’information vous sera présenté, l’utilisateur peut suivre la progression de l’installation

          o Full : Niveau par défaut. L’intégralité de l’interface est proposée à l’utilisateur. Aucune automatisation.

· Accept EULA : accepte les termes du contrat d’utilisation

13

Le bouton Add permet d’ajouter un pack de langue ou une application

15

Il est possible d’éditer directement ce fichier en cliquant sur Edit Config.xml. La modification des paramètres met à jour le fichier Config.xml dans cette boite de dialogue

17

Le bouton Office Customization Tool permet de lancer l’assistant. Notez qu’il faut en amont appliquer les modifications avant de pouvoir lancer OCT, sinon le message suivant s’affichera

19

Je vous propose de traiter dans le troisième article les différentes options permettant de personnaliser l’installation de l’application avec Office Customization Tool.

MDT 2013 – Déployer Microsoft Office 2013

Part 3 - Office Customization Tool

Cet article traite l’intégration de la suite Microsoft Office 2013 dans l’outil Microsoft Deployment Toolkit 2013

Office Customization Tool

Vous avez maintenant accès à la console Office Customization Tool

Au lancement de l’outil, un message vous indique qu’il faudra enregistrer le fichier MSP dans le répertoire suivant : %VotreDeploymentShare%\Applications\ Microsoft Office Professional Plus 2013\Updates
Dans le cas contraire, votre configuration ne sera pas prise en compte. Cliquez sur OK

1

Une fenêtre vous propose deux options :

       o Créer un nouveau fichier de configuration d’installation

       o Ouvrir un fichier existant

Gardez la première option, puis cliquez sur OK

2

Une nouvelle fenêtre vous propose de définir le support pour l’ouverture et la fermeture des fichiers. Laissez l’option par défaut et cliquez sur OK

4 6Comme vous pouvez le constater, il y a quatre catégories dans l’outil Microsoft Office Customization Tool.

Première catégorie : Installation

Il est possible de spécifier :

       o Le chemin d’installation par défaut

       o Le nom de l’organisation

8

La page Sources réseau supplémentaires vous permet d’ajouter des partages réseau supplémentaires contenant les fichiers d’installation d’Office 2013. Ce paramétrage permet  de rendre l’installation du produit Office hautement disponible.

10

Sur la page suivante nommée Licences et interface utilisateur, nous pouvons :

       o Saisir la clé d’activation du produit

       o Accepter les termes du contrat de licence

       o Choisir le niveau d’affichage

       o Aucun

       o Simple

       o Complet – par défaut

Spécifier certaines options dans le cas d’une installation en Affichage de niveau               Complet

       o Avertissement de fin d’opération : Activer le récapitulatif post installation

       o Supprimer la boite de dialogue modale : ne pas afficher les messages d’erreur qui pourrait survenir dans le cas d’une installation en affichage Complet

       o Annulation interdite : Ne pas laisser la possibilité à l’utilisateur d’annuler l’installation

12

Vous trouverez également quatre autres pages permettant de :

       o Supprimer les anciennes installations

       o Ajouter des programmes supplémentaires en exécutant par exemple des fichiers : .exe .com .bat .src

       o Ajuster les paramètres de sécurité. Peut être utile dans le cas d’utilisation d’un outil basé sur les Macros par exemple

       o Modifier des propriétés de l’installation

Première catégorie : Fonctionnalités

Modification des paramètres utilisateurs
Il est possible de changer les paramètres de sécurité, désactiver certains éléments de l’interface utilisateur, activer/désactiver les notifications.

Mise à disposition des fonctionnalités
Cette page importante propose de gérer les produits Office qui seront: disponibles, indisponibles, imposés et aux choix de l’utilisateur. Voici l’interface permettant de choisir les fonctionnalités.

14

16

En dépliant un produit, on accède aux différents modules qui le composent.

Un clic droit sur un produit permet d’obtenir le menu suivant :

18

      

       o Tout exécuter à partir du disque dur: le produit sera installé avec les composants par défaut

       o Tout exécuter à partir du disque dur: le produit sera installé avec la totalité des composants par défaut

       o Non disponible: Le produit ne sera pas installé

Les options suivantes permettent de paramétrer l’application dans le cas d’un Niveau d’affichage = Complet

       o Masqué: L’application ne sera pas visible lors de l’installation

       o Verrouillé: L’application sera bloquée dans l’état défini dans OCT

       o Rétablir: Réinitialise les valeurs par défauts

Troisième et quatrième catégories : Contenu additionnel et Outlook

La troisième catégorie permet d’ajouter du contenu additionnel en proposant :

       o Gérer les fichiers

       o Gérer les clés de registre

       o Gérer les raccourcies

La quatrième et dernière catégorie est orientée sur la personnalisation de l’application Outlook.

Enregistrement du fichier MSP

La configuration est prête. La dernière étape consiste à enregistrer votre fichier de réponse. Sélectionner Fichier \ Enregistrer sous.

N’oubliez pas d’enregistrer le fichier de réponse au format MSP dans le répertoire Updates. Sans quoi votre configuration ne sera pas prise en compte. Par exemple : %VotreDeploymentShare%\Applications\Microsoft Office Professional Plus 2013\Updates

20Déploiement

 

L’installation de l'application Office 2013 est maintenant personnalisée et prête à être déployée. Grâce à votre environnement Microsoft Deployment Toolkit l’installation est automatisée et capable d'être déployée en masse lors de la création d’un nouveau poste de travail.

SCOM - ”Dé-découvrir” des objets récalcitrants

Le mécanisme de découverte est un des principe fondamentaux de SCOM et constitue un de ses atout majeur : il permet de trouver automatiquement les objets à superviser sur tous les serveurs disposant d’un agent, sans qu’un opérateur n’ait besoin d’indiquer manuellement à chaque nouveau serveur ce qu’il faut superviser dessus.

L’inverse est également vrai : lors de la suppression d’une application ou d’un service sur un serveur, SCOM est capable de s’en rendre compte et cesse de le superviser.

Du moins, la plupart du temps : il arrive parfois que SCOM ne se rende pas compte de ces désinstallations et génère alors un grand nombre d’erreurs infondées.

Quelle en est la raison, et comment y remédier?

Prenons un exemple concret :

image

Un serveur hébergeait le rôle contrôleur de domaine et ce rôle a été décomissionné.

Cependant, les objets de type SysVol (et d’autres objets propres à un contrôleur de domaine comme Netlogon, NTDS..) sont toujours présents dans SCOM et toujours supervisés, et remontent donc en erreur en générant des alertes.

Si l’on remonte la piste de la découverte de ces objets, on se rend compte qu’il s’agit ici comme souvent d’une découverte en 2 étapes :
- D’abord une découverte légère ciblée sur Windows Computer qui se base sur une requête WMI pour découvrir les instances de la classe Windows Domain Controller :
image

- Puis une découverte beaucoup plus lourde ciblée sur ces Windows Domain Controllers et qui utilise elle un gros script VBS. C’est cette dernière qui découvre les instances des différentes classes Sysvol, Netlogon & co :
image

image

 

Jusqu’ici, rien d’inhabituel, ce mécanisme est très commun dans les gros management pack.

Imaginons maintenant que nous supprimions le rôle Contrôleur de Domaine d’un serveur. Que se passe t’il dans SCOM?

1. La première découverte ciblée sur Windows Computer s’exécute normalement, se rend compte que la requête WMI n’indique plus la présence d’un DC et supprime donc l’instance de la classe Windows Domain Controller pour notre serveur.

2. Comme il n’existe plus d’instance de la classe Windows Domain Controller pour notre serveur, la seconde découverte ne s’exécute plus sur ce serveur.

Seulement voilà : une découverte qui ne s’exécute pas, ce n’est pas la même chose qu’une découverte qui indique qu’un élément n’existe plus sur le serveur, et les objets Sysvol & co. ne sont donc jamais “dé-découverts”!

Comment maintenant remédier à cette situation?

Il existe un cmdlet Remove-SCOMDisabledClassInstance (Remove-DisabledMonitoringObject dans SCOM 2007) dont l’utilité est de parcourir toutes les règles de découverte présente dans votre environnement SCOM et de supprimer les instances des objets découverts par une règle donnée quand celle-ci est désactivée (via un override) pour l’objet cible de cette découverte.
Autrement dit, il suffirait de créer un Override > for a specific object of class Windows Domain Controller > Enabled = False sur la règle de découverte AD DC local discovery (DC Role), pour l’objet Windows Domain Controller correspondant à notre DC décommissionné.

Sauf que justement, cet objet n’existe plus puisque la première découverte a elle parfaitement fonctionné…
Il faut donc ruser un peu en créant un groupe qui contient l’objet Windows Computer correspondant au DC décommissionné, et d’ensuite créer notre override pour ce groupe :
image

image

 

Une fois l’override crée, on peut enfin exécuter le cmdlet Remove-SCOMDisabledClassInstance. Selon la taille de votre infrastructure, son exécution peut être assez longue comme vous l’indique le message en rouge (à titre d’exemple, il a pris environ 1 à 2 minutes sur un environnement contenant ~200 serveurs et autant de MP).

image

 

Et si tous s’est bien passé, les objets découverts par la règle AD DC local discovery (DC Role) sur le contrôleur de domaine décomissionné doivent maintenant avoir disparu.

Création d’un Virtual Switch Hyper-V de type réseaux convergé en Powershell

 

Ici, nous allons voir comment créer un Switch virtuel Hyper-V de type convergé.

Sur un unique Switch virtuel Hyper-V, nous allons ici créer plusieurs Management OS qui permettront de séparer de façon logique via différences vNICs, des réseaux de type Live Migration, Cluster, Management ou autres.

image

 

Dans notre exemple, nous créons tout d'abord le switch virtuel Hyper-V.

New-VMSwitch "SwitchVirtuel" -MinimumBandwidthMode weight -NetAdapterName "NICsTeam" –AllowManagement $false

image

Nous allons maintenant ajouter 3 vNICs.

vNIC LiveMigration
Add-VMNetworkAdapter -ManagementOS -Name "LiveMigration" -SwitchName "SwitchVirtuel"


vNIC Cluster
Add-VMNetworkAdapter -ManagementOS -Name "Cluster" -SwitchName "SwitchVirtuel"


vNIC Management
Add-VMNetworkAdapter -ManagementOS -Name "Management" -SwitchName "SwitchVirtuel"

Dans l’affichage des cartes réseaux, trois nouvelles interfaces virtuelles sont apparues :

image

 

Maintenant afin de contrôler les différents flux réseaux véhiculés par ces interfaces, nous pouvons appliquer à chacune d’entre elle une politique de QOS.

QOS vNIC LiveMigration
Set-VMNetworkAdapter -ManagementOS -Name "LiveMigration" -MinimumBandwidthWeight 20

QOS vNIC Cluster
Set-VMNetworkAdapter -ManagementOS -Name "Cluster" -MinimumBandwidthWeight 30

QOS vNIC Management
Set-VMNetworkAdapter -ManagementOS -Name "Management" -MinimumBandwidthWeight 50

Remarque : la somme des Weights ici appliqués est de 100. (Ceci est hautement recommandé mais non requis d’avoir une somme à 100).

A l’aide de la commande Get-VMNetworkAdapter –ManagementOS vous pouvez voir les différentes vNICs créés. (non visible depuis l’interface graphique Hyper-V).

image

Configuration du Live Migration Settings dans un cluster en Powershell

 

Depuis la console de gestion Failover Cluster Manager, il est facile de sélectionner les réseau devant être utilisé par le Live Migration.

Allez sur Network ==> clique droit Live Migration Settings

image

 

Et il ne vous reste plus qu’a sélectionner les interfaces réseaux souhaitées.

image

 

Maintenant pour effectuer la même opération en Powershell, veuillez taper:

Get-ClusterResourceType -Name "Virtual Machine" | Set-ClusterParameter -Name MigrationExcludeNetworks -Value ([String]::Join(";",(Get-ClusterNetwork | Where-Object {$_.Name -notmatch "LM" -and $_.Name -notmatch "VN -"}).ID))   

Dans le filtre de la commande:

Where-Object {$_.Name -notmatch "XXX" -and $_.Name -notmatch "XXX"}).ID))

Veuiller taper comme valeurs pour les XXX une partie de la chaine de caractère du nom matchant vos interfaces réseaux afin de les identifier.

Modification des propriétés général du DHCP server clusterisé en Powershell

 

Vous souhaitez modifier les propriétés générale de la ressource cluster DHCP server en Powershell.

image

 

Récupérer dans 3 variables les Paths que vous voulez définir pour :

  • Database path
  • Audit file path
  • Backup path

$DatabasePath="j:\dhcp\db"
$AuditFilePath="j:\dhcp\logs"
$BackupPath="j:\dhcp\backup"

Récupérer maintenant votre ressource de type DHCP Service
$RessDHCP=get-ClusterResource "DHCP Server"

Nous allons maintenant manipuler des instances basées sur Microsoft.FailoverClusters.PowerShell.ClusterParameter qui va nous permettre de manipuler nos propriétés.

Modification du Database Path
$param1 = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $RessDHCP,DatabasePath,$DatabasePath

$param1 | Set-ClusterParameter

 

Modification de l'Audit File Path
$param2 = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $RessDHCP,LogFilePath,$AuditFilePath

$param2 | Set-ClusterParameter

 

Modification du Backup path
$param3 = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $RessDHCP,BackupPath,$BackupPath

$param3 | Set-ClusterParameter

 

Les propriétés sont maintenant définis.

SCOM 2012 - Dashboards et Widgets

Depuis la sortie du RU 2 pour SCOM 2012 R2 (et du RU6 pour SCOM 2012 SP1), de nouveaux widgets sont disponibles et enrichissent grandement les possibilités de dashboards.

Une bonne occasion de centraliser ce qu’il est possible de faire en la matière et de résumer brièvement les possibilités offertes par ces modules!

Widgets

Les widgets sont les éléments qui composent les dashboards, il en existe de nombreux types.

Widget

Description

Example

Alert Widget

Affiche les alertes propres à un objet, une classe ou un groupe d’objets.

clip_image026

clip_image028

Contextual Alert Widget

Identique au précédent sauf qu’il cible les alertes en fonction d’un objet sélectionné dans un autre widget du dashboard.

clip_image029

Object Health Widget

Vue de l’état de santé des moniteurs qui s’appliquent sur un objet prédéfini et les sous-objets qu’il contient

clip_image031

Contextual Health Widget

Identique au précédent sauf qu’il cible un objet sélectionné dans un autre widget du même dashboard.

clip_image032

Details Widget (Contextual)

Affiche les propriétés d’un objet sélectionné dans un autre widget (de type alerte ou state) du même dashboard

clip_image034

clip_image036

Instance Details Widget

Identique au précédent mais pour un objet présélectionné

clip_image038

Image Widget

Affiche une image.

clip_image040

Object Detail Tiles Widget

Affiche des briques de tuiles (état de santé et alertes, SLA, compteurs de performance…) pour un objet

clip_image042

Object SLA Widget

Affiche le SLA d’un objet sur lequel s’applique une règle de SLA

clip_image044

SLA Widget

Identique au précédent mais peut afficher plusieurs SLA dans le même widget

clip_image046

SLA Tiles Widget

Affiche des SLA sous forme de tuiles.

clip_image048

Objects by Performance

Widget type “Top 10” (permet en réalité de faire des top N de 1 à 20, et des affichages dégressifs)

Utilisé particulièrement pour afficher les N serveurs (ou instances SQL..) les plus chargés en CPU, RAM, disque dur…

clip_image049

Performance Widget

Affiche un ou plusieurs compteurs de performance pour des objets prédéfinis

clip_image051

clip_image053

Powershell Grid Widget

Affiche le résultat d’un script powershell dans une grid.

clip_image055

PowerShell Web Browser Widget

Affiche une page web (possibilité de lui passer des paramètres provenant d’un script powershell, par ex pour faire automatiquement une recherché sur une erreur sélectionnée dans un Alert widget)

clip_image057

Web Browser Widget

Affiche une page web, contenant éventuellement l’id d’une alerte

clip_image059

State Tiles Widget

Affiche l’état d’objets et le nombre d’alertes liées sous forme de tuiles

clip_image061

State Widget

Affiche l’état de santé d’un ou plusieurs objets prédéfinis sous forme de liste

clip_image063

clip_image065

Topology Widget

Affiche une image représentant l’état de santé pour un ou plusieurs objets avec une autre image en fond (carte géographique, schéma de datacenter…)

clip_image067

     

 

Types de dashboards

Pour rappel, un dashboard SCOM est une vue synthétique permettant d’afficher des informations de différentes manières et depuis différentes sources. 

On retrouve 4 types de disposition de dashboards :

  • Affichage de widgets en colonne
  • Affichage de widgets en grille
  • Template de niveau de service (Service Level Dashboard)
  • Template de résumé (Summary Dashboard)

Widgets en colonne

Jusqu’à 5 colonnes cote à cote contenant un widget chacune

Exemple 2 colonnes:

clip_image002

Exemple 4 colonnes:

clip_image004

Widgets en grille

Il est possible de créer des grilles de 1, 2, 3, 4, 5,6 et 9 cellules avec les dispositions suivantes:

clip_image006clip_image008

clip_image010clip_image012

clip_image014

clip_image016clip_image018

Exemple 5 cellules:

clip_image020

Service Level Dashboard:

Ce dashboard est préconfiguré, on ne peut pas modifier sa disposition ni ses widgets  mais seulement leur configuration.

Il affiche un apercu de l’état de SLA pour des objets prédéfinis

clip_image022

Summary Dashboard:

Le dashboard summary (résumé) est préconfiguré pour créer une grille de 3 cellules contenant les widgets 'Object by Performance’, ‘Performance’ et ‘State’ : 

clip_image024

 

 

Vous disposez maintenant de tous les éléments pour réaliser des dashboards à la fois utiles, pertinents et agréables à l’oeil!

 

Note : les captures d’écran de ce billet proviennent de différentes sources web

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).