# SCVMM 2008 VM UPTIME SCRIPT WITH USING HYPER-V SNAPIN CODES
# WRITTEN BY YUSUF OZTURK (MCSE+S, MCTS)
# http://www.yusufozturk.info
Add-PSSnapin -name Microsoft.SystemCenter.VirtualMachineManager
Get-Vmmserver localhost
$VMProp = Get-VM | Select-Object -Property Name,VMHost
foreach ($i in $VMProp)
{
$VMName = $i.Name
write-host $VMName
$VMHost = $i.VMHost
write-host $VMHost
$VMState= @{"Running"=2 ; "Stopped"=3 ; "Paused"=32768 ; "Suspended"=32769 ; "Starting"=32770 ; "Snapshotting"=32771 ; "Saving"=32773 ; "Stopping"=32774 }
$ReturnCode= @{"0"="OK" ; "4096"="Job Started" ; "32768"="Failed"; "32769"="Access Denied" ; "32770"="Not Supported"; "32771"="Unknown" ; "32772"="Timeout" ; "32773"="Invalid parameter" ;
"32774"="System is in use" ; "32775"="Invalid state for this operation" ; "32776"="Incorrect data type" ; "32777"="System is not available" ; "32778"="Out of memory" }
$BootMedia= @{"Floppy"=0 ; "CD"=1 ; "IDE"=2 ; "NET"=3 }
$StartupAction =@{"None"=0 ; "RestartOnly"=1 ; "AlwaysStartup"=2}
$ShutDownAction=@{"TurnOff"=0 ; "SaveState"=1 ; "ShutDown"=2}
$Recoveryaction=@{"None"=0 ; "Restart"=1 ; "RevertToSnapShot"=2}
$DiskType= @{"Fixed"=2; "Dynamic"=3; "Differencing"=4; "PhysicalDrive"=5}
Function Get-VM
{Param ([String]$Name="%", $Server=".", [Switch]$suspended, [switch]$running, [Switch]$stopped)
$Name=$Name.replace("*","%")
$WQL="Select * From MsVM_ComputerSystem Where ElementName Like '$Name' AND Caption Like 'Virtual%' "
if ($running -or $stopped -or $suspended) {
[String]$state = ""
if ($running) {$State +="or enabledState=" + $VMState["running"] }
if ($Stopped) {$State +="or enabledState=" + $VMState["Stopped"] }
if ($suspended){$State +="or enabledState=" + $VMState["suspended"]}
$WQL += "AND (" + $state.substring(3) +")" }
Get-WmiObject -computername $Server -NameSpace "root\virtualization" -Query $WQL
}
#Example 1: Get-VM
# Returns WMI MsVM_ComputerSystem objects for all Virtual Machines on the local server(n.b. Parent Partition is filtered out)
#Example 2: Get-VM "Windows 2008 Ent Full TS"
# Returns a single WMI MsVM_ComputerSystem object for the VM named "Server 2008 ENT Full TS"
#Example 3: Get-VM "%2008%" -Server James-2088
# or: Get-VM "*2008*"
# Returns WMI MsVM_ComputerSystem objects for VMs containing 2008 in their name on the server James-2008 (n.b. WQL Wild card is %, function converts * to %)
Filter Get-VMSettingData
{Param ($VM, $Server=".")
if ($VM -eq $null) {$VM=$_}
if ($VM -is [String]) {$VM=(Get-VM -Name $VM -Server $Server) }
if ($VM -is [Array]) {$VM | ForEach-Object {Get-VMSettingData -VM $_ -Server $Server} }
if ($VM -is [System.Management.ManagementObject]) {
if ($vm.__Class -eq "Msvm_VirtualSystemSettingData") {$VM}
if ($vm.__Class -eq "Msvm_ComputerSystem") {Get-WmiObject -ComputerName $vm.__Server -NameSpace "root\virtualization" -Query "ASSOCIATORS OF {$VM} Where ResultClass = MsVM_VirtualSystemSettingData" | where-object {$_.instanceID -eq "Microsoft:$($vm.name)"}} }
$vm=$Null
}
Filter Get-VMSummary
{param ($vm , $Server=".")
if ($vm -eq $null) {$VM=$_}
if ($vm -eq $null) {$VM="%"}
if ($VM -is [String]) {$VM=(Get-VM -Name $VM -Server $Server) }
if ($VM -is [Array]) {$VM | foreach-Object {Get-VMSummary -VM $_ -Server $Server} }
if ($VM -is [System.Management.ManagementObject]) {
$vssd=Get-VMSettingData $vm
$settingPath=@($Vssd.__Path)
$arguments=@($SettingPath, @(0,1,2,3,4,100,101,102,103,104,105,106,107,108), $null)
$VSMgtSvc=Get-WmiObject -computerName $Vssd.__Server -NameSpace "root\virtualization" -Class "MsVM_virtualSystemManagementService"
$result=$VSMgtSvc.psbase.InvokeMethod("GetSummaryInformation",$arguments)
if ($Result -eq 0) {$arguments[2] | foreach-object {
$SiObj = New-Object -TypeName System.Object
Add-Member -inputObject $siObj -MemberType NoteProperty -Name "Host" -Value $_.__server
Add-Member -inputObject $siObj -MemberType NoteProperty -Name "VMElementName" -Value $_.elementname
Add-Member -inputObject $siObj -MemberType NoteProperty -Name "CPUCount" -Value $_.NumberOfProcessors
Add-Member -inputObject $siObj -MemberType NoteProperty -Name "CPULoad" -Value $_.ProcessorLoad
Add-Member -inputObject $siObj -MemberType NoteProperty -Name "CPULoadHistory" -Value $_.ProcessorLoadHistory
Add-Member -inputObject $siObj -MemberType NoteProperty -Name "Uptime" -Value $_.UpTime
Add-Member -inputObject $siObj -MemberType ScriptProperty -Name "UptimeFormatted" -Value {if ($This.uptime -gt 0) {([datetime]0).addmilliseconds($This.UpTime).tostring("hh:mm:ss")} else {0} }
$siObj } }
else {"Get Summary info :" + $ReturnCode[[string]$result] | Out-host }
}
}
$Uptime = Get-VMSummary -VM $VMName -Server $VMHost
$VMUptime = $Uptime.UptimeFormatted
$contentStatus = ' ' + $VMUptime + ''
clear-content -path "C:\Program Files\Microsoft System Center Virtual Machine Manager 2008\wwwroot\Uptime\$VMName.xml"
add-content -path "C:\Program Files\Microsoft System Center Virtual Machine Manager 2008\wwwroot\Uptime\$VMName.xml" -value ''
add-content -path "C:\Program Files\Microsoft System Center Virtual Machine Manager 2008\wwwroot\Uptime\$VMName.xml" -value ''
add-content -path "C:\Program Files\Microsoft System Center Virtual Machine Manager 2008\wwwroot\Uptime\$VMName.xml" -value $contentStatus
add-content -path "C:\Program Files\Microsoft System Center Virtual Machine Manager 2008\wwwroot\Uptime\$VMName.xml" -value ''
}