Share via


List all the VMs hosted on a specific SAN array

 Hey everyone,

While preparing for my TechReady session, I reached out to a fellow dev on the team to help me craft a script to list all the VMs hosts on a specific SAN array. This is what he came back with. Thanks Erwien!

Enjoy

($array = Get-SCStorageArray | where {$_.Name -eq "FAS2040-SCVMM"}) | fl Name, TotalCapacity, IsCloneCapable, IsSnapshotCapable, IsSanTransferCapable, StoragePools
($pools = $array.StoragePools | where {$_.IsManaged -eq $True}) | fl Name, TotalManagedSpace, Classification, StorageLogicalUnits

$luns = @()
foreach ($pool in $pools) {
    $assignedLuns = $pool.StorageLogicalUnits | where {$_.IsAssigned -eq $True -and $_.HostDisks.Count -ne 0}
    $luns += $assignedLuns
}

$vmHosts = @()
$disks = @()
foreach($lun in $luns) {
    $vmHost = $lun.HostDisks[0].VMHost
    if ($vmHosts -notcontains $vmHost) {
        $vmHosts += $vmHost
    }
   
    foreach($disk in $lun.HostDisks) {
      if ($disks -notcontains $disk) {
          $disks += $disk
      }
    }
}

$vms = @()

foreach($vmHost in $vmHosts) {
 if($vmHost -ne $null) {
     $vms += Get-VM -VMHost $vmHost
 }
}
$vmWithArray = @()
foreach($vm in $vms) {
    foreach($passthroughDisk in $vm.PassThroughDisks) {
        if ($disks -contains $passthroughDisk) {
            $vmWithArray += $vm
        }
    }
   
    foreach($vdd in $vm.VirtualDiskDrives | where {$_.IsVHD}) {
        $vhd = $vdd.VirtualHardDisk
       
        if ($vhd.HostVolume -ne $null -and $vhd.HostVolume.StorageDisk -ne $null) {
            if (($disks -contains $vhd.HostVolume.StorageDisk) -and
                ($vmWithArray -notcontains $vm)) {
                $vmWithArray += $vm
            }
        }
    }
}
$vmWithArray | fl Name, VMHost