L'objectif de ce script est de lister les modifications faites sur une VM
<#
.SYNOPSIS Returns configuration changes for a VM
.DESCRIPTION The function will return the list of configuration changes
for a given Virtual Machine
.NOTES Author: William Lam
.NOTES Site: www.williamlam.com
.NOTES Comment: Modified example from Lucd's blog post http://www.lucd.info/2009/12/18/events-part-3-auditing-vm-device-changes/
.NOTES Modification : Antoine Jovelin - Add Functions : verifPowerLI / vcenter-connect / vcenter-disconnect
.EXAMPLE
PS> Get-VMConfigChanges -vm $VM
.EXAMPLE
PS> Get-VMConfigChanges -vm $VM -Hours 8
#>
cls
# Declaration des fonctions
$herestring = @"
***** L'INSTALLATION A ECHOUEE *****
POUR INSTALLER POWERCLI :
1- RECUPERER LE MODULE DEPUIS CE LIEN : "https://developer.vmware.com/web/tool/vmware-powercli"
2- COPIER LE CONTENU DE L'ARCHIVE DANS "C:\Users\NOM_DU_USER\Documents\WindowsPowerShell\Modules"
3- RELANCER LE SCRIPT
"@
function verifPowerLI {
if($MyModules.name -match "VMware.PowerCLI"){
Write-Host "Le module PowerCLI est installé. Le script va continuer" -ForegroundColor Green
}else{
Write-Host "Le module PowerCLI n'est PAS installé. Le script ne pourra pas continuer" -ForegroundColor Yellow
do{
$reponse = Read-Host " Installer le module VMware.PowerCLI ? [oui/non] "
Switch ($reponse){
oui{
Install-Module -name vmware.powercli -Scope CurrentUser -Confirm:$false -Force
if($MyModules -notcontains "VMware.PowerCLI"){
Write-Host $herestring -ForegroundColor red
sleep 3
Write-Host " Fin du script dans quelques secondes" -ForegroundColor yellow
1..5 | Sort-Object -Descending | %{Start-Sleep -Seconds 1;Write-Host " $_ " -ForegroundColor yellow}
echo " "
exit
}
}
non{
Write-Host " Fin du script dans quelques secondes" -ForegroundColor yellow
1..5 | Sort-Object -Descending | %{Start-Sleep -Seconds 1;Write-Host " $_ " -ForegroundColor yellow}
echo " "
exit
}
}
}while(($reponse -ne "oui") -and ($reponse -ne "non"))
}
}
function vcenter-connect{
$VC = Read-Host -Prompt " Entrer le nom de vCenter "
$cred = Get-Credential
Write-Host;
Write-Host -ForegroundColor cyan "Connexion à vCenter. Merci de patienter..."
Connect-VIServer $VC -Credential $cred
Write-Host;
}
function vcenter-disconnect{
Write-Host;
Write-Host -ForegroundColor cyan "Déconnexion de vCenter..."
Disconnect-viserver -Server $Global:DefaultVIServer -Confirm:$false -Force
Write-Host;
}
Function Get-VMConfigChanges {
param($vm, $Hours=8)
# Modified code from http://powershell.com/cs/blogs/tips/archive/2012/11/28/removing-empty-object-properties.aspx
Function prettyPrintEventObject($vmChangeSpec,$task) {
$hashtable = $vmChangeSpec |
Get-Member -MemberType *Property |
Select-Object -ExpandProperty Name |
Sort-Object |
ForEach-Object -Begin {
[System.Collections.Specialized.OrderedDictionary]$rv=@{}
} -process {
if ($vmChangeSpec.$_ -ne $null) {
$rv.$_ = $vmChangeSpec.$_
}
} -end {$rv}
# Add in additional info to the return object (Thanks to Luc's Code)
$hashtable.Add('VMName',$task.EntityName)
$hashtable.Add('Start', $task.StartTime)
$hashtable.Add('End', $task.CompleteTime)
$hashtable.Add('State', $task.State)
$hashtable.Add('User', $task.Reason.UserName)
$hashtable.Add('ChainID', $task.EventChainId)
# Device Change
$vmChangeSpec.DeviceChange | % {
if($_.Device -ne $null) {
$hashtable.Add('Device', $_.Device.GetType().Name)
$hashtable.Add('Operation', $_.Operation)
}
}
$newVMChangeSpec = New-Object PSObject
$newVMChangeSpec | Add-Member ($hashtable) -ErrorAction SilentlyContinue
return $newVMChangeSpec
}
# Modified code from Luc Dekens http://www.lucd.info/2009/12/18/events-part-3-auditing-vm-device-changes/
$tasknumber = 999 # Windowsize for task collector
$eventnumber = 100 # Windowsize for event collector
$report = @()
$taskMgr = Get-View TaskManager
$eventMgr = Get-View eventManager
$tFilter = New-Object VMware.Vim.TaskFilterSpec
$tFilter.Time = New-Object VMware.Vim.TaskFilterSpecByTime
$tFilter.Time.beginTime = (Get-Date).AddHours(-$Hours)
$tFilter.Time.timeType = "startedTime"
$tFilter.Entity = New-Object VMware.Vim.TaskFilterSpecByEntity
$tFilter.Entity.Entity = $vm.ExtensionData.MoRef
$tFilter.Entity.Recursion = New-Object VMware.Vim.TaskFilterSpecRecursionOption
$tFilter.Entity.Recursion = "self"
$tCollector = Get-View ($taskMgr.CreateCollectorForTasks($tFilter))
$dummy = $tCollector.RewindCollector
$tasks = $tCollector.ReadNextTasks($tasknumber)
while($tasks){
$tasks | where {$_.Name -eq "ReconfigVM_Task"} | % {
$task = $_
$eFilter = New-Object VMware.Vim.EventFilterSpec
$eFilter.eventChainId = $task.EventChainId
$eCollector = Get-View ($eventMgr.CreateCollectorForEvents($eFilter))
$events = $eCollector.ReadNextEvents($eventnumber)
while($events){
$events | % {
$event = $_
switch($event.GetType().Name){
"VmReconfiguredEvent" {
$event.ConfigSpec | % {
$report += prettyPrintEventObject $_ $task
}
}
Default {}
}
}
$events = $eCollector.ReadNextEvents($eventnumber)
}
$ecollection = $eCollector.ReadNextEvents($eventnumber)
# By default 32 event collectors are allowed. Destroy this event collector.
$eCollector.DestroyCollector()
}
$tasks = $tCollector.ReadNextTasks($tasknumber)
}
# By default 32 task collectors are allowed. Destroy this task collector.
$tCollector.DestroyCollector()
$report
}
# Debut du script
vcenter-connect
Write-Host;
Write-Host " Vérification des modules nécessaires " -ForegroundColor Cyan
1..3 | Sort-Object -Descending | %{Start-Sleep -Seconds 1}
$MyModules = Get-Module -ListAvailable | select name
Write-Host;
verifPowerLI
Write-Host;
Write-Host -fore yellow "---- Lister les modifications faites sur une VM ----"
Write-Host;
$nomvm = Read-Host -Prompt " Entrer le nom complet d'une VM "
$time = Read-Host -Prompt " Indiquer le Nb d'heures depuis lesquelles la vérification doit etre faite "
Write-Host;
$vm = Get-VM -name $nomvm
Get-VMConfigChanges -vm $vm -Hours $time
Write-Host;
# Fin du script et deconnexion
Write-Host;
vcenter-disconnect