none
Monitoring de PC RRS feed

  • Question

  • Bonjour

    J'ai trouvé un script de monitoring des PC sur internet que j'ai modifié à ma guise. Tout fonctionne bien.
    Cependant, j'aimerais rajouté maintenant une chose supplémentaire dedans l'info qui est envoyée dans l'e-mail : la description correspondante au PC qui est dans l'AD. Voici le script :

    # 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)
    J'ai ajouté aux Get-QADComputer le Select-OBject -Property avec Name et Description
    Ensuite dans le ForEach-Object du Get-QADComputer j'avais seulement : $_.Name.ToUpper() et ja'i ajouté une deuxième ligne contenant $Description = $_.Description

    Et pour finir j'ai ajouté ma variable $Description dans le $Body de mon Send-MailMessage.

    Cependant, j'ai des descriptions, mais celles-ci sont erronées et ne correspondent pas au bon PC dans l'AD ...

    Merci par avance.

    jeudi 11 février 2016 08:29

Toutes les réponses

  • salut steve

    >>j'ai des descriptions, mais celles-ci sont erronées et ne correspondent pas au bon PC dans l'AD ...

    je pense que ton problème viens de l'enchainement des deux foreach !

    en effet les données envoyer par le pipeline sont "buffeurisé" en attendent leurs utilisations dans la deuxième boucle (ici le nom) mais la variable $description elle ne passe pas par le pipeline et continue de changé au rythme de la première boucle ! Des spécialistes pourront t'expliqué plus exactement ce qui ce passe mais ton soucis est là !

    il ce produit donc un décalage entre les variable contenant le nom et la description !?!

    deux solutions :

    - passé la description par le pipeline

    - supprimé le deuxième foreach

    si tu a besoin on peut regardé ensemble la modification de ton script

    jeudi 11 février 2016 16:09
  • Salut 6r

    Merci beaucoup pour ta réponse

    Effectivement j'aurais besoin d'aide pour modifier mon script ça serait vraiment cool, car honnêtement je peine en Powershell je suis pas habitué et j'en fais pas beaucoup

    Comment pouvons-nous procéder ?

    Merci

    vendredi 12 février 2016 06:12
  • Effectivement j'aurais besoin d'aide pour modifier mon script ça serait vraiment cool, car honnêtement je peine en Powershell je suis pas habitué et j'en fais pas beaucoup. comment pouvons-nous procéder ?

    ok

    je vais te donné les explication sur les modifications

    d'abord supprime ces deux lignes :

    } |
    ForEach-Object {

    rajoute "$name =" au début de la ligne $_.Name.ToUpper() soit :

    $name = $_.Name.ToUpper()
    enfin partout ou il y "$_" tu remplace le par "$name"

    ça devrais être bon :)

    tu voir c'est tout simple

    • Proposé comme réponse 6ratgus vendredi 12 février 2016 14:44
    vendredi 12 février 2016 08:27
  • Salut

    Merci 100x pour ton aide

    Alors  à priori ça fonctionnait pas, dans le mail il était écrit ça : 

    SCP-2624 () est hors-ligne le 02/12/2016 12:45:18 

    Il y avait rien dans les () : là où il y aurait du avoir la description du PC

    C'est parce que j'ai fait comme tu m'as expliqué partout ou j'avais "$_" j'ai remplacé par "$name", du coup Description = $name.Description aussi je l'ai fait, et ça ne fonctionnait pas. J'ai remis comme ça Description = $_.Description sur cette ligne et c'est bon ! Merci !!!

    vendredi 12 février 2016 11:48
  • >>Alors  à priori ça fonctionnait pas

    dommage

    >> J'ai remis comme ça Description = $_.Description sur cette ligne et c'est bon ! Merci !!!

    Oui j'ai oublié de precisé de pas faire ces deux lignes

    désolé mais maintenant c'est bon :)

    vendredi 12 février 2016 14:44
  • Oui c'est bon désormais, merci 1000 x
    lundi 15 février 2016 14:11