If you work with SAN storage and fibre channel adapters it can be very useful to get an overview of all your HBAs (host bus adapters) on your servers. This script uses WMI to get HBA info like WWN, driver, version, model etc. from remote servers and then export it to a CSV file. You will then have a consolidated view of all your HBA devices with detailed information about them.
You will need to create the file servers.txt in the script directory and enter the names (one per line) of the servers you want to get the info from.
I have divided this script into three sections variables, functions and script main. I will now briefly explain how I created each section.
Variables
#VARIABLES $scriptpath = $MyInvocation.MyCommand.Path $dir = Split-Path $scriptpath #path to the directory in which the script is run. $servers = @(gc "$dir\servers.txt") #create servers.txt in the script directory and enter the names of servers you wish to query for HBA info. $CSV = "$dir\HBAs.csv" #results will be exported to a csv file with this path
$servers is an array of server names populated by running Get-Content on the file servers.txt. $CSV is the path of the CSV file which will be created at the end of the script run. Both objects $servers and $CSV are defined using the object $dir which always points to the directory which the script was started in. This is practical as it allows me to copy and move the script around without having to change any paths.
Functions
1. Function Get-HBAInfo
#FUNCTIONS function Get-HBAInfo { [CmdletBinding()] [OutputType([System.String])] param( [parameter(ValueFromPipeline = $true)]$server ) process { $WMI = Get-WmiObject -class MSFC_FCAdapterHBAAttributes -namespace "root\WMI" -computername $server $WMI | % { $HBA = "" | select "server","WWN","DriverName","DriverVersion","FirmwareVersion","Model","ModelDescription" $HBA.server = $server $HBA.WWN = (($_.NodeWWN) | % {"{0:x}" -f $_}) -join ":" $HBA.DriverName = $_.DriverName $HBA.DriverVersion = $_.DriverVersion $HBA.FirmwareVersion = $_.FirmwareVersion $HBA.Model = $_.Model $HBA.ModelDescription = $_.ModelDescription $HBA } } }
This function takes a single parameter $server and runs a WMI query on it to get the HBA information. For each HBA device found on the server A custom object called $HBA is created and returned. The function can take input from the pipeline which is practical as you can simply pass the server name to the function using another script or cmdlet if you want.
Script Main
#SCRIPT MAIN clear $HBAs = @($servers | Get-HBAInfo) $HBAs | Export-Csv $CSV -NoTypeInformation -Force
The script main is very simple consisting of only two lines. First I use the Get-HBAInfo function to get the HBA information from the given servers. Then, in the second line, the results are exported to CSV.
I have copied in the full script below. I hope you find it useful. Enjoy!!
################################################################################################ ##Script: Get-HBAInfo.ps1 ## ##Description: Gets information about HBAs on the given servers using WMI and exports it to #+ CSV. Remember to create the file servers.txt in the script directory and #+ enter the names (one per line) of the servers you want to get the info from. ##Created by: Noam Wajnman ##Creation Date: February 28, 2013 ##Updated: April 08, 2014 ################################################################################################ #FUNCTIONS function Get-HBAInfo { [CmdletBinding()] [OutputType([System.String])] param( [parameter(ValueFromPipeline = $true)]$server ) process { $WMI = Get-WmiObject -class MSFC_FCAdapterHBAAttributes -namespace "root\WMI" -computername $server $WMI | % { $HBA = "" | select "server","WWN","DriverName","DriverVersion","FirmwareVersion","Model","ModelDescription" $HBA.server = $server $HBA.WWN = (($_.NodeWWN) | % {"{0:x}" -f $_}) -join ":" $HBA.DriverName = $_.DriverName $HBA.DriverVersion = $_.DriverVersion $HBA.FirmwareVersion = $_.FirmwareVersion $HBA.Model = $_.Model $HBA.ModelDescription = $_.ModelDescription $HBA } } } #VARIABLES $scriptpath = $MyInvocation.MyCommand.Path $dir = Split-Path $scriptpath #path to the directory in which the script is run. $servers = @(gc "$dir\servers.txt") #create servers.txt in the script directory and enter the names of servers you wish to query for HBA info. $CSV = "$dir\HBAs.csv" #results will be exported to a csv file with this path #SCRIPT MAIN clear $HBAs = @($servers | Get-HBAInfo) $HBAs | Export-Csv $CSV -NoTypeInformation -Force