PoshCode Logo PowerShell Code Repository

PowerCLI to upgrade guests tools, hardware and record to CSV

  1.  
  2. Function PowerOn-VM($vm){
  3.  
  4.         Start-VM -VM $vm -Confirm:$false -RunAsync | Out-Null
  5.        
  6.                 do {
  7.                         $vmview = get-VM $vm | Get-View
  8.                         $status = $vmview.Guest.ToolsStatus
  9.        
  10.                                 Write-Host $vm is starting! -ForegroundColor Yellow
  11.                                 sleep 5
  12.        
  13.                 }until(($status -match "toolsOld") -or ($status -match "toolsOk"))
  14.                
  15.                 if ($status -match "Ok"){
  16.                         $Startup = "Ok"}
  17.                 elseif($status -match "toolsOld"){
  18.                         $Startup = "ToolsOld"}
  19.                 else{
  20.                         $Startup = "Not Ready"}
  21.                
  22.                 return $Startup
  23.  
  24. }
  25.  
  26. Function PowerOff-VM($vm){
  27.                
  28.                 sleep 20
  29.                 Shutdown-VMGuest -VM $vm -Confirm:$false | Out-Null
  30.                                        
  31.                         do {
  32.                                 $vmview = Get-VM $vm | Get-View
  33.                                 $status = $vmview.Guest.ToolsStatus
  34.        
  35.                                         Write-Host $vm is stopping! -ForegroundColor Yellow
  36.                                         sleep 5
  37.        
  38.                         }until($status -match "toolsNotRunning")
  39.                         if ($status -match "toolsNotRunning"){
  40.                         $Shutdown = "Ok"}
  41.                         else{
  42.                         $Shutdown = "Not Ready"}
  43.                         return $Shutdown       
  44. }
  45.  
  46. Function Check-ToolsStatus($vm){
  47.  
  48.         $vmview = get-VM $vm | Get-View
  49.         $status = $vmview.Guest.ToolsStatus
  50.  
  51.                 if ($status -match "toolsOld"){
  52.                         $vmTools = "Old"}
  53.                 elseif($status -match "toolsNotRunning"){
  54.                         $vmTools = "Not Running"}
  55.                 else{
  56.                         $vmTools = "Ok"}
  57.                 return $vmTools
  58. }
  59.  
  60. Function Check-VMHardwareVersion($vm){
  61.         $vmView = get-VM $vm | Get-View
  62.         $vmVersion = $vmView.Config.Version
  63.         $v4 = "vmx-04"
  64.         $v7 = "vmx-07"
  65.        
  66.                 if ($vmVersion -eq $v4){
  67.                         $vmHardware = "Old"}
  68.                 elseif($vmVersion -eq $v7){
  69.                         $vmHardware = "Ok"}            
  70.                 else{Write-Host "Error!!" -ForegroundColor Red
  71.                         $vmHardware = "Error"}
  72.                
  73.                 return $vmHardware
  74. }
  75.  
  76. Function Upgrade-VMHardware($vm){
  77.  
  78.         $vmview = Get-VM $vm | Get-View
  79.         $vmVersion = $vmView.Config.Version
  80.         $v4 = "vmx-04"
  81.         $v7 = "vmx-07"
  82.  
  83.                 if ($vmVersion -eq $v4){
  84.                         Write-Host "Version 4 detected" -ForegroundColor Red
  85.                        
  86.                         # Update Hardware
  87.                         Write-Host "Upgrading Hardware on" $vm -ForegroundColor Yellow
  88.                         Get-View ($vmView.UpgradeVM_Task($v7)) | Out-Null
  89.         }      
  90. }
  91.  
  92. Function CreateBeforeList{
  93.  
  94. Write-Host "Creating a CSV File with VM info" -ForegroundColor Yellow
  95.  
  96. $MyCol = @()
  97.    ForEach ($vm in Get-Folder $Folder | Get-VM )
  98.    {
  99.         $vmview = get-VM $vm | Get-View
  100.    
  101.       $myObj = "" | Select Host, VMName, PowerState, IPAddress, MacAddress, Nics, VMToolsVersion, VMToolsStatus, VMToolsRunningStatus
  102.       $myObj.Host = $VM.Host.Name
  103.       $myObj.VMName = $VM.Name
  104.       $myObj.PowerState = $VM.PowerState
  105.           $myObj.IPAddress = [String]($vmview.Guest.Net| ForEach {$_.IpAddress})
  106.       $myObj.MacAddress = [String]($vmview.Guest.Net | ForEach {$_.MacAddress})
  107.           $myObj.Nics = $vmview.Guest.Net.Count
  108.           $myObj.VMToolsVersion = $vmview.Config.Tools.ToolsVersion
  109.           $myObj.VMToolsStatus = $vmview.Guest.ToolsStatus
  110.           $myObj.VMToolsRunningStatus = $vmview.Guest.ToolsRunningStatus
  111.          
  112.       $myCol += $myObj
  113.     }
  114.         $myCol | Export-Csv C:\beforeHWchange.csv -NoTypeInformation
  115. }
  116.  
  117. Function CreateAfterList{
  118.  
  119. Write-Host "Creating a CSV and an Excel File with VM info" -ForegroundColor Yellow
  120.  
  121. $xlCSV = 6
  122. $xlXLS = 56
  123. $csvfile = "C:\afterHWchange.csv"
  124. $xlsfile = "C:\afterHWchange.xls"
  125.  
  126. $Excel = New-Object -ComObject Excel.Application
  127. $Excel.visible = $True
  128. $Excel = $Excel.Workbooks.Add()
  129.  
  130. $Sheet = $Excel.Worksheets.Item(1)
  131. $Sheet.Cells.Item(1,1) = "VMName"
  132. $Sheet.Cells.Item(1,2) = "IPAddress"
  133. $Sheet.Cells.Item(1,3) = "Settings"
  134.  
  135. $intRow = 2
  136.  
  137. $WorkBook = $Sheet.UsedRange
  138. $WorkBook.Interior.ColorIndex = 19
  139. $WorkBook.Font.ColorIndex = 11
  140. $WorkBook.Font.Bold = $True
  141.  
  142.  
  143. $import = Import-Csv "C:\beforeHWchange.csv"
  144. $vms = Get-Folder $Folder | Get-VM
  145.  
  146. foreach($vm in $vms){
  147.         $vmview = $vm | Get-View
  148.  
  149.         foreach($item in $import){
  150.         $oldIp = $item.IPAddress
  151.         $newIP = $vm.Guest.IPAddress
  152.  
  153.  
  154.                 if($item.VMName -eq $vm){
  155.                         if($oldIp -eq $newIP){
  156.                                
  157.                                 $Sheet.Cells.Item($intRow, 1) = [String]$vmview.Name
  158.                                 $Sheet.Cells.Item($intRow, 2) = [String]$vm.Guest.IPAddress
  159.                                 $Sheet.Cells.Item($intRow, 3) = "Good"
  160.                                 $Sheet.Cells.Item($intRow, 3).Interior.ColorIndex = 4
  161.                                 }
  162.                                 else{
  163.                                 $Sheet.Cells.Item($intRow, 1) = [String]$vmview.Name
  164.                                 $Sheet.Cells.Item($intRow, 2) = [String]$vm.Guest.IPAddress
  165.                                 $Sheet.Cells.Item($intRow, 3) = "Wrong"
  166.                                 $Sheet.Cells.Item($intRow, 3).Interior.ColorIndex = 3
  167.                                
  168.                                 }
  169.                 }
  170.         }
  171.  
  172.  
  173. $intRow = $intRow + 1}
  174.  
  175. $WorkBook.EntireColumn.AutoFit()
  176.  
  177. sleep 5
  178.  
  179. $Sheet.SaveAs($xlsfile,$xlXLS)
  180. $Sheet.SaveAs($csvfile,$xlCSV)
  181.  
  182. }
  183.  
  184. Function CreateAfterListreboot{
  185.  
  186. Write-Host "Creating a CSV and an Excel File with VM info" -ForegroundColor Yellow
  187.  
  188. $xlCSV = 6
  189. $xlXLS = 56
  190. $csvfile = "C:\afterHWchangeRB.csv"
  191. $xlsfile = "C:\afterHWchangeRB.xls"
  192.  
  193. $Excel = New-Object -ComObject Excel.Application
  194. $Excel.visible = $True
  195. $Excel = $Excel.Workbooks.Add()
  196.  
  197. $Sheet = $Excel.Worksheets.Item(1)
  198. $Sheet.Cells.Item(1,1) = "VMName"
  199. $Sheet.Cells.Item(1,2) = "IPAddress"
  200. $Sheet.Cells.Item(1,3) = "Settings"
  201.  
  202. $intRow = 2
  203.  
  204. $WorkBook = $Sheet.UsedRange
  205. $WorkBook.Interior.ColorIndex = 19
  206. $WorkBook.Font.ColorIndex = 11
  207. $WorkBook.Font.Bold = $True
  208.  
  209.  
  210. $import = Import-Csv "C:\beforeHWchange.csv"
  211. $vms = Get-Folder $Folder | Get-VM
  212.  
  213. foreach($vm in $vms){
  214.         $vmview = $vm | Get-View
  215.  
  216.         foreach($item in $import){
  217.         $oldIp = $item.IPAddress
  218.         $newIP = $vm.Guest.IPAddress
  219.  
  220.  
  221.                 if($item.VMName -eq $vm){
  222.                         if($oldIp -eq $newIP){
  223.                                
  224.                                 $Sheet.Cells.Item($intRow, 1) = [String]$vmview.Name
  225.                                 $Sheet.Cells.Item($intRow, 2) = [String]$vm.Guest.IPAddress
  226.                                 $Sheet.Cells.Item($intRow, 3) = "Good"
  227.                                 $Sheet.Cells.Item($intRow, 3).Interior.ColorIndex = 4
  228.                                 }
  229.                                 else{
  230.                                 $Sheet.Cells.Item($intRow, 1) = [String]$vmview.Name
  231.                                 $Sheet.Cells.Item($intRow, 2) = [String]$vm.Guest.IPAddress
  232.                                 $Sheet.Cells.Item($intRow, 3) = "Wrong"
  233.                                 $Sheet.Cells.Item($intRow, 3).Interior.ColorIndex = 3
  234.                                
  235.                                 }
  236.                 }
  237.         }
  238.  
  239.  
  240. $intRow = $intRow + 1}
  241.  
  242. $WorkBook.EntireColumn.AutoFit()
  243.  
  244. sleep 5
  245.  
  246. $Sheet.SaveAs($xlsfile,$xlXLS)
  247. $Sheet.SaveAs($csvfile,$xlCSV)
  248.  
  249. }
  250.  
  251. $vCenter = "vCenterServer"
  252. $Folder = "FolderNAme"
  253. Connect-VIServer $vCenter
  254.  
  255. $vms = Get-Folder $Folder | Get-VM  | Get-View | Where-Object {-not $_.config.template -and $_.Config.Version -eq "vmx-04" } | Select Name
  256.  
  257. CreateBeforeList
  258.  
  259. foreach($item in $vms){
  260.                 $vm = $item.Name
  261.                 $vmHardware = Check-VMHardwareVersion $vm
  262.                 $vmToolsStatus = Check-ToolsStatus $vm
  263.                
  264.                         Write-Host "Hardware is old on:" $vm -ForegroundColor Red
  265.  
  266.                                         if($vmToolsStatus -eq "Old"){
  267.                                                         Write-Host "The VMware Tools are old on:" $vm -ForegroundColor Red
  268.                                                         Sleep 20
  269.                                                        
  270.                                                         Get-VMGuest $vm | Update-Tools
  271.                                                         Sleep 120
  272.                                                         Write-Host "VMware Tools are installed on:" $vm -ForegroundColor Cyan
  273.                                                                
  274.                                                                 $vmToolsStatus = Check-ToolsStatus $vm
  275.                                                        
  276.                                                                 if($vmToolsStatus -eq "Ok"){
  277.                                                                        
  278.                                                                         $PowerOffVM = PowerOff-VM $vm
  279.                                                                         if($PowerOffVM -eq "Ok"){
  280.                                                                                 Write-Host $vm "is down" -ForegroundColor Yellow
  281.                                                                                
  282.                                                                                 Upgrade-VMHardware $vm
  283.                                                                                 PowerOn-VM $vm
  284.                                                                                 Write-Host $vm "is up to date" -ForegroundColor Green
  285.                                                                         }
  286.                                                                 }
  287.                                        
  288.                                         }
  289.                                         else{
  290.                                                 $PowerOffVM = PowerOff-VM $vm
  291.                                                 if($PowerOffVM -eq "Ok"){
  292.                                                         Upgrade-VMHardware $vm
  293.                                                         PowerOn-VM $vm
  294.                                                         Write-Host $vm "is up to date" -ForegroundColor Green
  295.                                                        
  296.                                                 }      
  297.                                         }
  298. }
  299.  
  300. Sleep 40
  301.  
  302. CreateAfterList
  303.  
  304. Get-Folder $Folder | Get-VM | Restart-VMGuest -Confirm:$false
  305.  
  306. Sleep 300
  307.  
  308. CreateAfterListreboot
  309.  
  310. Disconnect-VIServer -Confirm:$false

Submit a correction or amendment below (
click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:


Remember me