J’ai développé un script Powershell utilisant WMI pour adresser à tous les ordinateurs d’une sélection d’OU ActiveDirectory une requête pour connaître l’état de leurs disques. Le but de ce script est de pouvoir générer des rapports d’état (au format CSV ou XML) pour prévoir l’occupation de certaines plateformes et tracer une évolution, afin de pouvoir agir en conséquence (libération d’espace disque, augmentation du disque…)
Bien que la requête soit identique pour les deux scripts, le traitement pour un export CSV est différent de celui qui génère un fichier XML.
Le script permettant de réaliser le rapport en CSV :
function dothemaths {
param($Disk)
$Size = $Disk.Size
$FS = $Disk.FreeSpace
$DiskPerc = [math]::Round(($FS/$Size)*100,0)
return $DiskPerc
}
$Output = @()
$SearchBases = @('OU=APP','OU=FILERS','OU=PRINT','OU=ADMIN')
foreach($SearchBase in $SearchBases){
$Comps = Get-AdComputer -filter * -SearchBase "$SearchBase,OU=SERVERS,DC=dundermifflin,DC=inc" | select name
foreach($Comp in $Comps){
$DiskList = Get-WmiObject Win32_LogicalDisk -ComputerName $Comp.name
foreach ($Disk in $DiskList){
if($Disk.DriveType -ne 3){ continue }
$Temp = New-Object PSCustomObject
Add-Member -InputObject $Temp -Type NoteProperty -Name 'ComputerName' -Value $Comp.name
Add-Member -InputObject $Temp -Type NoteProperty -Name 'DiskLetter' -Value $Disk.DeviceID
Add-Member -InputObject $Temp -Type NoteProperty -Name 'DiskName' -Value $Disk.VolumeName
Add-Member -InputObject $Temp -Type NoteProperty -Name 'Size' -Value $Disk.Size
Add-Member -InputObject $Temp -Type NoteProperty -Name 'FreeSpace' -Value $Disk.FreeSpace
Add-Member -InputObject $Temp -Type NoteProperty -Name 'FreeSpacePercentage' -Value (dothemaths($Disk))
$Output+=$Temp
}
}
}
$Output | Export-CSV DiskReport.csv
Le format CSV peut ensuite être ouvert et exploité dans Excel. Afin de convertir les valeurs exprimées en octet en Mo ou en Go par exemple, il suffira de réaliser un collage spécial sur les colonnes pour faire une division par le nombre correspondant (1073741824 par exemple pour un affichage en Go).
Le script permettant de réaliser un rapport au format XML :
function dothemaths {
param($Disk)
$Size = $Disk.Size
$FS = $Disk.FreeSpace
$DiskPerc = [math]::Round(($FS/$Size)*100,0)
return $DiskPerc
}
$XML = New-Object System.Xml.XmlDocument
$XMLd = $XML.CreateXmlDeclaration("1.0","UTF-8",$null)
$XML.AppendChild($XMLd) | out-null
$XMLn = $XML.CreateNode("element","Servers",$null)
$SearchBases = @('OU=APP','OU=FILERS','OU=PRINT','OU=ADMIN')
foreach($SearchBase in $SearchBases){
$Comps = Get-AdComputer -filter * -SearchBase "$SearchBase,OU=SERVERS,DC=dundermifflin,DC=inc" | select name
foreach($Comp in $Comps){
$DiskList = Get-WmiObject Win32_LogicalDisk -ComputerName $Comp.name
$CompNode = $XML.CreateNode("element","Server",$null)
$CompNode.SetAttribute("Name",$Comp.name)
foreach ($Disk in $DiskList){
if($Disk.DriveType -ne 3){ continue }
$XMLe = $XML.CreateElement("DiskLetter")
$XMLe.InnerText = $Disk.DeviceID
$CompNode.AppendChild($XMLe) | out-null
$XMLe = $XML.CreateElement("DiskName")
$XMLe.InnerText = $Disk.VolumeName
$CompNode.AppendChild($XMLe) | out-null
$XMLe = $XML.CreateElement("Size")
$XMLe.InnerText = $Disk.Size
$CompNode.AppendChild($XMLe) | out-null
$XMLe = $XML.CreateElement("FreeSpace")
$XMLe.InnerText = $Disk.FreeSpace
$CompNode.AppendChild($XMLe) | out-null
$XMLe = $XML.CreateElement("FreeSpacePercentage")
$XMLe.InnerText = dothemaths($Disk)
$CompNode.AppendChild($XMLe) | out-null
}
$XMLn.AppendChild($CompNode) | out-null
}
}
$XML.AppendChild($XMLn) | out-null
$XML.Save("DiskReport.xml")
Ensuite, le fichier XML pourra être importé et exploité dans un objet Powershell, comme je l’ai expliqué dans ce tutoriel.