En vue de décommisionner un de nos serveurs de son rôle de serveur DNS sans pour autant arrêter la machine, j'ai du rechercher l'intégralité des autres serveurs pointant vers le futur ex-DNS.

La raison à cela est assez simple. Sans serveur DNS de renseigné, une machine n'est pas capable de communiquer avec d'autres du domaine en se servant de leur nom, mais également ne peut faire de résolution pour joindre des sites sur Internet, ou utiliser certains services, etc.

 Comment faire?

Bien entendu, avec l'aide des bons outils. Et les outils ici se nomment Powershell et WMI. Nous avons tout d'abord besoin d'avoir une liste de serveurs à analyser. Deux choix s'offrent à nous :

  1. Aller chercher dans l'A.D. à l'aide du module activedirectory
  2. Avoir un fichier texte contenant l'intégralité des serveurs à analyser.

Dans le cas n°1, beaucoup de configurations sont possibles. Vous pouvez chercher notamment à l'aide du nom si votre parc possède une charte de nommage, ou encore aller chercher dans une ou plusieurs UO en particulier. Les possibilités sont nombreuses, et c'est à vous de définir votre filtre.

N'ayant besoin que du nom, nous enregistrerons l'intégralité des résultats en ne sélectionnant que la propriété name, ce qui aura pour conséquence de rendre la suite du script compatible avec les 2 choix.

$serveurs = Get-ADComputer -SearchBase "OU=Servers,DC=domaine,DC=local" -filter * | Select-Object -ExpandProperty name

Je n'ajoute volontairement pas le module Active Directory car j'estime que vous êtes tous passés depuis le temps à la version 3 de Powershell qui importe directement les modules lorsqu'il constate qu'une commande est ailleurs que dans ses commandes connues et qu'elle n'est pas chargée. Cependant, si vous êtes encore en version 2 (ou 1) ajoutez cette ligne en début de script :

Import-Module Activedirectory

Dans le cas n°2, vous n'avez qu'a récupérer le contenu de votre fichier texte.

$serveurs = Get-Content C:\users\nlang\liste_serveurs.txt

Nous créons ensuite un tableau et également une petite fonction qui nous permettra d'enregistrer les données récuperées. Cette dernière n'est pas obligatoire, mais cela simplifie bien des choses car nous nous servirons aussi de cette fonction pour retourner les erreurs rencontrées.

$tableau = New-Object System.Collections.ArrayList
function addarray([string]$serveur,[string]$description=$null,[string]$serveur1=$null,[string]$serveur2=$null)
    {
    $object = [PSCUSTOMOBJECT]@{
    "Ordinateur" = $serveur
    "Carte réseau" = $description
    "Serveur 1" = $serveur1
    "Serveur 2" = $serveur2
        }
    return $object
   }

Et ensuite, nous sommes partis pour analyser! Dans l'ordre nous allons :

  1. Pinger le serveur pour voir s'il réponds correctement.
  2. Obtenir la liste des informations sur sa carte.
  3. Enregistrer les DNS et la carte dans le tableau.
  4. Passer au serveur suivant dans la liste.

Et une fois tout cela fait, pourquoi ne pas avoir un joli fichier CSV qui contiendra le tout?! Avec en plus la liste des erreurs! Car il faut savoir si un serveur n'est pas joignable, ou alors s'il possède une carte qui n'est pas configurée, ou encore s'il s'agit d'un linux ou d'une machine incapable de répondre au WMI!

Pour ce faire, faisons donc une boucle avec Foreach, afin de selectionner chaque serveur dans la variable $serveurs crée auparavant.

Ensuite, utilisons "Test-Connection" pour vérifier si la machine réponds au ping.

  • Si elle ne réponds pas, nous enregistrons cela dans le tableau, et nous passons directement à la machine suivante.
  • Si elle répond, alors nous essayons d'avoir les infos du WMI sur sa configuration réseau.

Avec le retour d'informations de WMI nous avons soit :

  • Une erreur que nous enregistrons dans le tableau
  • Une liste d'informations sur la/les carte(s) réseau que nous ajouterons à notre tableau, carte par carte

Et enfin, à l'aide de Export-CSV nous créerons le fichier


Script final

Vous pouvez télécharger le script depuis mon répertoire git personnel.

#Ajout du module AD pour les rebelles de la V1/ V2 ;) 
ipmo activedirectory
#Obtention de la liste des serveurs
$serveurs = Get-ADComputer -SearchBase "OU=Servers,DC=domaine,DC=local" -filter * | Select-Object -ExpandProperty name
#Creation du tableau qui stockera les données 
$tableau = New-Object System.Collections.ArrayList
#Fonction utilisée pour stocker les données ET les erreurs 
function addarray([string]$serveur,[string]$description=$null,[string]$serveur1=$null,[string]$serveur2=$null)
    {
    #définition de l'objet envoyé dans le tableau
    $object = [PSCUSTOMOBJECT]@{
    "Ordinateur" = $serveur
    "Carte réseau" = $description
    "Serveur 1" = $serveur1
    "Serveur 2" = $serveur2
        }
    return $object
   }
foreach ($serveur in $serveurs)
    {
    Write-Host "Analyse de $serveur"
    #On teste si ne réponds pas au ping. Si c'est le cas, on stocke l'erreur dans le tableau
    if (!(Test-Connection $serveur -Count 1))
        {
        $tableau.Add($(addarray -serveur $serveur -serveur1 $($Error[0].Exception.Message) -serveur2 "Erreur Ping"))
        }
    else
    {
        #Cette commande obtient la configuration de différentes cartes réseau. Pour filtrer les cartes actives, il suffit de savoir si l'adresse IP n'est pas vide.
        $configuration = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $serveur | where-object {$_.ipaddress -ne $null}
        #Si la derniere commande renvoie une erreur, on enregistre cette erreur
        if (!$?)
            {
             $tableau.Add($(addarray -serveur $serveur -serveur1 $($Error[0].Exception.Message )-serveur2 "Erreur"))
            }
        else
        {
        foreach ($entry in $configuration)
            {
            #Si aucun DNS n'est renseigné sur la carte, alors on le précise dans le tableau
            if (!($($entry.DNSServerSearchOrder)))
                {
                $tableau.Add($(addarray -serveur $serveur -description $($entry.caption) -serveur1 "Aucun DNS" -serveur2 "Aucun DNS"))
                }
            else
                {
            $tableau.Add($(addarray -serveur $serveur -description $($entry.caption) -serveur1 $($entry.dnsserversearchorder[0]) -serveur2 $($entry.dnsserversearchorder[1])))
                }
            }
      }
    }
}
#Et on exporte le tout sur le bureau :)
$tableau | Export-Csv -Path $([environment]::GetFolderPath("Desktop")+"\DNS_SERVEURS_"+$(get-date -Format mm_dd_yyyy)+".csv") -NoTypeInformation -Encoding UTF8 -Delimiter ";"

Et ainsi nous avons pu modifier les serveurs concernés afin de n'avoir aucun effet de bord lors de la décommision du serveur. Et le resultat en image!

p%281%29

Ajouter un commentaire

Article précédent Article suivant