Powershell et le Monitoring MDT

Introduction

Microsoft Deployment Toolkit (MDT) est une solution complète pour déployer vos postes de travail. Une de ses fonctionnalités, nommée Monitoring, permet d’analyser en temps réel les déploiements en cours depuis votre serveur. Vous pouvez, de ce fait, voir les PC en cours d’installation, installés avec succès ou échec ou ceux pour lesquels le déploiement ne s’est pas déroulé correctement.

L’un des grands atouts de MDT est que l’on peut pratiquement tout automatiser et réutiliser avec PowerShell.

Dans la suite de cet article, nous allons voir comment analyser vos déploiements d’abord via l’interface de MDT (1) pour ensuite utiliser PowerShell pour le faire.

Nous verrons comment utiliser le monitoring depuis n’importe quel PC ayant accès au serveur, et sans forcément avoir MDT installé (2). Nous verrons ensuite comment recevoir des notifications (notification Windows 10, mail, GUI WPF, Cortana) concernant vos déploiements en cours (déploiement terminé, échec). Nous verrons enfin différentes manières (Outil de monitoring MDT en PowerShell, report web) permettant de lister les déploiements en cours depuis votre serveur.

1 / Le Monitoring dans MDT

Avant de voir comment procéder avec PowerShell, nous allons d’abord voir, comment l’utiliser via le Deployment Workbench de MDT.

a) Activation du Monitoring

La 1ère étape, comme vous devez vous en doutez, est d’activer le Monitoring. Pour cela procédez comme ci-dessous :

  1. Ouvrez le Deployment Workbench
  2. Clic droit sur votre Deployment Share puis cliquez sur Propriétés
  3. Allez dans le dernier onglet, Monitoring.
  4. Activer le monitoring en cochant la case « Enable monitoring for this deployment share »
  5. La partie Monitoring host vous permettra d’accéder à la liste des déploiements

b) Vérification du Monitoring

    1. Ouvrez votre Customsettings.ini
    2. La variable, EventService, ci-dessous devrait y figurer
    3. Dans la barre de recherche Windows, tapez : services.msc
    4. Vérifier que le service Microsoft Deployment Toolkit Monitor service est présent et non arrêté

c) Contenu du Monitoring

Dans MDT

Nous pouvons dorénavant accéder à la liste des déploiements en cours depuis le serveur.

Depuis le Deployment Workbench, cliquez sur Monitoring.

La liste des déploiements devrait s’afficher

Depuis le Web

L’un des avantages du Monitoring est que l’on peut y accéder via un lien Web.

Pour cela cliquez sur le lien ci-dessous, en remplaçant MyHost par votre Monitoring Host. http://MyHost:9801/MDTMonitorData/Computers

Je vous l’accorde ce n’est pas très compréhensible et design. Nous verrons dans la partie 3, comment créer de jolis reports Web, aperçu ci-dessous :

2 / Le Monitoring depuis Powershell

Le Monitoring est une super option, mais cela peut être encore mieux si l’on peut accéder à la liste des déploiements depuis n’importe quel PC et ce, sans avoir MDT sur le PC.
Il suffit de réutiliser le lien mentionné plus haut avec votre Monitoring Host.

Ok ce n’est pas très beau, rendons-le un peu plus compréhensible avec PowerShell.

Pour cela utilisez la fonction, Get_My_MonitoringData, ci-dessous (cette partie sera réutilisée dans les tous les exemples de la suite de l’article) :

$Monitoring_Host = "Votre_Monitoring_Host"
$URL = "http://" + $Monitoring_Host + ":9801/MDTMonitorData/Computers/"

function Get_My_MonitoringData { 
  $Data = Invoke-RestMethod $URL
  foreach($property in ($Data.content.properties)) 
  { 
		$Percent = $property.PercentComplete.'#text' 		
		$Current_Steps = $property.CurrentStep.'#text'			
		$Total_Steps = $property.TotalSteps.'#text'		
		
		If ($Current_Steps -eq $Total_Steps)
			{
				If ($Percent -eq $null)
					{			
						$Step_Status = "Not started"
					}
				Else
					{
						$Step_Status = "$Current_Steps / $Total_Steps"
					}					
			}
		Else
			{
				$Step_Status = "$Current_Steps / $Total_Steps"			
			}

	
		$Step_Name = $property.StepName		
		If ($Percent -eq 100)
			{
				$Global:StepName = "Deployment finished"
				$Percent_Value = $Percent + "%"				
			}
		Else
			{
				If ($Step_Name -eq "")
					{					
						If ($Percent -gt 0) 					
							{
								$Global:StepName = "Computer restarted"
								$Percent_Value = $Percent + "%"
							}	
						Else							
							{
								$Global:StepName = "Deployment not started"	
								$Percent_Value = "Not started"	
							}

					}
				Else
					{
						$Global:StepName = $property.StepName		
						$Percent_Value = $Percent + "%"					
					}					
			}

		$Deploy_Status = $property.DeploymentStatus.'#text'					
		If (($Percent -eq 100) -and ($Step_Name -eq "") -and ($Deploy_Status -eq 1))
			{
				$Global:StepName = "Running in PE"						
			}			
			
			
		$End_Time = $property.EndTime.'#text' 	
		If ($End_Time -eq $null)
			{
				If ($Percent -eq $null)
					{									
						$EndTime = "Not started"
						$Ellapsed = "Not started"												
					}
				Else
					{
						$EndTime = "Not finished"
						$Ellapsed = "Not finished"					
					}
			}
		Else
			{
				$EndTime = ([datetime]$($property.EndTime.'#text')).ToLocalTime().ToString('HH:mm:ss')  	 
				$Ellapsed = new-timespan -start ([datetime]$($property.starttime.'#text')).ToString('HH:mm:ss') -end ([datetime]$($property.endTime.'#text')).ToString('HH:mm:ss'); 				
			}

    New-Object PSObject -Property @{ 
      "Computer Name" = $($property.Name); 
      "Percent Complete" = $Percent_Value; 	  
      "Step Name" = $StepName;	  	  
      "Step status" = $Step_Status;	  
      Warnings = $($property.Warnings.'#text'); 
      Errors = $($property.Errors.'#text'); 
      "Deployment Status" = $( 
        Switch ($property.DeploymentStatus.'#text') { 
        1 { "Running" } 
        2 { "Failed" } 
        3 { "Success" } 
        4 { "Unresponsive" } 		
        Default { "Unknown" } 
        } 
      ); 	  
      "Date" = $($property.StartTime.'#text').split("T")[0]; 
      "Start time" = ([datetime]$($property.StartTime.'#text')).ToLocalTime().ToString('HH:mm:ss')  
	  "End time" = $EndTime;
      "Ellapsed time" = $Ellapsed;	  	  
    } 
  } 
}

Dans PowerShell cela nous donne :

a) Etre informé de ses déploiements

Dans cette partie nous allons voir, comment utiliser PowerShell pour être informé de l’état de ses déploiements sans avoir à regarder la liste tout le temps, ni ouvrir MDT.

Ci-dessous, le script utilisé pour analyser mes déploiements :

$MyData = Get_My_MonitoringData | Select Date, "Computer Name", DeployID, "Percent Complete", PercentNumber, "Step Name", Warnings, Errors, "Start time", "End Time", "Ellapsed time", DeployStatus 
Do
	{			
		$Deployment_Date = $MyData.Date	
		$Deployment_ComputerName = $MyData."Computer name"															
		$Deployment_Status = $MyData.DeployStatus		
		$Deployment_LastTime = $MyData.LastTime
		$Deployment_StepName = $MyData."Step Name"
		$Deployment_Warnings = $MyData.Warnings
		$Deployment_Errors = $MyData.Errors
		$Deployment_Percent_Complete = $MyData."Percent Complete"		
		$Deployment_Start_time = $MyData."Start time"		
		$Deployment_End_time = $MyData."End Time"
		$Deployment_Ellapsedtime = $MyData."Ellapsed time"	

		# COPIER LE SCRIPT DE NOTIFICATION ICI			
	} 	
While ($MyData.Percent_Complete	 -lt 100) 
write-host "Deployment finished"

Le principe est simple, nous allons, à partir du script ci-dessus, analyser le déploiement de la machine toto tant que le pourcentage n’est pas à 100%.

– Si le statut du déploiement renvoie la valeur Unresponsive (valeur égal à 4), nous affichons un certain message.
– Si le statut du déploiement renvoie la valeur Failed (valeur égal à 2), nous affichons un certain message.
– Si le statut du déploiement renvoie la valeur Success (valeur égal à 3), nous affichons un certain message.

Que veulent dire ces valeurs ?

  • Success (3) è Vous l’aurez compris cela veut dire que le déploiement s’est terminé avec succès
  • Failed (2) è Cela veut dire qu’il y a eu une erreur durant le déploiement
  • Unresponsive (4) è Cela veut dire que le statut n’a pas été établi pendant plus de 4 heures.

Maintenant que nous avons vu la base de ce système, nous allons utiliser plusieurs méthodes pour être informé.

!!! Attention, si vous fermez le script l’analyse du déploiement ne pourra pas se faire

Ci-dessous les scripts de notification à copier dans le script d’analyse.

Par une simple notification Windows

Ci-dessous un aperçu de la notification Windows 1O en cas de succès ou d’échec.

Vous trouverez ici, une vidéo que j’avais réalisé sur ce type de notification.

Ci-dessous la partie à copier à la place de # COPIER LE SCRIPT DE NOTIFICATION ICI

# SCRIPT DE NOTIFICATION WINDOWS NOTIFICATION
[reflection.assembly]::loadwithpartialname("System.Windows.Forms")
[reflection.assembly]::loadwithpartialname("System.Drawing")
$path = Get-Process -id $pid | Select-Object -ExpandProperty Path            		
$icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)    		
$notify = new-object system.windows.forms.notifyicon
$notify.icon = $icon
$notify.visible = $true

If ($Deployment_Status -eq 4)	# deployment unresponsive	 
	{
		$message = "Deployment is unresponsive on $Deployment_ComputerName.`nPlease check status of the computer."
		$notify.showballoontip(10,$title,$Message, `
		[system.windows.forms.tooltipicon]::error)		
		break		
	}

ElseIf ($Deployment_Status -eq 3) # Deployment success
	{
		$message = "Deployment success on $Deployment_ComputerName"
		$notify.showballoontip(10,$title,$Message, `
		[system.windows.forms.tooltipicon]::info)						
		break
	}	
	
ElseIf ($Deployment_Status -eq 2) # Deployment failed
	{		
		$message = "Deployment failed on $Deployment_ComputerName.`nPlease check status of the computer."
		$notify.showballoontip(10,$title,$Message, `
		[system.windows.forms.tooltipicon]::error)		
		break
	}				
}

Par Cortana

Ci-dessous la partie à copier à la place de # COPIER LE SCRIPT DE NOTIFICATION ICI

# SCRIPT DE NOTIFICATION CORTANA
Add-Type -AssemblyName System.speech
$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer

$speak.GetInstalledVoices().VoiceInfo
$speak.SelectVoice('Microsoft Hazel Desktop')		

 If ($Deployment_Status -eq 4)	# deployment unresponsive	 
	{
		$message = "Deployment is unresponsive on $Deployment_ComputerName. Please check status of the computer."
		$speak.Speak("$message")     	
		break		
	}

ElseIf ($Deployment_Status -eq 3) # Deployment success
	{
		$message = "Deployment success on $Deployment_ComputerName"
		$speak.Speak("$message")     						
		break
	}	
	
ElseIf ($Deployment_Status -eq 2) # Deployment failed
	{		
		$message = "Deployment failed on $Deployment_ComputerName. Please check status of the computer."
		$speak.Speak("$message")     		
		break
	}

Par une interface graphique WPF

Ci-dessous un aperçu de la notification en WPF en cas de succès ou d’échec.

Vous trouverez ici, une vidéo que j’avais réalisé sur ce type de notification.
Ci-dessous la partie à copier à la place de # COPIER LE SCRIPT DE NOTIFICATION ICI

$Global:Current_Folder =(get-location).path 
If ($Deployment_Status -eq 4)
	{
		$Global:Main_Text = "Deployment unresponsive"
		$Global:Low_Text = "$Deployment_ComputerName is unresponsive - $(get-date)"		
		$Global:Percent_Status = $Deployment_Percent_Complete	
		cd $Current_Folder
		powershell -sta ".\Monitoring_End_Notification.ps1" -MainText "'$global:Main_Text'" -LowText "'$global:Low_Text'" -PercentStatus "'$global:Percent_Status'" 										
		break	

	}

ElseIf ($Deployment_Status -eq 3)		
	{			

		$Global:Main_Text = "Deployment completed"
		$Global:Low_Text = "$Deployment_ComputerName is now ready - $(get-date)"			
		$Global:Percent_Status = "100"		
		cd $Current_Folder
		powershell -sta ".\Monitoring_End_Notification.ps1" -MainText "'$global:Main_Text'" -LowText "'$global:Low_Text'" -PercentStatus "'$global:Percent_Status'" 										
		break	
	}	
	
ElseIf ($Deployment_Status -eq 2)		
	{			
		$Global:Main_Text = "Deployment failed"
		$Global:Low_Text = "An error occured on $Deployment_ComputerName - $(get-date)"
		$Global:Percent_Status = $Deployment_Percent_Complete	
		cd $Current_Folder
		powershell -sta ".\Monitoring_End_Notification.ps1" -MainText "'$global:Main_Text'" -LowText "'$global:Low_Text'" -PercentStatus "'$global:Percent_Status'" 										
		break	
	}

Par mail

Ci-dessous un aperçu de la notification en mail en cas de succès ou d’échec.


Ci-dessous la partie à copier à la place de # COPIER LE SCRIPT DE NOTIFICATION ICI

# SCRIPT DE NOTIFICATION MAIL
If ($Deployment_Status -eq 4)	# deployment unresponsive	 
	{
		$Body = "<p>
		<span>Hello,<br><br>
		Operating System deployment <strong><span style=color:red>is unresponsive</span></strong> on the computer: <span style=color:blue><strong>$Deployment_ComputerName</strong></span> - $(get-date)
		<br><br>
		<span style=color:black>
		See below some informations about your deployment :
		<br><br>
		<strong>Computer name: </strong>$Deployment_ComputerName
		<br>
		<strong>Start time: </strong>$Start
		<br>
		<strong>Last time: </strong>$Deployment_LastTime
		<br>
		<strong>Warning: </strong>$Deployment_Warnings
		<br>
		<strong>Error: </strong>$Deployment_Errors
		<br>
		<strong>Step name: </strong>$Deployment_StepName
		<br> 
		<strong>Percent: </strong>$Deployment_Percent_Complete
		<br><br>
		Best regards
		</span>
		</span></p>
		"     				  
		send-mailmessage -from "$Mail_From" -to "$Mail_To" -subject "MDT Monitoring status: Unresponsive - On $Deployment_ComputerName" -body $Body -BodyAsHtml  -priority Normal -smtpServer $Mail_SMTP   
		break 
	}
ElseIf ($Deployment_Status -eq 3) # Deployment success
	{
		$Body = "<p>
		<span>Hello,<br><br>
		Operating System deployment <strong><span style=color:green>completed successfully</span></strong> on the computer: <span style=color:blue><strong>$Deployment_ComputerName</strong></span> - $(get-date)
		<br><br>
		<span style=color:black>
		See below some informations about your deployment :
		<br><br>
		<strong>Computer name: </strong>$Deployment_ComputerName
		<br>
		<strong>Start time: </strong>$Deployment_Start_time
		<br>
		<strong>End time: </strong>$Deployment_End_time
		<br>
		<strong>Elapsed time: </strong>$Deployment_Ellapsedtime
		<br>		
		<strong>Warning: </strong>$Deployment_Warnings
		<br>
		<strong>Error: </strong>$Deployment_Errors
		<br><br>
		Best regards
		</span>
		</span></p>
		"
		send-mailmessage -from "$Mail_From" -to "$Mail_To" -subject "MDT Monitoring status: Success - On $Deployment_ComputerName" -body $Body -BodyAsHtml  -priority Normal -smtpServer $Mail_SMTP      
		break
	}	
	
ElseIf ($Deployment_Status -eq 2) # Deployment failed
	{		
		$Body = "<p>
		<span>Hello,<br><br>
		Operating System deployment <strong><span style=color:red>failed</span></strong> on the computer: <span style=color:blue><strong>$Deployment_ComputerName</strong></span> - $(get-date)
		<br><br>
		<span style=color:black>
		See below some informations about your deployment :
		<br><br>
		<strong>Computer name: </strong>$Deployment_ComputerName
		<br>
		<strong>Start time: </strong>$Deployment_Start_time
		<br>
		<strong>Last time: </strong>$Deployment_End_time
		<br>
		<strong>Warning: </strong>$Deployment_Warnings
		<br>
		<strong>Error: </strong>$Deployment_Errors
		<br>
		<strong>Step name: </strong>$Deployment_StepName
		<br> 
		<strong>Percent: </strong>$Deployment_Percent_Complete
		<br><br>
		Best regards
		</span>
		</span></p>
		"
		send-mailmessage -from "$Mail_From" -to "$Mail_To" -Cc "$Mail_CC" -subject "MDT Monitoring status: Failed - On $Deployment_ComputerName" -body $Body -BodyAsHtml  -priority Normal -smtpServer $Mail_SMTP     
		break
	}

b) Monitoring Web

Comme vu précédemment, la sortie Web native n’est pas très claire et « user-friendly ».
Réutilisons le code PowerShell et rendons le plus joli.

$Date = get-date
$programdata = $env:programdata
$Your_Host = ""

$URL = "http://" + $Your_Host + ":9801/MDTMonitorData/Computers/"
$HTML_Deployment_List = "$programdata\Monitoring_List.htm"
$Title = "<br><p><span class=titre_list>MDT deployment Status</span><br><span class=subtitle>This document has been updated on $Date</span></p><br>"

# COPIER LA FONCTION Get_My_MonitoringData ICI

$MyData = GetMDTData | Select Date, "Computer Name", "Percent Complete", "Step Name", Warnings, Errors, "Start time", "End Time", "Ellapsed time", "Step status", "Deployment Status" | Sort -Property StartTime | ConvertTo-HTML -Fragment
$html_final = ConvertTo-HTML  -body "$title<br>$MyData" 		
$html_final | out-file -encoding ASCII $HTML_Deployment_List
Invoke-Item $HTML_Deployment_List

Pour cela il suffit de sortir notre résultat sous forme de page Web.

Ci-dessous le résultat :

Ok, ce n’est pas encore ça, allons plus loin.

Un peu de CSS

Avec le Web tout peut changer avec un peu de CSS. Par exemple afficher des couleurs différentes en cas de succès, échecs…

Ci-dessous le résultat :

Ci-dessous le code PowerShell utilisé :

$Date = get-date
$programdata = $env:programdata
$CSS_File = "$programdata\Monitoring_CSS.css" 
$Your_Host = ""

$URL = "http://" + $Your_Host + ":9801/MDTMonitorData/Computers/"
$HTML_Deployment_List = "$programdata\Monitoring_List.htm"
$Title = "<br><p><span class=titre_list>MDT deployment Status</span><br><span class=subtitle>This document has been updated on $Date</span></p><br>"

# COPIER LA FONCTION Get_My_MonitoringData ICI

$MyData = Get_My_MonitoringData | Select Date, "Computer Name", DeployID, "Percent Complete", PercentNumber, "Step Name", Warnings, Errors, "Start time", "End Time", "Ellapsed time", DeployStatus | Sort -Property StartTime | ConvertTo-HTML -Fragment
$colorTagTable = @{Failed = ' class="Failed">Failed<';
				   Unknown = ' class="Failed">Unknown<';
				   Unresponsive = ' class="Failed">Unresponsive<';				   
				   Running = ' class="Running">Running<';
				   Success = ' class="Success">Success<'}
$colorTagTable.Keys | foreach { $MyData = $MyData -replace ">$_<",($colorTagTable.$_) }
$html_final = ConvertTo-HTML  -body "$title<br>$MyData" -CSSUri $CSS_File 		
$html_final | out-file -encoding ASCII $HTML_Deployment_List
Invoke-Item $HTML_Deployment_List

Ci-dessous le contenu du fichier CSS :

body
{
	font-family: Arial;
	font-size: 8pt;
}
table
{
	border: 0px solid #e3e3e3;
	border-collapse: collapse;
}
tr:nth-child(even) 
{
	background: #f5f5f5;	
}
tr:nth-child(odd) 
{
	background: #f1f1f1;	
}
tr:hover
{
	background:#A1E5DC;
}
th
{
	padding: 3px;
	background: #2b5797;
	color: white;
	font-size: 13px;
	text-align:center;
	border: 1px solid #e3e3e3;		
}
td
{
	border: 1px solid #e3e3e3;
	padding: 5px;
	font-size: 11px;
	text-align:center;
}
.Success
{
	color: #00a300;
	font-weight:bold;	
}
.Failed
{
	color: red;
	font-weight:bold;	
}
.Running
{
	color: #da532c;
	font-weight:bold;	
}
.titre_list
{
	color: #2d89ef;
	font-weight:bold;
	font-size:16pt;
	font-family: Segoe UI light, Arial;
}
.subtitle
{
	font-family: Segoe UI Light, Arial;
	font-weight:bold;	
	font-size: 11pt;
	color:#00a300;
}

Bootstrap

Les pages Web peuvent être facilement customisées avec du CSS mais également avec du Bootstrap, qui utilisera du CSS directement depuis le Web. Plus d’infos sur le bootstrap ici.

Nous allons maintenant améliorer encore le report en ajoutant les parties ci-dessous:

1 / Couleurs par statut de déploiement

2 / Badges qui indiquent le nombre de machines en cours d’installation, échec, succès.

Message d’alerte personnalisable

Bien entendu, seul le message approprié s’affiche :

– Si tous les déploiements sont en succès, l’alerte de succès s’affiche.
– Si tous les déploiements sont en cours, l’alerte d’info s’affiche.
– Si au moins un déploiement est en échec, l’alerte d’échec s’affiche
– Si aucun déploiement n’est trouvé, l’alerte no monitoring data s’affiche

3 / Barre de recherche pour chercher un élément particulier (ordinateur, en succès, en échec…).

Ci-dessous le script utilisé

$Date = get-date
$programdata = $env:programdata
$Your_Host = ""
$URL = "http://" + $Your_Host + ":9801/MDTMonitorData/Computers/"
$HTML_Deployment_List = "$programdata\Monitoring_List.htm"

# COPIER LA FONCTION Get_My_MonitoringData ICI

$AllDatas = GetMDTData | Select Date, "Computer Name", "Percent Complete", "Step Name", Warnings, Errors, "Start time", "End Time", "Ellapsed time", "Step status", "Deployment Status"

If ($AllDatas -eq $null)
	{
		$Alert_Type = "'alert alert-warning alert-dismissible'"
		$Alert_Title = "Oops !!!"		
		$Alert_Message = " There is no deployment in your monitoring history"
		
		$NB_Success = "0"
		$NB_Failed = "0"
		$NB_Runnning = "0"	

		$Search = ""
	}
Else
	{
		$Search = "
		<p> Type something like computer name, deployment status, step name...</p>  

		<input class='form-control' id='myInput' type='text' placeholder='Search..'>
		"  
		
		$NB_Success = ($AllDatas | Where {$_."Deployment Status" -eq "Success"}).count
		$NB_Failed = ($AllDatas | Where {$_."Deployment Status" -eq "Failed"}).count
		$NB_Runnning = ($AllDatas | Where {$_."Deployment Status" -eq "Running"}).count
		$NB_Unresponsive = ($AllDatas | Where {$_."Deployment Status" -eq "Unresponsive"}).count		
		
		If ($NB_Success -eq $null)
			{
				$NB_Success = 0
			}
			
		If ($NB_Failed -eq $null)
			{
				$NB_Failed = 0
			}

		If ($NB_Runnning -eq $null)
			{
				$NB_Runnning = 0
			}

		If ($NB_Unresponsive -eq $null)
			{
				$NB_Unresponsive = 0
			}			
		
		
		If (($NB_Failed -ne 0) -or ($NB_Unresponsive -ne 0))
			{
				$Alert_Type = "'alert alert-danger alert-dismissible'"
				$Alert_Title = "Oops !!!"		
				$Alert_Message = " There is an issue during one of your deployments"			
			}
			
		ElseIf (($NB_Failed -eq 0) -and ($NB_Success -ne 0) -and ($NB_Runnning -eq 0))
			{
				$Alert_Type = "'alert alert-success alert-dismissible'"
				$Alert_Title = "Congrats !!!"		
				$Alert_Message = " All your deployments have been completed with success"
			}	

		ElseIf (($NB_Failed -eq 0) -and ($NB_Success -eq 0) -and ($NB_Runnning -ne 0))
			{
				$Alert_Type = "'alert alert-info alert-dismissible'"
				$Alert_Title = "Info !!!"		
				$Alert_Message = " All your computers are currently being installed"
			}					
	}

$head = '
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
  '
  
$Title = "
<p align='center' > 
<img src="""" width='' height=''/>
<br><br>
<span class='text-primary font-weight-bold lead'>MDT deployment Status</span>
<br><span class=text-success font-italic>This document has been updated on $Date</span></p>
"


$Badges = "
<div id='demo' class='show' align='center'>
<button type='button' class='btn btn-primary'>
	Running <span class='badge badge-light'>$NB_Runnning</span>
</button>
<button type='button' class='btn btn-success'>
	Success <span class='badge badge-light'>$NB_Success</span>
</button>
<button type='button' class='btn btn-danger'>
	Failed <span class='badge badge-light'>$NB_Failed</span>
</button>
<button type='button' class='btn btn-warning'>
	Unresponsive <span class='badge badge-light'>$NB_Unresponsive</span>
</button>
</div>
<br>
"

$Alert = "
<div class=$Alert_Type>
    <button type='button' class='close' data-dismiss='alert'>&times;</button>
	<strong>$Alert_Title</strong>$Alert_Message
</div>
"

$Script = '
<script>
$(document).ready(function(){
  $("#myInput").on("keyup", function() {
    var value = $(this).val().toLowerCase();
    $("#myTable tr").filter(function() {
      $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
    });
  });
});
</script>
'

$MyData = GetMDTData | Select Date, "Computer Name", "Percent Complete", "Step Name", Warnings, Errors, "Start time", "End Time", "Ellapsed time", "Step status", "Deployment Status" | Sort -Property Date |
ConvertTo-HTML `
-head $head -body "$title<br>$Badges<br>$Alert<br>$Search<br>$MyData<br>$Script"	|

ForEach {
if($_ -like "*<td>Failed</td>*"){$_ -replace "<tr>", "<tr class=table-danger>"}
elseif($_ -like "*<td>Success</td>*"){$_ -replace "<tr>", "<tr class=table-success>"}
elseif($_ -like "*<td>Running</td>*"){$_ -replace "<tr>", "<tr class=table-primary>"}
elseif(($_ -like "*<td>Unresponsive</td>*") -or ($_ -like "*<td>Unknown</td>*")){$_ -replace "<tr>", "<tr class=table-warning>"}
else{$_}
} > $HTML_Deployment_List 	


	
$HTML = get-content $HTML_Deployment_List	
$HTML.replace("<table>","<table class=table>").replace("<tr><th>Date",'<thead class="thead-dark"><tr><th>Date').replace('Deployment Status</th></tr>','Deployment Status</th></tr></thead><tbody id="myTable">').replace('</td></tr></table>','</td></tr></tbody></table>') | out-file -encoding ASCII $HTML_Deployment_List
Invoke-Item $HTML_Deployment_List

c) Outil de Monitoring en PowerShell

Vous trouverez à cette adresse un outil en PowerShell, que j’ai développé et qui permet de :

– Saisir votre Monitoring Host et s’en souvenir
– Lister les déploiements en cours
– Lancer un timer qui permettra de rafraichir la liste toutes les 10 secondes
– Afficher les propriétés d’un déploiement
– Configurer la partie envoi de mail (avec envoi de mail test)
– Recevoir une notification de déploiement par mail ou WPF
– Se connecter à distance (mstsc) sur la machine
– Accéder aux logs d’une machine
– Exporter la liste de vos déploiements en format CSV

Ci-dessous l’interface principale de l’outil.

A quoi servent les boutons de la barre de titre ?

– Le 1er bouton permet de rafraîchir une fois la liste des déploiements
– Le 2nd permet de rafraîchir automatiquement toutes les 10secondes
– Le 3ème boutons permet de configurer la partie mail, voir ci-dessous:

– Le 4ème bouton permet de lister vos déploiements en format CSV

A quoi servent les boutons ci-dessous ?

Affichage des propriétés d’une machine


Notification mail ou GUI

d) Module MDTMonitor sur PSGallery

Un module que j’ai développé est également présent sur la PowerShell Gallery.

Pour l’installer, dans PowerShell tapez : install-module MDTMonitor

Ce module permet de :

– Lister vos déploiements en format Web et Bootstrap (modèle partie)
– Lancer l’analyse de déploiement d’une machine et de recevoir une notification
– Mail
– Notification Windows
– Via une interface graphique
– Par Cortana

Pour l’utiliser voir ci-dessous :

1 / Tapez la commande : mdtmonitor.
2 / Entrez ensuite votre Monitoring host lorsque celui-ci est demandé
Vous pouvez tapez également mdtmonitor -myhost:”yourhost”
Si vous souhaitez garder en mémoire le host tapez, mdtmonitor -myhost:”yourhost” -remember

3 / Choisissez ce que vous voulez faire, parmi les choix ci-dessous :

Report Web

Pour lister les déploiements en cours sur votre serveur (Monitoring Host), tapez 1. Vos déploiements vont alors s’afficher sous forme de report Web, comme ci-dessous :

Etre informé

Pour être informé du déploiement d’une machine, tapez 2

Choisissez l’ordinateur pour lequel vous souhaitez recevoir une notification parmi la liste :

Choisissez le type de notification souhaité :

Le script d’analyse va commencer et analyser le déploiement du PC, ne fermez pas l’invite de commande PowerShell.

Lorsque le déploiement sera terminé en succès ou échec vous recevrez une information utilisant le mode de notification sélectionné.

A propos de l'auteur

Consultant Modern Workplace travaillant principalement sur ce qui tourne autour du poste de travail (MDT, SCCM, Intune, Graph...) et l’automatisation avec PowerShell. MVP Microsoft (depuis 5ans) et auteur pour ENI, il publie régulièrement sur son blog et gère différents groupes Facebook, PowerShell et WPF (~9000 membres), Windows Autopilot (~6900membres).

2 réponses sur “Powershell et le Monitoring MDT”

  1. Bonjour Jérôme,

    Merci pour votre commentaire.

    Pouvez-vous essayer avec le script de mon blog ci-dessous ?
    http://www.systanddeploy.com/2018/06/mdt-monitoring-web-report-with.html

    Sinon j’ai également créé une applicatyyion que vos tech pourraient lancer pour voir les status.
    http://www.systanddeploy.com/2018/07/powershell-tool-mdt-light-monitor-new.html

    Concernant votre question
    Le but final est de lancer ce script à interval régulier pour qu’il soit mis à jour, est-ce la bonne solution ?

    Effectivement, le script analyse à un instant T pas en temps réel.
    J’ai réalisé un autre script qui utilise universal dashboard et permettant une analyse en temps réel sur une page web.
    Je dois améliorer un peu le script, mais seriez-vous intéressé de le tester ?

    Cordialement.

  2. Je trouve votre travail vraiment super, c’est du super boulot.

    J’aimerais pour ma part pouvoir publier le résultat sur un site web pour mes techs.

    N’étant pas développeur je galère un peu, je penser lancer le script web avec le Bootstrap (qui est très réussit) mais j’ai toujours ce message d’erreur:

    Cannot find path ‘C:\ProgramData\Monitoring_List.htm’ because it does not exist.

    De plus, quand je lance le ps1 j’ai aussi une erreur avec le GetMDTData:

    GetMDTData : The term ‘GetMDTData’ is not recognized as the name of a cmdlet

    Le but final est de lancer ce script à interval régulier pour qu’il soit mis à jour, est-ce la bonne solution ?

    Cordialement,

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.