1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| # Ajoute le snapin de gestion AD
$Snapin="Quest.ActiveRoles.ADManagement"
try {
Get-PSSnapin $Snapin -ErrorAction Stop | Out-Null
}
catch {
Write-Host "Ajout du snapin AD de quest.com"
Add-PSSnapin $Snapin
}
$enc = New-Object System.Text.utf8encoding
$Day = Get-Date -Format dddd
if (($Day -eq "Sunday") -or ($Day -eq "Saturday"))
{
# Remet à 0 la liste d'ordinateurs avant la boucle
$OutageHosts = $Null
# Précise le temps (en minutes) de délai avant l'envoi des notifications e-mail pour les ordianteurs éteints
$EmailTimeOut = 360
# Précise le temps d'attente (en secondes) pour le prochain test des ordinateurs
$SleepTimeOut = 3600
}
else
{
# Remet à 0 la liste d'ordinateurs avant la boucle
$OutageHosts = $Null
# Précise le temps (en minutes) de délai avant l'envoi des notifications e-mail pour les ordianteurs éteints
$EmailTimeOut = 30
# Précise le temps d'attente (en secondes) pour le prochain test des ordinateurs
$SleepTimeOut = 30
}
# Précise le nombre d'ordinateurs qui doivent être éteints avant d'interrompre le script
$MaxOutageCount = 100
# Précise qui doit reçevoir l'e-mail
$notificationto = "DistITScriptsAlert@mydomain.net"
# Précise qui doit envoyer l'e-mail
$notificationfrom = "Monitoring@mycompany.ch"
# Précise le serveur SMTP
$smtpserver = "smtp.mydomain.net"
Write-Host "Démarrage du Monitoring" -BackgroundColor Green -ForegroundColor Black
$Now = Get-date
$Body = "Le monitoring a correctement démarré le $Now"
Send-MailMessage -Body "$body" -to $notificationto -from $notificationfrom `
-Subject "Monitoring démarré" -SmtpServer $smtpserver -Priority High -Encoding $enc
# Début de la boucle ici
Do{
$available = $Null
$notavailable = $Null
Write-Host (Get-Date)
# Lis la liste d'ordinateurs à chaque cycle, pour ajouter ou supprimer des ordinateurs
# À partir de la liste sans modifier la tâche ou le script
# À partir de l'AD grâce à la commande GET-QADComputer
Get-QADComputer -SearchRoot "mydomain.net/companies/mycompany" -ldapFilter ‘(&(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(cn=CF*)(cn=TT*)(cn=SC*)(cn=IPR*))(!(cn=TT-BK*))(!(cn=037))(!(cn=028))(!(cn=025))(!(cn=007)))’ |
Select-Object -Property Name,Description | ForEach-Object {
$_.Name.ToUpper()
$Description = $_.Description
} |
ForEach-Object {
ipconfig /flushdns | Out-Null
if(Test-Connection -ComputerName $_ -Count 1 -ea silentlycontinue)
{
# Si l'ordinateur est en ligne ça l'écrit à l'écran
write-host "En ligne ---> "$_ -BackgroundColor Green -ForegroundColor Black
[Array]$available += $_
}
else
{
# Si l'ordinateur est hors-ligne, ça écrit un avertissement sur l'écran
write-host "Hors-ligne ------------> "$_ -BackgroundColor Yellow -ForegroundColor Black
if(!(Test-Connection -ComputerName $_ -Count 1 -ea silentlycontinue))
{
# Si l'ordinateur est injoignable après 1 (-Count 1 ci-dessus) ping complet, ça écrit une erreur sur l'écran et envoi un e-mail
write-host "Ordinateur hors-ligne ------------> "$_ -BackgroundColor Red -ForegroundColor Black
[Array]$notavailable += $_
if ($OutageHosts -ne $Null)
{
if (!$OutageHosts.ContainsKey($_))
{
# La première fois hors ligne, ajouter à la liste et envoi d'un e-mail
Write-Host "$_ n'est pas dans la liste d'ordinateurs hors-ligne, première fois hors-ligne"
$OutageHosts.Add($_,(get-date))
$Now = Get-date
$Body = "$_ ($Description) est hors-ligne le $Now"
Send-MailMessage -Body "$body" -to $notificationto -from $notificationfrom `
-Subject "$_ hors-ligne" -SmtpServer $smtpserver -Priority High -Encoding $enc
}
else
{
# Si l'ordinateur est dans la liste ne rien faire pendant 15 minutes puis le retirer de la liste
Write-Host "$_ est déjà dans la liste d'ordinateurs hors-ligne"
if (((Get-Date) - $OutageHosts.Item($_)).TotalMinutes -gt $EmailTimeOut)
{$OutageHosts.Remove($_)}
}
}
else
{
# Première fois injoignable création de la liste et envoi de l'e-mail
Write-Host "Ajout de $_ à la liste d'ordinateurs hors-ligne"
$OutageHosts = @{$_=(get-date)}
$Now = Get-date
$Body = "$_ ($Description) est hors-ligne le $Now"
Send-MailMessage -Body "$body" -to $notificationto -from $notificationfrom `
-Subject "$_ hors-ligne" -SmtpServer $smtpserver -Priority High -Encoding $enc
}
}
}
}
# Report to screen the details
Write-Host "Compte ordianteurs en ligne :"$available.count
Write-Host "Compte ordinateurs hors-ligne :"$notavailable.count
Write-Host "Liste d'ordinateurs hors-ligne :"
$OutageHosts
Write-Host ""
Write-Host "Attente $SleepTimeOut secondes"
sleep $SleepTimeOut
if ($OutageHosts.Count -gt $MaxOutageCount)
{
# Si il y a plus d'un certain nombre d'ordinateurs injoignables après une heure abandonner le script
$Exit = $True
$body = $OutageHosts | Out-String
Send-MailMessage -Body "$body" -to $notificationto -from $notificationfrom `
-Subject "Plus de $MaxOutageCount ordinateurs hors-ligne, surveillance abandonnée" -SmtpServer $smtpServer
}
}
while ($Exit -ne $True) |
Partager