VMware et Powershell : liste des alarmes déclenchées sur les hôtes physiques et VM

J’ai développé rapidement sur un coin de bureau un script pour lister les alarmes déclenchées sur les hôtes ESX et les machines virtuelles portées par ces hôtes, car à ma grande surprise, PowerCli ne possède pas de commande permettant de les obtenir directement. Il faut donc ruser un peu et utiliser les vues d’ensemble de machines virtuelles et physiques pour récupérer leur état et ensuite afficher les alarmes en lien. Ce script a été développé et testé avec PowerCli 6.5 ; à noter que depuis la version 6, ce ne sont plus des SnapIn mais des modules (source), il faudra donc adapter le début du script si jamais la version exécutée fonctionne avec des SnapIn.

Import-Module VMware.VimAutomation.Core
$ESXI = Read-Host "vSphere vCenter server to connect to"
Connect-VIServer $ESXI
Write-Host ""
Write-Host "Collecting virtual machines list..."
Write-Host ""
$VMArrayList = Get-VM
foreach ($VM in $VMArrayList)
{
$VMView = Get-View -ViewType VirtualMachine -Filter @{"Name" = "$VM"}
if ($VMView.TriggeredAlarmState.Overallstatus -eq "red")
{
foreach ($VMAlarm in $VMView.TriggeredAlarmState)
{
$VMAlarmType = $VMView.TriggeredAlarmState.Alarm
$VMAlarmTime = $VMView.TriggeredAlarmState.Time
$VMAlarm = Get-AlarmDefinition -id $VMAlarmType
Write-Host "Virtual Machine: $VM"
Write-Host "Alarm: $VMAlarm"
Write-Host "Time: $VMAlarmTime"
Write-Host ""
}
}
}
Write-Host "Done!"
Write-Host "Now collecting physical hosts list..."
Write-Host ""
$HostArrayList = Get-VMHost
foreach ($HostSys in $HostArrayList)
{
$HostView = Get-View -ViewType HostSystem -Filter @{"Name" = "$Host"}
if ($HostView.TriggeredAlarmState.Overallstatus -eq "red")
{
foreach ($HostAlarm in $HostView.TriggeredAlarmState)
{
$HostAlarmType = $HostView.TriggeredAlarmState.Alarm
$HostAlarmTime = $HostView.TriggeredAlarmState.Time
$HostAlarm = Get-AlarmDefinition -id $HostAlarmType
Write-Host "Host: $Hostsys"
Write-Host "Alarm: $HostAlarm"
Write-Host "Time: $HostAlarmTime"
Write-Host ""
}
}
}
Write-Host "Done!"

Powershell : récupération des informations sur le(s) pagefile.sys

Dans l’idée du billet d’hier concernant la résolution de problématiques d’espace disque, j’ai codé rapidement un petit script Powershell pour récupérer les informations système propres au(x) fichiers de pagination.

En passant en argument du script un nom de machine, on récupère le chemin du fichier, sa taille de base, l’utilisation actuelle et maximale de celui-ci.

Param
([string]$Comp)

$pfsys = Get-WmiObject Win32_PagefileUsage -Computer $Comp | select Name, CurrentUsage, PeakUsage, AllocatedBaseSize
foreach ($pf in $pfsys)
{
echo "Location: "$pf.Name
echo "File base size in MB: "$pf.AllocatedBaseSize
echo "Current usage: "$pf.CurrentUsage
echo "Max. usage: "$pf.PeakUsage
}

Powershell : récupération d’une liste des comptes utilisateurs et ordinateurs modifiés depuis une date donnée

Ne rencontrant pas de problèmes particuliers en ce moment, je prends un peu de temps pour scripter et être un peu plus à l’aise avec PowerShell et essayer de me constituer une petite banque de scripts pouvant être utiles.

Dans ce but, j’ai écrit un script listant les objets comptes utilisateurs et ordinateurs de l’ActiveDirectory qui ont été modifiés depuis la date donnée lors de l’exécution du script. Ce dernier génère deux fichiers, l’un contenant les informations par rapport aux objets « user » et l’autre aux objets « computer », avec leur nom, l’OU conteneur ainsi que le timestamp de dernière modification.

Write-Host "Fill in the date."
$D = Read-Host -Prompt 'Day'
$M = Read-Host -Prompt 'Month'
$Y = Read-Host -Prompt 'Year'
$ChangeDate=New-Object DateTime($Y,$M,$D)
Write-Host "Getting modified users..."
$ModifiedUsers = Get-ADObject -Filter 'whenChanged -gt $ChangeDate -and ObjectClass -eq "user" -and ObjectCategory -eq "person"' -Properties whenChanged | FT Name,DistinguishedName,WhenChanged
$ModifiedUsers > modifiedusers-since-$Y$M$D.txt
Write-Host "Getting modified computers..."
$ModifiedComps = Get-ADObject -Filter 'whenChanged -gt $ChangeDate -and ObjectClass -eq "computer"' -Properties whenChanged | FT Name,DistinguishedName,WhenChanged
$ModifiedComps > modifiedcomps-since-$Y$M$D.txt

Powershell : listing des disques locaux d’une machine distante et export CSV

Pour un besoin ponctuel, j’ai eu à faire un recensement des disques locaux et de leur état sur de multiples machines distantes. J’ai donc réalisé un script Powershell permettant de les lister et d’obtenir d’autres informations et d’en faire un export CSV qui devient finalement exploitable sous Excel grâce à la conversion (onglet Données > Convertir).

Ce script utilise WMI, il est donc important que le service soit en fonctionnement sur les machines cibles et que le pare-feu autorise la communication. Si il s’agit du pare-feu Windows, cela est très facile dans les réglages de ce dernier :

Pour autoriser WMI, on coche les cases « Domaine » ou « Domestique/entreprise » en fonction de sa situation.

A noter que le script commenté est également téléchargeable sur mon miroir de téléchargement.

Le script nécessite de placer simplement en paramètre le nom de la machine en question. On l’appellera par l’instruction suivante :

PS> .\win_listdisks.ps1 server.local
Param
    ([string]$Comp)
    
$output = @()
$DiskList = Get-WmiObject Win32_LogicalDisk -ComputerName $Comp
foreach ($Disk in $DiskList){
    if ($Disk.DriveType -ne 3){continue}
    $DiskLetter = $Disk.DeviceID
    $DiskName = $Disk.VolumeName
    $DiskSize = $Disk.Size
    $DiskFS = $Disk.FreeSpace
    $DiskSize = [long]$DiskSize/1073741824
    $DiskFS = [long]$DiskFS/1073741824
    $DiskPerc = ($DiskFS/$DiskSize)*100
    
    echo "Disk $DiskLetter"
    echo "Name: $DiskName"
    echo "Size: $DiskSize"
    echo "Free: $DiskFS"
    echo "Percentage Free: $DiskPerc"
    
	$DiskObj = New-Object PSCustomObject
	$DiskObj | Add-Member -Type NoteProperty -Name 'DiskLetter' -Value $DiskLetter
	$DiskObj | Add-Member -Type NoteProperty -Name 'DiskName' -Value $DiskName
	$DiskObj | Add-Member -Type NoteProperty -Name 'DiskSize' -Value $DiskSize
	$DiskObj | Add-Member -Type NoteProperty -Name 'DiskFS' -Value $DiskFS
	$DiskObj | Add-Member -Type NoteProperty -Name 'DiskPerc' -Value $DiskPerc
	$output+=$DiskObj
}
$output | Export-CSV disks-$comp.csv

Ensuite, dans Excel, en convertissant le CSV en tableau en choisissant la virgule comme élément délimitant les données, on obtient quelque chose de lisible :