#Informations récupérées : Nom du contrôleur de domaine, domaine AD, adresse IP, OS, CPU, taille du disque C, taille restante du disque C, RAM
#Evolution du script : certains attributs non utilisés sont récupérés pour pouvoir éventuellement augmenter le nombre d'informations récupéré
#Prérequis 1 : l'utilisateur qui lance ce script doit pouvoir requêter les bases WMI de tout les contrôleurs de domaine (DC) de la forêt
#Prérequis 2 : le script suppose qu'un seul adapteur réseau de chaque DC posséde une ou plusieurs adresses IP
#Prérequis 3 : le script suppose que le système d'exploitation de chaque DC est installé sur C:
#Importe le module Active Directory qui contient des commandes utilisées dans le script
Import-Module ActiveDirectory
#Permet de récupérer le nom des domaines de la forêt de façon dynamique
$Domains = Get-ADForest | Select-Object Domains
$Domains = $Domains.Domains
#Créer un tableau qui contiendra l'ensemble des DC de tout les domaines de la forêt
$DCToGetConfiguration = @()
#Parcours un par un chaque domaine de la forêt
foreach ($Domain in $Domains)
{
#Pour chaque domaine de la forêt, récupére l'ensemble des DC du domaine
$DomainControllersFromCurrentDomain = (Get-ADDomainController -Server $Domain -Filter * | Select-Object HostName, Domain, IPv4Address).HostName
#Pour chaque domaine de la forêt, ajoute l'ensemble des DC du domaine à l'ensemble des DC de la forêt
$DCToGetConfiguration += $DomainControllersFromCurrentDomain
}
#Créer un tableau qui contiendra chaque DC de la forêt avec sa configuration
$Array = @()
#Parcours un par un chaque DC de chaque domaine de la forêt, récupéré précédemment
foreach ($ServerToGetConfiguration in $DCToGetConfiguration)
{
#Créer un objet PowerShell qui contiendra la configuration du DC actuellement requêté
$Line = New-Object PSObject
#Ajoute à l'objet PowerShell précédemment crée, le nom du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "HostName" -Value $ServerToGetConfiguration
#Récupére le domaine AD d'appartenance du DC actuellement requêté
$WMIComputerSystemObject = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $ServerToGetConfiguration | Select-Object Name, Domain
#Ajoute à l'objet PowerShell précédemment crée, le domaine AD d'appartenance du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "Domain" -Value $WMIComputerSystemObject.Domain
#Récupére l'adresse IP du DC actuellement requêté
$WMINetworkAdapterConfigurationObjects = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $ServerToGetConfiguration | Select-Object PSComputerName, IPAddress, IPSubnet, DefaultIPGateway, DNSServerSearchOrder
#La commande Get-WmiObject -Class Win32_NetworkAdapterConfiguration récupére les adaptateurs réseaux, certains d'entre eux ne comportent pas de carte réseau
#La boucle suivante ne permet de récupérer que la carte réseau qui contient une adresse IP
#Cette portion du script ne marchera pas si plusieurs cartes réseaux contiennent chacune une IP
foreach ($NetworkAdapterConfigurationObject in $WMINetworkAdapterConfigurationObjects)
{
if ($NetworkAdapterConfigurationObject.IPAddress)
{
$Line | Add-Member -MemberType NoteProperty -Name "IPAddress" -Value ([string]($NetworkAdapterConfigurationObject.IPAddress))
}
}
#Récupére le système d'exploitation du DC actuellement requêté
$WMIOperatingSystemObject = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $ServerToGetConfiguration | Select-Object PSComputerName, Caption, BuildNumber
#Ajoute à l'objet PowerShell précédemment crée, système d'exploitation du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "OperatingSystem" -Value $WMIOperatingSystemObject.Caption
#Récupére les CPU du DC actuellement requêté
$WMIProcessorObjects = Get-WmiObject -Class Win32_Processor -ComputerName $ServerToGetConfiguration | Select-Object PSComputerName, Name, MaxClockSpeed, Manufacturer, NumberOfCores, NumberOfEnabledCore, NumberOfLogicalProcessors
#Boucle qui va additioner l'ensemble des CPU du DC requêté pour obtenir le nombre total de CPU
$CPUNumbers = 0
foreach ($WMIProcessorObject in $WMIProcessorObjects)
{
$CPUNumbers += 1
}
#Ajoute à l'objet PowerShell précédemment crée, le nombre total de CPU du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "CPU_total" -Value $CPUNumbers
#Récupére l'espace disque du DC actuellement requêté
$WMILogicalDiskObjects = Get-WMIObject -Class Win32_LogicalDisk -ComputerName $ServerToGetConfiguration | Select-Object PSComputerName, DeviceID, FileSystem, MaximumComponentLength, Size, FreeSpace
#Boucle qui va parcourir chaque disque du DC requêté et ajoute à l'objet PowerShell précédemment crée, l'espace disque total et restant de C: et l'affiche en GB
foreach ($WMILogicalDiskObject in $WMILogicalDiskObjects)
{
if ($WMILogicalDiskObject.DeviceID -eq "C:")
{
$Line | Add-Member -MemberType NoteProperty -Name "Disk_size(GB)" -Value ([math]::truncate(($WMILogicalDiskObject.Size)/1GB))
$Line | Add-Member -MemberType NoteProperty -Name "Disk_free(GB)" -Value ([math]::truncate(($WMILogicalDiskObject.FreeSpace)/1GB))
}
}
#Récupére les RAM du DC actuellement requêté
$WMIPhysicalMemoryObjects = Get-WmiObject -Class Win32_PhysicalMemory -ComputerName $ServerToGetConfiguration | Select-Object PSComputerName, BankLabel, Capacity, Manufacturer
#Boucle qui va additionner l'ensemble des RAM du DC requêté pour obtenir le nombre total de RAM
$RAMnumbers = 0
foreach ($WMIPhysicalMemoryObject in $WMIPhysicalMemoryObjects)
{
$RAMnumbers += $WMIPhysicalMemoryObject.Capacity
}
#Ajoute à l'objet PowerShell précédemment crée, le nombre total de RAM du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "Memory(MB)" -Value ([math]::truncate(($RAMnumbers)/1MB))
#Ajoute à la variable globale qui contient l'ensemble des configuration des DC, l'objet PowerShell précédemment crée de l'itération courante
$Array += $Line
#Supprime les valeurs des variables propres au DC actuellement requêté
Clear-Variable Line, WMIComputerSystemObject, WMINetworkAdapterConfigurationObjects, WMIOperatingSystemObject, CPUNumbers, WMILogicalDiskObjects, WMIPhysicalMemoryObject
}
#Affiche sous forme de liste l'ensemble des DC avec leurs configurations
$Array
<#Exemple d'affichage
HostName : DC01.customer.intern
Domain : customer.intern
IPAddress : 192.168.1.50
OperatingSystem : Microsoft Windows Server 2019 Standard
CPU_total : 4
Disk_size(GB) : 50
Disk_free(GB) : 30
Memory(MB) : 16384
HostName : DC02.technical.intern
Domain : technical.intern
IPAddress : 192.168.1.51
OperatingSystem : Microsoft Windows Server 2022 Standard
CPU_total : 4
Disk_size(GB) : 100
Disk_free(GB) : 60
Memory(MB) : 16384
#>