# 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 '' }