I am on the CTP for the VMWare Powershell Toolkit, and although I am unable to release any Information. I thought it would be a good idea to post some Powershell VMWare commands (old school) before they go live with the REAL Deal.
Hal from TechProsaic wrote a blog post here http://halr9000.com/article/445 about Using Plink to get Information about ESX and creating a custom object for the VM’s that the ESX host currently runs. I really liked the script, but I wanted a little more out of it. So I modified it (sorry Hal) and add some functionality. Below is a list of things it does.
Get Virtual Machines Running on ESX Host. Returns Custom Object
Provides a similar function to Get-Process from the ESX Host
Will Run a generic Command on the ESX Host
NOTE: At lines 16/31/62 I am having some issues with syntax highlight changing these to email addresses. Please make user the end up as $user @ $srv (no spaces)
You can also get a working copy here http://powershellcentral.com/scripts/54
# Invoke-VMCommand.ps1
# Purpose : Run a remote command and return the results
# Requirements: plink.exe from the Putty project must be in $env:path
# Use -help parameter for instructions
Param (
$VMHost,
$username,
$Command,
[switch]$Help,
[switch]$Verbose
)
# Obtains list of VMX (config files) corresponding to each VM on a given ESX server
function GetVMX ($user, $pass, $srv) {
$cmd = "plink.exe $user@$srv -pw $pass"
$cmd += " vmware-cmd -l"
Write-Verbose "Command line: $cmd"
$VMList = Invoke-Expression $cmd
$collOut = @()
$VmList | ForEach-Object {
$objOut = "" | Select-Object VmHost, VmName, VMXpath, HasSnapshot # create our output object with desired properties
$objOut.VmHost = $srv
$objOut.VMXpath = $_
$objOut.VmName = (Split-Path $_ -Leaf) -replace ".vmx$"
$collOut += $objOut
}
$collOut
}
function Get-ESXProcess($user, $pass, $srv){
$cmd = "plink.exe -t $user@$srv -pw $pass "
$cmd += "`"ps -Af | grep `’`’`""
Write-Verbose "Command line: $cmd"
$results = invoke-Expression $cmd
$colObj = @()
foreach($result in $results)
{
if($result -match "^UID"){continue}
$myobj = "" | Select-Object UID,PID,PPID,C,STIME,TTY,TIME,CMD
$ary = $result.split([string[]]" ",[System.StringSplitOptions]::RemoveEmptyEntries)
$myobj.UID = $ary[0]
$myobj.PID = $ary[1]
$myobj.PPID = $ary[2]
$myobj.C = $ary[3]
$myobj.STIME = $ary[4]
$myobj.TTY = $ary[5]
$myobj.Time = $ary[6]
$proc = $null
write-verbose "Length: $($ary.Length)"
for($i = 7;$i -le $ary.Length;$i++)
{
$proc = "$proc $($ary[$i])"
write-Verbose "Adding [$i] $($ary[$i])"
}
Write-Verbose "COMMAND = $proc"
$myobj.CMD = $proc
$colObj += $myobj
}
$colObj
}
function RunVMCommand ($user, $pass, $srv, $vmcmd) {
$cmd = "plink.exe $user@$srv -pw $pass "
$cmd += "`"$vmcmd | grep `’`’`""
Write-Verbose "Command line: $cmd"
invoke-Expression $cmd
}
function GetSecurePass ($SecurePassword) {
$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($SecurePassword)
$password = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
[System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($Ptr)
$password
}
# Returns help text
function ShowUsage {
$helptext = @"
Invoke-VMCommand
Requirements: plink.exe from the Putty project must be in your Path
INPUT:
VMHost : name or IP of ESX server(s) (REQUIRED)
UserName : User to ssh With (REQUIRED)
Command : Command to Run. This can be a GetVMX, PSList, or a Custome String (REQUIRED)
Help : shows usage
"@
Write-Host $helptext
}
# Main
if ($help) { ShowUsage; exit; }
if ($verbose) { $verbosepreference = "continue" }
$password = (Read-Host "Enter Password" -AsSecureString)
if($Command -eq "GetVMX"){GetVMX $username (GetSecurePass $password) $VMHost}
elseif($command -eq "PSList"){Get-ESXProcess $username (GetSecurePass $password) $VMHost}
else{RunVMCommand $username (GetSecurePass $password) $VMHost $Command}
tshell :: Nov.07.2007 ::
All, Custom Objects, HowTo, Powershell, Scripting, VMWare ::
No Comments »