Qui a touché à la VM ?

Il est parfois nécessaire de retrouver qui a fait une modification sur une VM, ne serait-ce que pour s’assurer que c’était bien volontaire, mais aussi éventuellement pour le fouetter nu avec les orties si jamais il a supprimé la VM que vous veniez de finir d’installer.

Pour cela, on peut s’appuyer sur les informations renvoyées par Get-VIEvent.

J’ai basé ce script sur 4 catégories d’actions, contenant chacune plusieurs types d’événement, au sens VIEvent :
– La création de VMs, avec les événements de type VmBeingCreatedEvent, VmBeingDeployedEvent, VmCloneEvent, VmCreatedEvent, VmDeployedEvent et VmRegisteredEvent
– La suppression de VMs, avec les événements de type VmRemovedEvent
– La modification de VMs, avec les événements de type CustomizationEvent, MigrationEvent, VmBeingHotMigratedEvent, VmBeingMigratedEvent, VmDateRolledBackEvent, VmMacAssignedEvent, VmMacChangedEvent, VmMigratedEvent, VmReconfiguredEvent, VmReloadFromPathEvent, VmRelocateSpecEvent, VmRenamedEvent, VmUpgradeCompleteEvent et VmUpgradingEvent
– Le changement de statut des VMs, avec les événements de type VmGuestRebootEvent, VmGuestShutdownEvent, VmGuestStandbyEvent, VmPoweredOffEvent, VmPoweredOnEvent, VmPoweringOnWithCustomizedDVPortEvent, VmResettingEvent, VmResumingEvent, VmStartingEvent, VmStoppingEvent, VmSuspendedEvent et VmSuspendingEvent

Il peut manquer certains types d’événement, mais il sera simple de les ajouter dans le script.
Notamment, je n’ai trouvé qu’un type d’événement pour la suppression de VMs, alors que je m’attendais à en trouver deux : un pour la suppression de l’inventaire et un autre pour l’effacement complet.

qui-a-touche-a-la-vm


Variables

Outre les 4 variables correspondant à la liste des événements ci-dessus, il y a deux variables de temps à définir.

$StartDate : début de la période de recherche
$EndDate : fin de la période de recherche.

Ces deux variables sont particulièrement nécessaires sur les gros environnements, afin de limiter le champs d’action de la commande Get-VIEvent qui pourrait durer très longtemps.

$StartDate = (Get-Date).AddDays(-15)
$StartDate = (Get-Date).AddHours(-12)
$StartDate = Get-Date "30/8/2016 7:00 AM"
$EndDate = (Get-Date).AddMinutes(-30)
$EndDate = Get-Date

Script

$StartDate = (Get-Date).AddDays(-5)
$EndDate = Get-Date
$CreationEventTypes = "VmBeingCreatedEvent", "VmBeingDeployedEvent", "VmCloneEvent", "VmCreatedEvent", "VmDeployedEvent", "VmRegisteredEvent"
$DeletionEventTypes = "VmRemovedEvent"
$ModificationEventTypes = "CustomizationEvent", "MigrationEvent", "VmBeingHotMigratedEvent", "VmBeingMigratedEvent", "VmDateRolledBackEvent", "VmMacAssignedEvent", "VmMacChangedEvent", "VmMigratedEvent", "VmReconfiguredEvent", "VmReloadFromPathEvent", "VmRelocateSpecEvent", "VmRenamedEvent", "VmUpgradeCompleteEvent", "VmUpgradingEvent"
$PowerStatusEventTypes = "VmGuestRebootEvent", "VmGuestShutdownEvent", "VmGuestStandbyEvent", "VmPoweredOffEvent", "VmPoweredOnEvent", "VmPoweringOnWithCustomizedDVPortEvent", "VmResettingEvent", "VmResumingEvent", "VmStartingEvent", "VmStoppingEvent", "VmSuspendedEvent", "VmSuspendingEvent"

$AnyEvent = $CreationEventTypes + $DeletionEventTypes + $ModificationEventTypes + $PowerStatusEventTypes
Write-Host Querying events. This may need a while...
write-host
write-host
$VIEvents = Get-VIEvent -Start $StartDate -Finish $EndDate | Where-Object {$_.GetType().Name -in $AnyEvent}
$CreationActions = $VIEvents | Where-Object {$_.GetType().Name -in $CreationEventTypes} | Sort-Object CreatedTime | Select CreatedTime, Username, FullformattedMessage, @{Name="EventType";Expression={$_.GetType().Name}} | Format-Table -Autosize
$DeletionActions = $VIEvents | Where-Object {$_.GetType().Name  -in $DeletionEventTypes} | Sort-Object CreatedTime | Select CreatedTime, Username, FullformattedMessage, @{Name="EventType";Expression={$_.GetType().Name}} | Format-Table -Autosize
$ModificationActions = $VIEvents | Where-Object {$_.GetType().Name  -in $ModificationEventTypes} | Sort-Object CreatedTime | Select CreatedTime, Username, FullformattedMessage, @{Name="EventType";Expression={$_.GetType().Name}} | Format-Table -Autosize
$PowerActions = $VIEvents | Where-Object {$_.GetType().Name  -in $PowerStatusEventTypes} | Sort-Object CreatedTime | Select CreatedTime, Username, FullformattedMessage, @{Name="EventType";Expression={$_.GetType().Name}} | Format-Table -Autosize
if (($CreationActions | Measure-Object).Count -eq 0)
{
   Write-Host -ForegroundColor White "No VM creation action found since $StartDate"
   Write-Host
   Write-Host
}
else
{
   Write-Host -ForegroundColor White "VM creation actions found since $StartDate"
   $CreationActions
}
if (($DeletionActions | Measure-Object).Count -eq 0)
{
   Write-Host -ForegroundColor White "No VM deletion action found since $StartDate"
   Write-Host
   Write-Host
}
else
{
   Write-Host -ForegroundColor White "VM deletion actions found since $StartDate"
   $DeletionActions
}
if (($ModificationActions | Measure-Object).Count -eq 0)
{
   Write-Host -ForegroundColor White "No VM modification action found since $StartDate"
   Write-Host
   Write-Host
}
else
{
   Write-Host -ForegroundColor White "VM modification actions found since $StartDate"
   $ModificationActions
}
if (($PowerActions | Measure-Object).Count -eq 0)
{
   Write-Host -ForegroundColor White "No VM power action found since $StartDate"
   Write-Host
   Write-Host
}
else
{
   Write-Host -ForegroundColor White "VM power actions found since $StartDate"
   $PowerActions
}

4 Comments

  1. Johnny dit :

    excellent

  2. Johnny dit :

    Peut on modifier le script en lui donnant un focus sur une période entres deux dates comme par exemple, qui a touché aux VM, du 13/08/20xx au 15/08/20xx ? si oui comment le faire ?

    • Olivier Druard dit :

      C’est justement le but des deux varibles $StartDate et $EndDate détaillées avant le script.

  3. Thomas dit :

    Bonjour Olivier,

    J’espère que tu va bien et que l’équipe aussi !

    Merci pour tes petits tuto qui continuent à me servir =)

    Thomas

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *