PowerCLI Script to get ESXi Network/Storage Firmware and Driver Version

For a healthy vSphere virtualization infrastructure and to receive support from VMware it is important to verify that IO devices are listed in VMwares Compatibility Guide/Hardware Compatibility List (HCL) with their correct driver and firmware version. Gathering firmware details and comparing them to the HCL is very time-consuming. I made a small script that automatically gathers the following information:

  • IO Devices (NICs, HBAs and RAID Controllers)
  • Driver Version
  • Firmware Version
  • Official HCL Link

Download: io-devices-report.ps1 (Hosted at GitHub)


  1. Get PowerCLI 6.3 R1 or later
  2. Change the device scope (Line 13) to the desired value.

    $device = Get-VMHost esx01.virten.lab - Check a single Host
    $device = Get-Cluster NUCluster | Get-VMHost - Checks all hosts in a cluster
    $device = Get-VMHost - Checks all hosts in the vCenter
  3. Connect to a vCenter Server
    PS> Connect-VIServer vc.virten.lab
  4. Optional: Change the output format (Line 91-108). CSV and HTML output is active by default.
  5. Run the script
  6. Verify the output with the provided links.

Additional Information

  • The runtime is about 20-40 seconds per host.
  • The script downloads my JSON-based IOHCL (1.4 MB).
  • The "Supported" attribute only states that is device has been found in the HCL. You still have to check ESXi version and Firmware/Driver version.
  • The script uses Get-EsxCli -V2 which requires at least PowerCLI 6.3 R1
  • QLogic and Emulex firmware can only be identified with SSH as explained here. If you know a workaround, please comment.
  • If you found any issues, feel free to comment and I will try to provide a fix.

Example Output

Leave a comment ?


  1. Thank you, first of all.
    I have been trying to get QLogic/Emulex HBA firmware versions. It seems this information cannot be retrieved. Only through SSH.
    Your script doesn't retrieve this information either.
    Any idea?

  2. Having trouble with the script on UCS blades. Script runs and the only thing in the html or csv file is "" . Works great on all my Dell servers.

  3. The various device IDs in the JSON file are zero padded. Device lookup will fail for some devices because you don't zero pad in the conversions on lines 34-37.

    Something like: $Info.vid = [String]::Format("{0:x4}", $device.VendorId)

    • Thank you. You are totally right. I've added it to the script.

      • Also need to move the "$esxcli =" at line 49 outside the "if" at line 47. Otherwise $esxcli is potentially NULL in the "elseif" branch in lines 80 and 82.

        • I've also found that I have a MegaRAID controller that has a driver named "lsi_mr3" but the VIB has lsi-mr3 in the name and thus no VIB is found. Thus $driverVib at line 86 is from the previous iteration of the loop and not blank as expected.

          • I probably should be posting these using GitHub Issues. Turns out I'm not the brightest bulb in the box.

  4. Hi,
    I have a issue when the script try to go out from intranet for this line
    $hcl = Invoke-WebRequest -Uri http://www.virten.net/repo/vmware-iohcl.json | ConvertFrom-Json

    How can i recreate localy and what should i put in the script (to replace Invoke-WebRequest -Uri) ?


  5. Worked like a charm. Thank you

Leave a Comment

NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

This site uses Akismet to reduce spam. Learn how your comment data is processed.