**Update May 07, 2012 – Use the new script here: Updated: Finding WWNs for HBAs in ESXi hosts, now with Get-VMHostHba

When building a new cluster, your storage team (or you) may need to add several hosts into the shared storage zone. It’s a pain to go to each host, configuration, storage adapters, then copy out the WWN.

With this script, you can supply a vCenter server and Cluster/Folder/Datacenter (any logical container) and it will list all the WWNs for Fibre Channel devices. But what if you don’t have vCenter stood up yet? No problem, you can also supply a list of ESX/ESXi hosts to scan.

Shawn & I built this because we have 20 hosts we need the WWNs from to provide to our storage team, and vCenter isn’t alive yet.

Our script:

#lets get our cli args
param([string]$vc = "vc", [string]$container = "container", [string[]]$esx_hosts = "esx_hosts")
 
#add the snapin, just in case
Add-PSSnapin VMware.VimAutomation.Core
 
#usage info
function usage()
	{
	Write-host -foregroundcolor green `n`t"This script is used to retreive WWNs for all hosts provided."
	Write-host -foregroundcolor green `n`t"You can either specify -esx_hosts as an array:"
	write-host -foregroundcolor green `n`t`t"Get-WWN -esx_hosts (`"host1`",`"host2`",`"host3`")"
	Write-host -foregroundcolor green `n`t"or specify -vc and -container, where container is a host name, cluster, folder, datacenter, etc:"
	write-host -foregroundcolor green `n`t`t"Get-WWN -vc vcenterserver -container cluster1" `n
    write-host -foregroundcolor green `t"You can use either -esx_hosts or -vc and -container, not a combination of them." `n
	}
 
#get the WWNs
function GetWWN()
	{
    if ($esx -eq 1)
        #do this only if connecting directly to ESX hosts
        {
        $esx_host_creds = $host.ui.PromptForCredential("ESX/ESXi Credentials Required", "Please enter credentials to log into the ESX/ESXi host.", "", "")
        }
 
    if ($vcenter -eq 1)
        #do this if connecting to vCenter to populate esx_hosts
        {
        $vc_creds = $host.ui.PromptForCredential("vCenter Credentials Required", "Please enter credentials to log into vCenter.", "", "")
        connect-viserver $vc -credential $vc_creds > $NULL 2>&1
        $esx_hosts = get-vmhost -location $container | sort name
        }
 
    foreach ($esx_host in $esx_hosts)
		{
        if ($esx -eq 1)
            #do this only if connecting directly to ESX hosts
            {
            connect-viserver $esx_host -credential $esx_host_creds > $NULL 2>&1
            }
		Write-Host `n
		Write-Host -foregroundcolor green "Server: " $esx_host
		$hbas = Get-View (Get-View (Get-VMHost -Name $esx_host).ID).ConfigManager.StorageSystem
		foreach ($hba in $hbas.StorageDeviceInfo.HostBusAdapter)
			{
			if ($hba.gettype().name -eq "HostFibreChannelHba")
				{
				$wwn = "{0:x}" -f $hba.PortWorldWideName
				Write-Host -foregroundcolor green `t $wwn
				}
			}
        if ($esx -eq 1)
            #disconnect from the current ESX host before going to the next one
            {
            disconnect-viserver -confirm:$false
            }
		}
    write-host `n
 
    if ($vcenter -eq 1)
        #disconnect from vcenter
        {
        disconnect-viserver -confirm:$false
        }
	}
 
#check to make sure we have all the args we need
if (($esx_hosts -eq "esx_hosts") -and (($vc -eq "vc") -or ($container -eq "container")))
    #if esx_hosts, vc, or container is blank
	{
	usage
    break
	}
 
elseif (($esx_hosts -ne "esx_hosts") -and (($vc -ne "vc") -or ($container -ne "container")))
    #if esx_hosts and vc or container is used
	{
	usage
    break
	}
 
elseif (($esx_hosts -ne "esx_hosts") -and (($vc -eq "vc") -or ($container -eq "container")))
    #if only esx_hosts is used, set our esx variable to 1
	{
    $esx = 1
    GetWWN
    }
 
elseif (($esx_hosts -eq "esx_hosts") -and (($vc -ne "vc") -and ($container -ne "container")))
    #if vc and container are used,
	{
    $vcenter = 1
	GetWWN
	}
 
#garbage collection, just in case...
$esx_host_creds = $null
$vc_creds = $null
$esx_hosts = $null
$vc = $null
$container = $null
$hba = $null
$hbas = $null
$wwn = $null
$esx = $null
$vcenter = $null

The usage is pretty simple, and the switches are self explanatory:
Get-WWN.ps1 -esx_hosts ("Host1","Host2","Host3")

Get-WWN.ps1 -vc drtapw0015001 -container drtcrl0011102

Main thing is you have to use one OR the other (ESX hosts OR vCenter info), you don’t need both, so why would you try to confuse this script with it.

Also, when it prompts for credentials, I chose to use the $host.ui.PromptForCredential vs Get-Credential because $host.ui.PromptForCredential allows me to specify a window title and caption to differentiate between the vCenter login and Host login.

$host.ui.PromptForCredential("window title", "text", "username", "password")

For the third arg, you could use something like “$env:userdomain\$env:username” and it’ll populate with your current domain\user info, but I left it blank, same with password.