Public/Enable-ToolsAutoUpgrade.ps1

Function Enable-ToolsAutoUpgrade {

    <#
    .DESCRIPTION
    Filter out 2003 servers and servers that don't have Vmware Tools installed.
 
    All remaining servers will have their tools set to upgrade automatically.
 
    .PARAMETER Unmanaged
    Specifies VM's without tools installed that should have AutoUpgrade enabled.
 
    .EXAMPLE
    Enable-ToolsAutoUpgrade
 
    .EXAMPLE
    Include VM's Without Guest Tools Installed
 
    Enable-ToolsAutoUpgrade -Unmanaged
 
    .NOTES
    Requires the VMware.PowerCLI Module
 
    .Link
    https://github.com/TheTaylorLee/AdminToolbox
    #>


    [CmdletBinding(SupportsShouldProcess)]
    Param (
        [Parameter(Mandatory = $false)][switch]$Unmanaged
    )

    #Set Error Action to ignore error for Null value VM's
    $ErrorActionPreference = 'SilentlyContinue'

    #Disclaimer
    Write-Host "Servers with a null value for UpgradeAtPowercycle Will be skipped." -ForegroundColor Yellow
    Write-Host "2003 Servers will be Skipped for Compatibility issues" -ForegroundColor Yellow
    Write-Host " "

    #Filter Out 2003 Servers
    $No2003VMs = Get-VM | Where-Object { $_.Guest -notlike '*2003*' }

    if ($Unmanaged) {
        #Filter for Tools that have Auto Tool upgrade set to Manual
        $ManualUpdateVMs = Get-VM $No2003VMs.name |
        Get-View |
        Where-Object { $_.Config.Tools.ToolsUpgradePolicy -like "manual" } |
        Select-Object name, @{N = 'ToolsUpgradePolicy'; E = { $_.Config.Tools.ToolsUpgradePolicy } }

        #Set Tools to upgrade at Power Cycle
        Foreach ($VM in ($ManualUpdateVMs)) {
            Write-Host "Configuring UpgradeAtPowerCycle on: " -ForegroundColor Yellow -NoNewline
            Write-Host $VM.name -ForegroundColor Cyan
            $vmConfigSpec = New-Object VMware.Vim.VirtualMachineConfigSpec
            $vmConfigSpec.Tools = New-Object VMware.Vim.ToolsConfigInfo
            $vmConfigSpec.Tools.ToolsUpgradePolicy = "UpgradeAtPowerCycle"
            $VMConfig.ReconfigVM($vmConfigSpec)
        }
    }

    else {
        #Get VM's that have tools installed
        $VMsForAutoUpgrade = Get-VM $No2003VMs |
        ForEach-Object { Get-View $_.id } |
        Where-Object { $_.Guest.ToolsVersionStatus -notlike "guestToolsNotInstalled" -or $_.Guest.ToolsVersionStatus -notlike "guestToolsUnmanaged" } |
        Select-Object name, @{Name = 'ToolsVersion'; Expression = { $_.config.tools.toolsversion } }, @{Name = 'ToolStatus'; Expression = { $_.Guest.ToolsVersionStatus } }

        #Filter for Tools that have Auto Tool upgrade set to Manual
        $ManualUpdateVMs = Get-VM $VMsForAutoUpgrade.name |
        Get-View |
        Where-Object { $_.Config.Tools.ToolsUpgradePolicy -like "manual" } |
        Select-Object name, @{N = 'ToolsUpgradePolicy'; E = { $_.Config.Tools.ToolsUpgradePolicy } }

        #Set Tools to upgrade at Power Cycle
        Foreach ($VM in ($ManualUpdateVMs)) {
            Write-Host "Configuring UpgradeAtPowerCycle on: " -ForegroundColor Yellow -NoNewline
            Write-Host $VM.name -ForegroundColor Cyan
            $vmConfigSpec = New-Object VMware.Vim.VirtualMachineConfigSpec
            $vmConfigSpec.Tools = New-Object VMware.Vim.ToolsConfigInfo
            $vmConfigSpec.Tools.ToolsUpgradePolicy = "UpgradeAtPowerCycle"
            $VMConfig.ReconfigVM($vmConfigSpec)
        }
    }
}