Increasing virtual disks in VMware is pretty easy and straightforward.
Mapping them to the right disk in your computer is hard. They have not direct correlation seen in the Vmware ui.
So its pretty much guesswork after checking the available diskspace in computer and matching it with the diskspace seen in VMWare.
This script matches the disks in VMware with the one in computer.
Increases the space
Extends all the partitions in your computer which have free diskspace.You shouldn't have diskpace lying around unused anyway ;)
Things you need.
Account which has rights on the VMware server. Account with rights on your computer.
VMware assemblies or powercli installed.
Download link here
https://my.vmware.com/group/vmware/details?downloadGroup=VSP510-PCLI-510&productId=285
If your script fails with and exception for SoapInterceptor
find the dll VMware.VimAutomation.Logging.SoapInterceptor.dll in your powercli install directory.
and add this line to your script after placing it in the right location.
[System.Reflection.Assembly]::LoadFrom("c:\temp\VMware.VimAutomation.Logging.SoapInterceptor.dll")
############# Variable declaration and initialization##################################################
$ComputerName = "Put your VMware computername here"
$username = "domain\username"
$password = ConvertTo-SecureString -AsPlainText -Force "password"
$Credentials = New-Object System.Management.Automation.PSCredential ($username, $password)
$LocalDriveObjects = @()
$capacityIncrease = 2
$Volume = "D:"
############################################Assemblies#############################################################
add-pssnapin VMware.VimAutomation.Core
add-pssnapin VMware.VimAutomation.Vds
##########################################################################################################
Function CreateEventLog()
{
$ApplicationEventLogSources = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\Application"
if(!(($ApplicationEventLogSources | Select-Object "PSChildName") -match "DiskIncreaseScript"))
{
New-EventLog -LogName Application -Source DiskIncreaseScript -ComputerName "localhost"
}
}
Function WriteEvent($message)
{
Write-EventLog -logname Application -computername "localhost" -Source DiskIncreaseScript -Eventid 65503 -Message $message
}
Function Increase-Disk($HardDisk)
{
$CurrentCapacity = $HardDisk.CapacityGB
$Capacity = $CurrentCapacity + $capacityIncrease
WriteEvent "Current capacity on $Computername : $CurrentCapacity. This will be increased to $Capacity"
Set-HardDisk -HardDisk $HardDisk -CapacityGB $Capacity -GuestCredential $Credentials -Confirm:$false
}
Function Increase-volume($Computer)
{
WriteEvent "Increasing volumes on $Computer"
Invoke-Command -ComputerName $Computer -scriptblock { 'list disk' | diskpart | ? {
$_ -match 'disk (\d+)\s+online\s+\d+ .?b\s+\d+ [gm]b'
} | % {
$disk = $matches[1]
"select disk $disk", "list partition" | diskpart | ? {
$_ -match 'partition (\d+)'
} | % { $matches[1] } | % {
"select disk $disk", "select partition $_", "extend" | diskpart | Out-Null
}
}
}
}
Function Get-LocalDisk($Computer)
{
$PDiskDrives = Get-WmiObject -Class Win32_DiskDrive -ComputerName $Computer
foreach($PdiskDrive in $PDiskDrives)
{
$partitionquery = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='$($PdiskDrive.DeviceID)'} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
$Partitions = Get-WmiObject -Query $partitionquery -ComputerName $Computer
#$Partitions
foreach($Partition in $Partitions)
{
$Logicaldrivesquery = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} WHERE AssocClass = Win32_LogicalDiskToPartition"
$LogicalDrives = Get-WmiObject -Query $Logicaldrivesquery -ComputerName $Computer
foreach($LogicalDrive in $LogicalDrives)
{
$obj = New-Object -Type PSCustomObject -Property @{
Disk = $PdiskDrive.DeviceID
DiskSize = $PdiskDrive.Size
DiskModel = $PdiskDrive.Model
Partition = $partition.Name
RawSize = $partition.Size
DriveLetter = $LogicalDrive.DeviceID
VolumeName = $LogicalDrive.VolumeName
Size = $LogicalDrive.Size
FreeSpace = $LogicalDrive.FreeSpace
SerialNumber = $PdiskDrive.SerialNumber
}
$LocalDriveObjects = $LocalDriveObjects + $obj
}
}
}
return $LocalDriveObjects
}
##################### Main Script######################################################
Connect-VIServer "VcenterServerName" -Credential $Credentials
$LocalDisks = Get-LocalDisk $Computername
$vmHardDisks = Get-VM -Name $ComputerName | Get-HardDisk
$vmDatacenterView = Get-VM -Name $ComputerName | Get-Datacenter | Get-View
$virtualDiskManager = Get-View -Id VirtualDiskManager-virtualDiskManager
CreateEventLog
foreach($DObject in $LocalDisks)
{
if($DObject.DriveLetter -eq $Volume)
{
WriteEvent "Checking driveletter $($DObject.Driveletter) on $ComputerName"
foreach($vmHardDisk in $vmHardDisks)
{
$vmHardDiskUuid = $virtualDiskManager.queryvirtualdiskuuid($vmHardDisk.Filename, $vmDatacenterView.MoRef) | foreach {$_.replace(' ','').replace('-','')}
if($DObject.SerialNumber -eq $vmHardDiskUuid)
{
WriteEvent "Found a match $vmHardDiskUuid $($DObject.SerialNumber) $($vmHardDisk.Name) on $Computername"
WriteEvent "Disk Object: $DObject"
Increase-Disk $vmHardDisk
Start-Sleep -Seconds 10
}
}
}
}
Start-Sleep -Seconds 120
Increase-volume $Computername