Src/Private/Get-ESXiBootDevice.ps1

function Get-ESXiBootDevice {
    <#
.NOTES
===========================================================================
    Created by: William Lam
    Organization: VMware
    Blog: www.virtuallyghetto.com
    Twitter: @lamw
===========================================================================
.DESCRIPTION
    This function identifies how an ESXi host was booted up along with its boot
    device (if applicable). This supports both local installation to Auto Deploy as
    well as Boot from SAN.
.PARAMETER VMHostname
    The name of an individual ESXi host managed by vCenter Server
.EXAMPLE
    Get-ESXiBootDevice
.EXAMPLE
    Get-ESXiBootDevice -VMHost esxi-01
#>

    param(
        [Parameter(Mandatory = $false)][PSObject]$VMHost
    )

    $results = @()
    $esxcli = Get-EsxCli -V2 -VMHost $VMHost
    $bootDetails = $esxcli.system.boot.device.get.Invoke()

    # Check to see if ESXi booted over the network
    $networkBoot = $false
    if ($bootDetails.BootNIC) {
        $networkBoot = $true
        $bootDevice = $bootDetails.BootNIC
    } elseif ($bootDetails.StatelessBootNIC) {
        $networkBoot = $true
        $bootDevice = $bootDetails.StatelessBootNIC
    }

    # If ESXi booted over network, check to see if deployment
    # is Stateless, Stateless w/Caching or Stateful
    if ($networkBoot) {
        $option = $esxcli.system.settings.advanced.list.CreateArgs()
        $option.option = "/UserVars/ImageCachedSystem"
        try {
            $optionValue = $esxcli.system.settings.advanced.list.Invoke($option)
        } catch {
            $bootType = "Stateless"
        }
        $bootType = $optionValue.StringValue
    }

    # Loop through all storage devices to identify boot device
    $devices = $esxcli.storage.core.device.list.Invoke()
    $foundBootDevice = $false
    foreach ($device in $devices) {
        if ($device.IsBootDevice -eq $true) {
            $foundBootDevice = $true

            if ($device.IsLocal -eq $true -and $networkBoot -and $bootType -ne "Stateful") {
                $bootType = "Stateless Caching"
            } elseif ($device.IsLocal -eq $true -and $networkBoot -eq $false) {
                $bootType = "Local"
            } elseif ($device.IsLocal -eq $false -and $networkBoot -eq $false) {
                $bootType = "Remote"
            }

            $bootDevice = $device.Device
            $bootModel = $device.Model
            $bootVendor = $device.Vendor
            $bootSize = $device.Size
            $bootIsSAS = $TextInfo.ToTitleCase($device.IsSAS)
            $bootIsSSD = $TextInfo.ToTitleCase($device.IsSSD)
            $bootIsUSB = $TextInfo.ToTitleCase($device.IsUSB)
        }
    }

    # Pure Stateless (e.g. No USB or Disk for boot)
    if ($networkBoot -and $foundBootDevice -eq $false) {
        $bootModel = "N/A"
        $bootVendor = "N/A"
        $bootSize = "N/A"
        $bootIsSAS = "N/A"
        $bootIsSSD = "N/A"
        $bootIsUSB = "N/A"
    }

    $tmp = [PSCustomObject]@{
        Host = $($VMHost.ExtensionData.Name);
        Device = $bootDevice;
        BootType = $bootType;
        Vendor = $bootVendor;
        Model = $bootModel;
        SizeMB = $bootSize;
        IsSAS = $bootIsSAS;
        IsSSD = $bootIsSSD;
        IsUSB = $bootIsUSB;
    }
    $results += $tmp
    $results
}