PowerCLI

This is a list of PowerCLI bits I have picked up along the way.  90% of these were found via Google, I apologize for not having credits for each. Most are simple one-liners that perform particular tasks.  It is typically easy to insert these bits into a larger scripts that loop through hosts, target specific VMs or just link them together to run multiple commands at once.

# Add PowerCLI Core snapin
If (!(Get-PSSnapin -name VMware.VimAutomation.Core -ErrorAction SilentlyContinue)) {
	Add-PSSnapin VMware.VimAutomation.Core}

# Add PowerCLI vCD snapin
If (!(Get-PSSnapin -name VMware.VimAutomation.Cloud -ErrorAction SilentlyContinue)) {
	Add-PSSnapin VMware.VimAutomation.Cloud}

# Add PowerCLI VDS snapin
If (!(Get-PSSnapin -name VMware.VimAutomation.VDS -ErrorAction SilentlyContinue)) {
	Add-PSSnapin VMware.VimAutomation.VDS}

# Connect to vCenter
Connect-VIServer vcenternameorip
# Disconnect from vCenter
Disconnect-VIServer vcenternameorip -Confirm:$False

# Connect to vCD
Connect-CIServer my.vcd.url
# Disconnect from vCD
Disconnect-CIServer my.vcd.url -Confirm:$False

# Connected VI Servers
$DefaultVIServers
# Number of Connected VI Servers
$DefaultVIServers.Count

# PowerCli Version
Get-PowerCLIVersion

# PowerCLI Configuration
Get-PowerCLIConfiguration

# VMHosts
# Change ESXi root password (or any other local user)
$VMHosts = Get-VMHost
ForEach ($VMHost in $VMHosts)
{
    $HostName = $VMHost.Name
    Connect-VIServer $HostName -User root -password P@ssw0rd
    Set-VMHostAccount -UserAccount root -password N3wPassword
    Disconnect-VIServer -Server $HostName -Confirm:$False
}

#Check Lockdown mode status
Get-VMHost | Select Name, @{Name="LockdownModeEnabled";Expression={($_).Extensiondata.Config.adminDisabled}} | ft -auto

#Disable Lockdown mode
Get-VMHost | %{($_ | get-view).ExitLockdownMode()}

#Enable Lockdown mode
Get-VMHost | %{($_ | get-view).EnterLockdownMode()}

# Start ESXi SSH Service
Get-VMHost | Foreach {Start-VMHostService -HostService ($_ | Get-VMHostService | Where { $_.Key -eq "TSM-SSH"} )}

# Stop ESXi SSH Service
Get-VMHost | Foreach {Stop-VMHostService -HostService ($_ | Get-VMHostService | Where { $_.Key -eq "TSM-SSH"} ) -Confirm:$false}

# View SSH Service state
Get-VMHost | Get-VMHostService | Where { $_.Key -eq "TSM-SSH" } | Select VMHost, Label, Policy, Running | ft -auto

#Enable SSH Server firewall exception
Get-VMHost | Get-VMHostFirewallException | Where {$_.Name -eq "SSH Server"} | Set-VMHostFirewallException -Enabled:$true

# Sets remote syslog server
Get-VMHost | Set-VMHostSysLogServer -SysLogServer "udp://yoursysogserver:514"

# Set Hostd logging level to info (default is verbose)
Get-VMHost | Get-AdvancedSetting -Name Config.HostAgent.log.level | Set-AdvancedSetting -Value "info" -Confirm:$false

# Set Vpxa logging level to info (default is verbose)(must be connected to VC)
Get-VMHost | Get-AdvancedSetting -Name Vpx.Vpxa.config.log.level | Set-AdvancedSetting -Value "info" -Confirm:$false

# Reset syslog service
$esxcli = Get-EsxCli -VMHost servername
$esxcli.system.syslog.reload()

# Sets ESXi syslog server firewall exception
Get-VMHost | Get-VMHostFirewallException |?{$_.Name -eq 'syslog'} | Set-VMHostFirewallException -Enabled:$true

# Backup ESXi Host Config
Get-VMHost MyESXiHost | Get-VMHostFirmware -BackupConfiguration -DestinationPath “F:\”

# Restore ESXi Host Config
Get-VMHost MyESXiHost | Set-VMHost -State Maintenance | Set-VMHostFirmware -Restore -SourcePath “F:\”

# Reset ESXi Host to defaults
Get-VMHost MyESXiHost | Set-VMHostFirmware -ResetToDefaults

# Gather Log Bundle from Host
Get-VMHost MyESXiHost | Get-Log -Bundle -DestinationPath “F:\”

# Gather Individual Logs
Get-VMHost MyESXiHost | Get-Log hostd | Select -ExpandProperty Entries | Out-File “F:\hostd.log”
Get-VMHost MyESXiHost | Get-Log vpxa | Select -ExpandProperty Entries | Out-File “F:\vpxa.log”

# Get the time on all ESXi hosts
Get-VMHost | Select Name,@{Name="Time";Expression={(get-view $_.ExtensionData.configManager.DateTimeSystem).QueryDateTime()}}

# Set the time on all ESXi hosts to the PowerCLI host's time
Get-VMHost | %{(Get-View $_.ExtensionData.configManager.DateTimeSystem).UpdateDateTime((Get-Date -format u)) }

# Rescan HBA Adapters
Foreach ($esx in Get-VMhost -Location ClusterName | sort Name) { $esx | Get-VMHostStorage -RescanAllHBA -rescanVMFS -refresh }

# Retrieve ntp servers
Get-VMHost | Select Name, @{N="NTPServer";E={$_ | Get-VMHostNtpServer}}, @{N="ServiceRunning";E={(Get-VmHostService -VMHost $_ | Where-Object {$_.key -eq "ntpd"}).Running}}

# Replace ntp servers on hosts
$oldntpservers = "192.168.0.1","192.168.0.2"
$newntpservers = "192.168.0.20","192.168.0.21"
Foreach($vmhost in Get-VMHost){
    #stop ntpd service
    $vmhost|Get-VMHostService |?{$_.key -eq "ntpd"}|Stop-VMHostService -Confirm:$false
    #remove ntpservers
    $vmhost|Remove-VMHostNtpServer -NtpServer $oldntpservers -Confirm:$false
    #add new ntpservers
    $vmhost|Add-VmHostNtpServer -NtpServer $newntpservers
    #start ntpd service
    $vmhost|Get-VMHostService |?{$_.key -eq "ntpd"}|Start-VMHostService
}

# Configure ntp service to start and stop with host
Get-VMHost | Get-VMHostService | ?{$_.key -eq "ntpd"} | Set-VMHostService -Policy "on" -confirm:$false

# Change DNS servers, domain name and search suffix
Get-VMHost | Get-VMHostNetwork | Set-VMHostNetwork -DnsAddress [DNS1 IP address],[DNS2 IP address] -Domain [Domain name] -SearchDomain [Search domain name]

# Enter Maintenance Mode
Get-VMHost | Set-VMHost -State Maintenance

#Add hosts to domain
Get-VMHost | Get-VMHostAuthentication | Set-VMHostAuthentication -Domain domain -User domainuser -Password password -JoinDomain -Confirm:$false

#Remove hosts from domain
Get-VMHost | Get-VMHostAuthentication | Set-VMHostAuthentication -LeaveDomain -Confirm:$false

#Check host domain status
Get-VMHost | Get-VMHostAuthentication | Select VMHost, DomainMembershipStatus, Domain | ft -auto

# Disconnect and Remove from VC
Get-VMHost | Set-VMHost-State Disconnected -Confirm:$false | Remove-VMHost -Confirm:$false

# Add into VC
Add-VMHost -Name $VMHost -Location $Location -Credential $cred -Force -Confirm:$false

# Join a cluster by moving an ESX host from one location to the cluster.
Move-Inventory -Item (Get-VMHost -Name esxHost) -Destination (Get-Cluster -Name clusterName)



# VM Stuff
# Get VM Information, Cluster, Host, Datastore
Get-VM | Select Name, @{N=”Cluster”;E={Get-Cluster -VM $_}},@{N=”ESX Host”;E={Get-VMHost -VM $_}},@{N=”Datastore”;E={Get-Datastore -VM $_}}

# Grab powered on Windows VMs in a particular folder
Get-Folder "projects" | Get-VM | Where-Object {$_.Guest.OSFullName -like "*Windows*" -and $_.PowerState -eq "PoweredOn"} | Sort Name

# Get VMs with CPU Reservations:
Get-VM | Get-VMResourceConfiguration | Where {$_.CpuReservationMhz -ne 0} | Select VM,CpuReservationMhz

# Get VMs with Memory Reservations:
Get-VM | Get-VMResourceConfiguration | Where {$_.MemReservationMB -ne 0} | Select VM,MemReservationMB

# Reset Memory resource limit to Unlimited
Get-VM | Get-VMResourceConfiguration | Where-Object {$_.MemLimitMB -ne "-1"} | Set-VMResourceConfiguration -MemLimitMB $null

# Reset CPU resource limit to Unlimited
Get-VM | Get-VMResourceConfiguration | Where-Object {$_.CpuLimitMhz -ne "-1"} | Set-VMResourceConfiguration -CPULimitMhz $null

# Reset both Memory and CPU resource limits to Unlimited (slow)
Get-VM | Get-VMResourceConfiguration | Set-VMResourceConfiguration -MemLimitMB $null -CpuLimitMhz $null

# Get Running VMs without VMware Tools Installed:
Get-View -ViewType “VirtualMachine” -Property Guest,name  -filter @{“Guest.ToolsStatus”=”toolsNotInstalled”;”Guest.GuestState”=”running”} | Select Name

# VMs Created Recently:
Get-VIEvent -maxsamples 10000 | Where {$_.Gettype().Name -eq “VmCreatedEvent”} | Select createdTime, UserName, FullFormattedMessage

# VMs Removed Recently:
Get-VIEvent -maxsamples 10000 | Where {$_.Gettype().Name -eq “VmRemovedEvent”} | Select createdTime, UserName, FullFormattedMessage

# List the last 10 VMs created, cloned or imported
Get-VIEvent -maxsamples 10000 |where {$_.Gettype().Name-eq "VmCreatedEvent" -or $_.Gettype().Name-eq "VmBeingClonedEvent" -or $_.Gettype().Name-eq "VmBeingDeployedEvent"} |Sort CreatedTime -Descending |Select CreatedTime, UserName,FullformattedMessage -First 10

# List last 5 VMs removed
Get-VIEvent -maxsamples 10000 | where {$_.Gettype().Name -eq "VmRemovedEvent"} | Sort CreatedTime -Descending | Select CreatedTime, UserName, FullformattedMessage -First 19

# List of the VM’s created over the last 14 days
Get-VIEvent -maxsamples 10000 -Start (Get-Date).AddDays(-14) | where {$_.Gettype().Name-eq "VmCreatedEvent" -or $_.Gettype().Name-eq "VmBeingClonedEvent" -or $_.Gettype().Name-eq "VmBeingDeployedEvent"} |Sort CreatedTime -Descending |Select CreatedTime, UserName,FullformattedMessage

# List of the VMs removed over the last 14 days
Get-VIEvent -maxsamples 10000 -Start (Get-Date).AddDays(-14) |where {$_.Gettype().Name-eq "VmRemovedEvent"} |Sort CreatedTime -Descending |Select CreatedTime, UserName,FullformattedMessage

# VMs with more than 2 vCPUs:
Get-VM | Where {$_.NumCPU -gt 2} | Select Name, NumCPU

# Check for invalid of inaccessible VMs:
Get-View -ViewType VirtualMachine | Where {-not $_.Config.Template} | Where{$_.Runtime.ConnectionState -eq “invalid” -or $_.Runtime.ConnectionState -eq “inaccessible”} | Select Name

# vMotion VM
Move-VM vm_name -Destination (Get-VMHost esxi_hostname)

# Storage vMotion VM
Get-VM vm_name | Move-VM -Datastore (Get-Datastore datastore_name)

# Create multiple new VMs from a template
$destCluster = Get-Cluster -Name Cluster01
$destDatastore = Get-DatastoreCluster -Name Cluster_Datastore
$destFolder = foldername
$sourceTemplate = Get-Template -Name W2K12_STD
1..6 | Foreach {New-VM -Name test0$_ -ResourcePool $destCluster -Location $destFolder -Template $sourceTemplate -Datastore $destDatastore -RunAsync}



# Storage
# Bulk storage moves
Get-VM -Datastore <SourceDatastore1> | Move-VM -Datastore <TargetDatastore> -runasync

# Delete all Snapshots with Certain Name:
Get-VM | Get-Snapshot | Where { $_.Name.Contains(“Consolidate”) } | Remove-Snapshot

# List all Snapshots:
Get-VM | Get-Snapshot | Select VM,Name,Description,Created

# List all RDM disks
Get-VM | Get-HardDisk -DiskType "RawPhysical","RawVirtual" | Select Parent,Name,DiskType,ScsiCanonicalName,DeviceName

# Search datastores for less than x free space
Get-Datastore | Where-Object {$_.freespaceMB -lt 100000}
Get-Datastore | Where-Object {$_.freespaceGB -lt 500 -and $_.Name -notlike "*localstorage*"}

# # of VMs per Datastore
Get-Datastore | Select Name, @{N="NumVM";E={@($_ | Get-VM).Count}} | Sort Name

# Mount datastore to psdrive
New-PSDrive -name "mounteddatastore" -Root \ -PSProvider VimDatastore -Datastore (Get-Datastore $datastore)

# Copy files to mounted datastore
Copy-Datastoreitem $patchLocation + $patch -Destination mounteddatastore:

# Delete file on mounted datastore
del mounteddatastore:$patch

# Unmount datastore from psdrive
Remove-PSDrive -name "mounteddatastore" -PSProvider VimDatastore

# Reload inaccessable VMs after a NFS/iSCSI outage
Get-View -ViewType VirtualMachine | ?{$_.Runtime.ConnectionState -eq "invalid" -or $_.Runtime.ConnectionState -eq "inaccessible"} | %{$_.reload()}

# Get Host HBA WWNs
Function Get-VMHostHbaWWN {
	param( $VMHost )
	$EsxHostHba = get-vmhosthba -VMHost $VMHost
	foreach( $hba in $EsxHostHba ){
		$WWN = "{0:x}" -f $hba.PortWorldWideName
		$outObj = New-Object PSObject
		$outObj | Add-Member -MemberType NoteProperty -Name Name -Value $VMHost
		$outObj | Add-Member -MemberType NoteProperty -Name WWNDec -Value $hba.PortWorldWideName
		$outObj | Add-Member -MemberType NoteProperty -Name WWNHex -Value $WWN
		$outObj | Add-Member -MemberType NoteProperty -Name Device -Value $hba.Device
		$outObj | Add-Member -MemberType NoteProperty -Name Type -Value $hba.Type
		$outObj | Add-Member -MemberType NoteProperty -Name Model -Value $hba.Model
		$outObj | Add-Member -MemberType NoteProperty -Name Status -Value $hba.Status
		$outObj
	}
}



# Networking
# Add Port Group “VLAN 500” with VLAN tag 500 to vSwitch1 on all hosts in a Cluster
Foreach ($esx in Get-VMHost -Location ClusterName) { $esx | Get-VirtualSwitch -Name vSwitch1 | New-VirtualPortGroup -Name "VLAN500" -VlanId 500 }

# Backup each vNetwork Distributed Switch not including the port groups
export-vdswitch $switch -Withoutportgroups -Description “Backup of $switch without port groups” -Destination “c:\vSphere\$switch.without_portgroups.$date.zip“

# Backup each vNetwork Distributed Switch including the port groups
export-vdswitch $switch -Description “Backup of $switch with port groups” -Destination “c:\vSphere\$switch.with_portgroups.$date.zip“

# Backup each port group individually
get-vdswitch $switch | Get-VDPortgroup | foreach { export-vdportgroup -vdportgroup $_ -Description “Backup of port group $($_.name)” -destination “c:\vSphere\$($_.name).portgroup.$date.zip“}

# Swing VMs from one port group to another
get-vm | get-networkadapter | where-object { $_.networkname -like "OldPortGroup" } | set-networkadapter -networkname "NewPortGroup" -Confirm:$false



# vCenter
# Gather vCenter Logons
Get-VIEvent -MaxSamples 100000 | ?{($_ -is [VMware.Vim.UserLoginSessionEvent]) -or ($_ -is [VMware.Vim.UserLogoutSessionEvent])} | %{
if ($_ -is [VMware.Vim.UserLoginSessionEvent]) {
  $strLoginOrLogout = "logged in"; $strSourceIP = $_.IpAddress
}
  else {
  $strLoginOrLogout = "logged out"; $strSourceIP = $null
  }
New-Object -TypeName PSObject -Property @{
UserName = $_.UserName
SourceIP = $strSourceIP
Time = $_.CreatedTime
Action = $strLoginOrLogout
}
} | Select UserName,SourceIP,Time,Action

One thought on “PowerCLI

Leave a Reply

Your email address will not be published. Required fields are marked *