From c265c504470d933052eb4028a094fa0405600c85 Mon Sep 17 00:00:00 2001 From: Jose Rodriguez Date: Sun, 8 Apr 2018 15:00:08 -0700 Subject: [PATCH 1/6] Adding Remove-HVMachine function --- .../VMware.Hv.Helper/VMware.HV.Helper.psm1 | 173 +++++++++++++++++- 1 file changed, 172 insertions(+), 1 deletion(-) diff --git a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 index 0f9a2f9..9eaeae4 100644 --- a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 +++ b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 @@ -9990,4 +9990,175 @@ function Reset-HVMachine { } } -Export-ModuleMember Add-HVDesktop,Add-HVRDSServer,Connect-HVEvent,Disconnect-HVEvent,Get-HVPoolSpec,Get-HVInternalName, Get-HVEvent,Get-HVFarm,Get-HVFarmSummary,Get-HVPool,Get-HVPoolSummary,Get-HVMachine,Get-HVMachineSummary,Get-HVQueryResult,Get-HVQueryFilter,New-HVFarm,New-HVPool,Remove-HVFarm,Remove-HVPool,Set-HVFarm,Set-HVPool,Start-HVFarm,Start-HVPool,New-HVEntitlement,Get-HVEntitlement,Remove-HVEntitlement, Set-HVMachine, New-HVGlobalEntitlement, Remove-HVGlobalEntitlement, Get-HVGlobalEntitlement, Set-HVApplicationIcon, Remove-HVApplicationIcon, Get-HVGlobalSettings, Set-HVGlobalSettings, Set-HVGlobalEntitlement, Get-HVResourceStructure, Get-hvlocalsession, Get-HVGlobalSession, Reset-HVMachine +function Remove-HVMachine(){ + <# + .Synopsis + Remove a Horizon View desktop or desktops. + + .DESCRIPTION + Deletes a VM or an array of VM's from Horizon. Utilizes an Or query filter to match machine names. + + .PARAMETER HVServer + The Horizon server where the machine to be deleted resides.Parameter is not mandatory, + but if you do not specify the server, than make sure you are connected to a Horizon server + first with connect-hvserver. + + .PARAMETER MachineName + The name or names of the machine(s) to be deleted. This is a mandatory parameter. + + .EXAMPLE + remove-HVMachine -HVServer 'horizonserver123' -MachineNames 'LAX-WIN10-002' + Deletes VM 'LAX-WIN10-002' from HV Server 'horizonserver123' + + .EXAMPLE + remove-HVMachine -HVServer 'horizonserver123' -MachineNames $machines + Deletes VM's contained within an array of machine names from HV Server 'horizonserver123' + + .NOTES + Author : Jose Rodriguez + Author email : jrodsguitar@gmail.com + Version : 1.0 + + ===Tested Against Environment==== + Horizon View Server Version : 7.1.1 + PowerCLI Version : PowerCLI 6.5, PowerCLI 6.5.1 + PowerShell Version : 5.0 + #> + + [CmdletBinding( + SupportsShouldProcess = $true, + ConfirmImpact = 'High' + )] + + param( + + [Parameter(Mandatory = $true)] + [array] + $MachineNames, + + [Parameter(Mandatory = $false)] + $HVServer + ) + +if($HVServer){ + + $hvapi = ($global:DefaultHVServers| where {$_.name -imatch $HVServer }).extensiondata + +} + +else { + + $hvapi = $global:DefaultHVServers.ExtensionData + +} + +#Connect to Query Service +$queryService = New-Object 'Vmware.Hv.QueryServiceService' +#QUery Definition +$queryDefinition = New-Object 'Vmware.Hv.QueryDefinition' +#Query Filter +$queryDefinition.queryEntityType = 'MachineNamesView' + +#Create Filter Set so we can populate it with QueryFilterEquals data +[VMware.Hv.queryfilter[]]$filterSet = @() +foreach($machine in $machineNames){ + + #queryfilter values + $queryFilterEquals = New-Object VMware.Hv.QueryFilterEquals + $queryFilterEquals.memberName = "base.name" + $queryFilterEquals.value = "$machine" + + $filterSet += $queryFilterEquals + +} + +#Or Filter +$orFilter = New-Object VMware.Hv.QueryFilterOr +$orFilter.filters = $filterSet + +#Set Definition filter to value of $orfilter +$queryDefinition.filter = $orFilter + +#Retrieve query results. Returns all machines to be deleted +$queryResults = $queryService.QueryService_Query($hvapi,$queryDefinition) + +#Assign VM Object to variable +$deleteThisMachine = $queryResults.Results + +#Machine Service +$machineService = new-object VMware.Hv.MachineService + +#Get Machine Service machine object +$deleteMachine = $machineService.Machine_GetInfos($hvapi,$deleteThisMachine.Id) + +#If sessions exist on the machines we are going to delete than force kill those sessions. +#The deleteMachines method will not work if there are any existing sessions so this step is very important. +write-host "Attemtping log off of machines" + +if($deleteMachine.base.session.id){ +$trys = 0 + + do{ + foreach($session in $deleteMachine.base.session){ + + $sessions = $null + [VMware.Hv.SessionId[]]$sessions += $session + + } + + try{ + + write-host "`n" + write-host "Attemtping log off of machines" + write-host "`n" + $logOffSession = new-object 'VMware.Hv.SessionService' + $logOffSession.Session_LogoffSessionsForced($hvapi,$sessions) + + #Wait more for Sessions to end + + Start-Sleep -Seconds 5 + + } + + catch{ + + Write-Host "Attempted to Log Off Sessions from below machines but recieved an error. This doesn't usually mean it failed. Typically the session is succesfully logged off but takes some time" + write-host "`n" + write-host ($deleteMachine.base.Name -join "`n") + + start-sleep -seconds 5 + + } + + if(($trys -le 10)){ + + write-host "`n" + write-host "Retrying Logoffs: $trys times" + #Recheck existing sessions + $deleteMachine = $machineService.Machine_GetInfos($hvapi,$deleteThisMachine.Id) + + } + + $trys++ + + } + + until((!$deleteMachine.base.session.id) -or ($trys -gt 10)) + +} + +#Create delete spec for the DeleteMachines method +$deleteSpec = [VMware.Hv.MachineDeleteSpec]::new() +$deleteSpec.DeleteFromDisk = $true +$deleteSpec.ArchivePersistentDisk = $false + +#Delete VM +write-host "Deleting:" +Write-Output $($deleteMachine.base.Name) + +#Delete the machines +$bye = $machineService.Machine_DeleteMachines($hvapi,$deleteMachine.id,$deleteSpec) + +} + +Export-ModuleMember Add-HVDesktop,Add-HVRDSServer,Connect-HVEvent,Disconnect-HVEvent,Get-HVPoolSpec,Get-HVInternalName, Get-HVEvent,Get-HVFarm,Get-HVFarmSummary,Get-HVPool,Get-HVPoolSummary,Get-HVMachine,Get-HVMachineSummary,Get-HVQueryResult,Get-HVQueryFilter,New-HVFarm,New-HVPool,Remove-HVFarm,Remove-HVPool,Set-HVFarm,Set-HVPool,Start-HVFarm,Start-HVPool,New-HVEntitlement,Get-HVEntitlement,Remove-HVEntitlement, Set-HVMachine, New-HVGlobalEntitlement, Remove-HVGlobalEntitlement, Get-HVGlobalEntitlement, Set-HVApplicationIcon, Remove-HVApplicationIcon, Get-HVGlobalSettings, Set-HVGlobalSettings, Set-HVGlobalEntitlement, Get-HVResourceStructure, Get-hvlocalsession, Get-HVGlobalSession, Reset-HVMachine, Remove-HVMachine From cdff3035cc0a61a6d0e71ab3ee5d41dabc117a1b Mon Sep 17 00:00:00 2001 From: Jose Rodriguez Date: Sun, 8 Apr 2018 20:46:38 -0700 Subject: [PATCH 2/6] Revert "Adding Remove-HVMachine function" This reverts commit c265c504470d933052eb4028a094fa0405600c85. --- .../VMware.Hv.Helper/VMware.HV.Helper.psm1 | 173 +----------------- 1 file changed, 1 insertion(+), 172 deletions(-) diff --git a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 index 9eaeae4..0f9a2f9 100644 --- a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 +++ b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 @@ -9990,175 +9990,4 @@ function Reset-HVMachine { } } -function Remove-HVMachine(){ - <# - .Synopsis - Remove a Horizon View desktop or desktops. - - .DESCRIPTION - Deletes a VM or an array of VM's from Horizon. Utilizes an Or query filter to match machine names. - - .PARAMETER HVServer - The Horizon server where the machine to be deleted resides.Parameter is not mandatory, - but if you do not specify the server, than make sure you are connected to a Horizon server - first with connect-hvserver. - - .PARAMETER MachineName - The name or names of the machine(s) to be deleted. This is a mandatory parameter. - - .EXAMPLE - remove-HVMachine -HVServer 'horizonserver123' -MachineNames 'LAX-WIN10-002' - Deletes VM 'LAX-WIN10-002' from HV Server 'horizonserver123' - - .EXAMPLE - remove-HVMachine -HVServer 'horizonserver123' -MachineNames $machines - Deletes VM's contained within an array of machine names from HV Server 'horizonserver123' - - .NOTES - Author : Jose Rodriguez - Author email : jrodsguitar@gmail.com - Version : 1.0 - - ===Tested Against Environment==== - Horizon View Server Version : 7.1.1 - PowerCLI Version : PowerCLI 6.5, PowerCLI 6.5.1 - PowerShell Version : 5.0 - #> - - [CmdletBinding( - SupportsShouldProcess = $true, - ConfirmImpact = 'High' - )] - - param( - - [Parameter(Mandatory = $true)] - [array] - $MachineNames, - - [Parameter(Mandatory = $false)] - $HVServer - ) - -if($HVServer){ - - $hvapi = ($global:DefaultHVServers| where {$_.name -imatch $HVServer }).extensiondata - -} - -else { - - $hvapi = $global:DefaultHVServers.ExtensionData - -} - -#Connect to Query Service -$queryService = New-Object 'Vmware.Hv.QueryServiceService' -#QUery Definition -$queryDefinition = New-Object 'Vmware.Hv.QueryDefinition' -#Query Filter -$queryDefinition.queryEntityType = 'MachineNamesView' - -#Create Filter Set so we can populate it with QueryFilterEquals data -[VMware.Hv.queryfilter[]]$filterSet = @() -foreach($machine in $machineNames){ - - #queryfilter values - $queryFilterEquals = New-Object VMware.Hv.QueryFilterEquals - $queryFilterEquals.memberName = "base.name" - $queryFilterEquals.value = "$machine" - - $filterSet += $queryFilterEquals - -} - -#Or Filter -$orFilter = New-Object VMware.Hv.QueryFilterOr -$orFilter.filters = $filterSet - -#Set Definition filter to value of $orfilter -$queryDefinition.filter = $orFilter - -#Retrieve query results. Returns all machines to be deleted -$queryResults = $queryService.QueryService_Query($hvapi,$queryDefinition) - -#Assign VM Object to variable -$deleteThisMachine = $queryResults.Results - -#Machine Service -$machineService = new-object VMware.Hv.MachineService - -#Get Machine Service machine object -$deleteMachine = $machineService.Machine_GetInfos($hvapi,$deleteThisMachine.Id) - -#If sessions exist on the machines we are going to delete than force kill those sessions. -#The deleteMachines method will not work if there are any existing sessions so this step is very important. -write-host "Attemtping log off of machines" - -if($deleteMachine.base.session.id){ -$trys = 0 - - do{ - foreach($session in $deleteMachine.base.session){ - - $sessions = $null - [VMware.Hv.SessionId[]]$sessions += $session - - } - - try{ - - write-host "`n" - write-host "Attemtping log off of machines" - write-host "`n" - $logOffSession = new-object 'VMware.Hv.SessionService' - $logOffSession.Session_LogoffSessionsForced($hvapi,$sessions) - - #Wait more for Sessions to end - - Start-Sleep -Seconds 5 - - } - - catch{ - - Write-Host "Attempted to Log Off Sessions from below machines but recieved an error. This doesn't usually mean it failed. Typically the session is succesfully logged off but takes some time" - write-host "`n" - write-host ($deleteMachine.base.Name -join "`n") - - start-sleep -seconds 5 - - } - - if(($trys -le 10)){ - - write-host "`n" - write-host "Retrying Logoffs: $trys times" - #Recheck existing sessions - $deleteMachine = $machineService.Machine_GetInfos($hvapi,$deleteThisMachine.Id) - - } - - $trys++ - - } - - until((!$deleteMachine.base.session.id) -or ($trys -gt 10)) - -} - -#Create delete spec for the DeleteMachines method -$deleteSpec = [VMware.Hv.MachineDeleteSpec]::new() -$deleteSpec.DeleteFromDisk = $true -$deleteSpec.ArchivePersistentDisk = $false - -#Delete VM -write-host "Deleting:" -Write-Output $($deleteMachine.base.Name) - -#Delete the machines -$bye = $machineService.Machine_DeleteMachines($hvapi,$deleteMachine.id,$deleteSpec) - -} - -Export-ModuleMember Add-HVDesktop,Add-HVRDSServer,Connect-HVEvent,Disconnect-HVEvent,Get-HVPoolSpec,Get-HVInternalName, Get-HVEvent,Get-HVFarm,Get-HVFarmSummary,Get-HVPool,Get-HVPoolSummary,Get-HVMachine,Get-HVMachineSummary,Get-HVQueryResult,Get-HVQueryFilter,New-HVFarm,New-HVPool,Remove-HVFarm,Remove-HVPool,Set-HVFarm,Set-HVPool,Start-HVFarm,Start-HVPool,New-HVEntitlement,Get-HVEntitlement,Remove-HVEntitlement, Set-HVMachine, New-HVGlobalEntitlement, Remove-HVGlobalEntitlement, Get-HVGlobalEntitlement, Set-HVApplicationIcon, Remove-HVApplicationIcon, Get-HVGlobalSettings, Set-HVGlobalSettings, Set-HVGlobalEntitlement, Get-HVResourceStructure, Get-hvlocalsession, Get-HVGlobalSession, Reset-HVMachine, Remove-HVMachine +Export-ModuleMember Add-HVDesktop,Add-HVRDSServer,Connect-HVEvent,Disconnect-HVEvent,Get-HVPoolSpec,Get-HVInternalName, Get-HVEvent,Get-HVFarm,Get-HVFarmSummary,Get-HVPool,Get-HVPoolSummary,Get-HVMachine,Get-HVMachineSummary,Get-HVQueryResult,Get-HVQueryFilter,New-HVFarm,New-HVPool,Remove-HVFarm,Remove-HVPool,Set-HVFarm,Set-HVPool,Start-HVFarm,Start-HVPool,New-HVEntitlement,Get-HVEntitlement,Remove-HVEntitlement, Set-HVMachine, New-HVGlobalEntitlement, Remove-HVGlobalEntitlement, Get-HVGlobalEntitlement, Set-HVApplicationIcon, Remove-HVApplicationIcon, Get-HVGlobalSettings, Set-HVGlobalSettings, Set-HVGlobalEntitlement, Get-HVResourceStructure, Get-hvlocalsession, Get-HVGlobalSession, Reset-HVMachine From 245cacae25d0505ece95b8e84fbca3d72de83a46 Mon Sep 17 00:00:00 2001 From: Jose Rodriguez Date: Sun, 8 Apr 2018 20:48:30 -0700 Subject: [PATCH 3/6] Revert "Revert "Adding Remove-HVMachine function"" This reverts commit cdff3035cc0a61a6d0e71ab3ee5d41dabc117a1b. --- .../VMware.Hv.Helper/VMware.HV.Helper.psm1 | 173 +++++++++++++++++- 1 file changed, 172 insertions(+), 1 deletion(-) diff --git a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 index 0f9a2f9..9eaeae4 100644 --- a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 +++ b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 @@ -9990,4 +9990,175 @@ function Reset-HVMachine { } } -Export-ModuleMember Add-HVDesktop,Add-HVRDSServer,Connect-HVEvent,Disconnect-HVEvent,Get-HVPoolSpec,Get-HVInternalName, Get-HVEvent,Get-HVFarm,Get-HVFarmSummary,Get-HVPool,Get-HVPoolSummary,Get-HVMachine,Get-HVMachineSummary,Get-HVQueryResult,Get-HVQueryFilter,New-HVFarm,New-HVPool,Remove-HVFarm,Remove-HVPool,Set-HVFarm,Set-HVPool,Start-HVFarm,Start-HVPool,New-HVEntitlement,Get-HVEntitlement,Remove-HVEntitlement, Set-HVMachine, New-HVGlobalEntitlement, Remove-HVGlobalEntitlement, Get-HVGlobalEntitlement, Set-HVApplicationIcon, Remove-HVApplicationIcon, Get-HVGlobalSettings, Set-HVGlobalSettings, Set-HVGlobalEntitlement, Get-HVResourceStructure, Get-hvlocalsession, Get-HVGlobalSession, Reset-HVMachine +function Remove-HVMachine(){ + <# + .Synopsis + Remove a Horizon View desktop or desktops. + + .DESCRIPTION + Deletes a VM or an array of VM's from Horizon. Utilizes an Or query filter to match machine names. + + .PARAMETER HVServer + The Horizon server where the machine to be deleted resides.Parameter is not mandatory, + but if you do not specify the server, than make sure you are connected to a Horizon server + first with connect-hvserver. + + .PARAMETER MachineName + The name or names of the machine(s) to be deleted. This is a mandatory parameter. + + .EXAMPLE + remove-HVMachine -HVServer 'horizonserver123' -MachineNames 'LAX-WIN10-002' + Deletes VM 'LAX-WIN10-002' from HV Server 'horizonserver123' + + .EXAMPLE + remove-HVMachine -HVServer 'horizonserver123' -MachineNames $machines + Deletes VM's contained within an array of machine names from HV Server 'horizonserver123' + + .NOTES + Author : Jose Rodriguez + Author email : jrodsguitar@gmail.com + Version : 1.0 + + ===Tested Against Environment==== + Horizon View Server Version : 7.1.1 + PowerCLI Version : PowerCLI 6.5, PowerCLI 6.5.1 + PowerShell Version : 5.0 + #> + + [CmdletBinding( + SupportsShouldProcess = $true, + ConfirmImpact = 'High' + )] + + param( + + [Parameter(Mandatory = $true)] + [array] + $MachineNames, + + [Parameter(Mandatory = $false)] + $HVServer + ) + +if($HVServer){ + + $hvapi = ($global:DefaultHVServers| where {$_.name -imatch $HVServer }).extensiondata + +} + +else { + + $hvapi = $global:DefaultHVServers.ExtensionData + +} + +#Connect to Query Service +$queryService = New-Object 'Vmware.Hv.QueryServiceService' +#QUery Definition +$queryDefinition = New-Object 'Vmware.Hv.QueryDefinition' +#Query Filter +$queryDefinition.queryEntityType = 'MachineNamesView' + +#Create Filter Set so we can populate it with QueryFilterEquals data +[VMware.Hv.queryfilter[]]$filterSet = @() +foreach($machine in $machineNames){ + + #queryfilter values + $queryFilterEquals = New-Object VMware.Hv.QueryFilterEquals + $queryFilterEquals.memberName = "base.name" + $queryFilterEquals.value = "$machine" + + $filterSet += $queryFilterEquals + +} + +#Or Filter +$orFilter = New-Object VMware.Hv.QueryFilterOr +$orFilter.filters = $filterSet + +#Set Definition filter to value of $orfilter +$queryDefinition.filter = $orFilter + +#Retrieve query results. Returns all machines to be deleted +$queryResults = $queryService.QueryService_Query($hvapi,$queryDefinition) + +#Assign VM Object to variable +$deleteThisMachine = $queryResults.Results + +#Machine Service +$machineService = new-object VMware.Hv.MachineService + +#Get Machine Service machine object +$deleteMachine = $machineService.Machine_GetInfos($hvapi,$deleteThisMachine.Id) + +#If sessions exist on the machines we are going to delete than force kill those sessions. +#The deleteMachines method will not work if there are any existing sessions so this step is very important. +write-host "Attemtping log off of machines" + +if($deleteMachine.base.session.id){ +$trys = 0 + + do{ + foreach($session in $deleteMachine.base.session){ + + $sessions = $null + [VMware.Hv.SessionId[]]$sessions += $session + + } + + try{ + + write-host "`n" + write-host "Attemtping log off of machines" + write-host "`n" + $logOffSession = new-object 'VMware.Hv.SessionService' + $logOffSession.Session_LogoffSessionsForced($hvapi,$sessions) + + #Wait more for Sessions to end + + Start-Sleep -Seconds 5 + + } + + catch{ + + Write-Host "Attempted to Log Off Sessions from below machines but recieved an error. This doesn't usually mean it failed. Typically the session is succesfully logged off but takes some time" + write-host "`n" + write-host ($deleteMachine.base.Name -join "`n") + + start-sleep -seconds 5 + + } + + if(($trys -le 10)){ + + write-host "`n" + write-host "Retrying Logoffs: $trys times" + #Recheck existing sessions + $deleteMachine = $machineService.Machine_GetInfos($hvapi,$deleteThisMachine.Id) + + } + + $trys++ + + } + + until((!$deleteMachine.base.session.id) -or ($trys -gt 10)) + +} + +#Create delete spec for the DeleteMachines method +$deleteSpec = [VMware.Hv.MachineDeleteSpec]::new() +$deleteSpec.DeleteFromDisk = $true +$deleteSpec.ArchivePersistentDisk = $false + +#Delete VM +write-host "Deleting:" +Write-Output $($deleteMachine.base.Name) + +#Delete the machines +$bye = $machineService.Machine_DeleteMachines($hvapi,$deleteMachine.id,$deleteSpec) + +} + +Export-ModuleMember Add-HVDesktop,Add-HVRDSServer,Connect-HVEvent,Disconnect-HVEvent,Get-HVPoolSpec,Get-HVInternalName, Get-HVEvent,Get-HVFarm,Get-HVFarmSummary,Get-HVPool,Get-HVPoolSummary,Get-HVMachine,Get-HVMachineSummary,Get-HVQueryResult,Get-HVQueryFilter,New-HVFarm,New-HVPool,Remove-HVFarm,Remove-HVPool,Set-HVFarm,Set-HVPool,Start-HVFarm,Start-HVPool,New-HVEntitlement,Get-HVEntitlement,Remove-HVEntitlement, Set-HVMachine, New-HVGlobalEntitlement, Remove-HVGlobalEntitlement, Get-HVGlobalEntitlement, Set-HVApplicationIcon, Remove-HVApplicationIcon, Get-HVGlobalSettings, Set-HVGlobalSettings, Set-HVGlobalEntitlement, Get-HVResourceStructure, Get-hvlocalsession, Get-HVGlobalSession, Reset-HVMachine, Remove-HVMachine From 7235de655d3f452d5ad478652d06b65a2e986c4b Mon Sep 17 00:00:00 2001 From: Jose Rodriguez Date: Mon, 9 Apr 2018 01:58:24 -0700 Subject: [PATCH 4/6] Various modifications per feedback. Now using Get-ViewAPIService to connect. Now using $services variable instead of $viewapi. --- .../VMware.Hv.Helper/VMware.HV.Helper.psm1 | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 index 9eaeae4..ca6a8f4 100644 --- a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 +++ b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 @@ -10003,8 +10003,8 @@ function Remove-HVMachine(){ but if you do not specify the server, than make sure you are connected to a Horizon server first with connect-hvserver. - .PARAMETER MachineName - The name or names of the machine(s) to be deleted. This is a mandatory parameter. + .PARAMETER MachineNames + The name or names of the machine(s) to be deleted. Accepts a single VM or an array of VM names.This is a mandatory parameter. .EXAMPLE remove-HVMachine -HVServer 'horizonserver123' -MachineNames 'LAX-WIN10-002' @@ -10037,7 +10037,7 @@ function Remove-HVMachine(){ $MachineNames, [Parameter(Mandatory = $false)] - $HVServer + $HVServer = $null ) if($HVServer){ @@ -10080,7 +10080,7 @@ $orFilter.filters = $filterSet $queryDefinition.filter = $orFilter #Retrieve query results. Returns all machines to be deleted -$queryResults = $queryService.QueryService_Query($hvapi,$queryDefinition) +$queryResults = $queryService.QueryService_Query($services,$queryDefinition) #Assign VM Object to variable $deleteThisMachine = $queryResults.Results @@ -10089,7 +10089,7 @@ $deleteThisMachine = $queryResults.Results $machineService = new-object VMware.Hv.MachineService #Get Machine Service machine object -$deleteMachine = $machineService.Machine_GetInfos($hvapi,$deleteThisMachine.Id) +$deleteMachine = $machineService.Machine_GetInfos($services,$deleteThisMachine.Id) #If sessions exist on the machines we are going to delete than force kill those sessions. #The deleteMachines method will not work if there are any existing sessions so this step is very important. @@ -10112,7 +10112,7 @@ $trys = 0 write-host "Attemtping log off of machines" write-host "`n" $logOffSession = new-object 'VMware.Hv.SessionService' - $logOffSession.Session_LogoffSessionsForced($hvapi,$sessions) + $logOffSession.Session_LogoffSessionsForced($services,$sessions) #Wait more for Sessions to end @@ -10135,7 +10135,7 @@ $trys = 0 write-host "`n" write-host "Retrying Logoffs: $trys times" #Recheck existing sessions - $deleteMachine = $machineService.Machine_GetInfos($hvapi,$deleteThisMachine.Id) + $deleteMachine = $machineService.Machine_GetInfos($services,$deleteThisMachine.Id) } @@ -10152,12 +10152,12 @@ $deleteSpec = [VMware.Hv.MachineDeleteSpec]::new() $deleteSpec.DeleteFromDisk = $true $deleteSpec.ArchivePersistentDisk = $false -#Delete VM -write-host "Deleting:" -Write-Output $($deleteMachine.base.Name) - #Delete the machines -$bye = $machineService.Machine_DeleteMachines($hvapi,$deleteMachine.id,$deleteSpec) +write-host "Attempting to Delete:" +Write-Output ($deleteMachine.base.Name -join "`n") +$bye = $machineService.Machine_DeleteMachines($services,$deleteMachine.id,$deleteSpec) + +[System.gc]::collect() } From 054d127f128d190b22ea91f093391b7d18cf42e9 Mon Sep 17 00:00:00 2001 From: Jose Rodriguez Date: Mon, 9 Apr 2018 02:04:20 -0700 Subject: [PATCH 5/6] Making sure Get-ViewAPIService is there. --- .../VMware.Hv.Helper/VMware.HV.Helper.psm1 | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 index ca6a8f4..60e7293 100644 --- a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 +++ b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 @@ -10040,17 +10040,13 @@ function Remove-HVMachine(){ $HVServer = $null ) -if($HVServer){ - - $hvapi = ($global:DefaultHVServers| where {$_.name -imatch $HVServer }).extensiondata - -} - -else { - - $hvapi = $global:DefaultHVServers.ExtensionData - -} +#Connect to HV Server +$services = Get-ViewAPIService -HVServer $HVServer + + if ($null -eq $services) { + Write-Error "Could not retrieve ViewApi services from connection object" + break + } #Connect to Query Service $queryService = New-Object 'Vmware.Hv.QueryServiceService' @@ -10158,7 +10154,7 @@ Write-Output ($deleteMachine.base.Name -join "`n") $bye = $machineService.Machine_DeleteMachines($services,$deleteMachine.id,$deleteSpec) [System.gc]::collect() - + } Export-ModuleMember Add-HVDesktop,Add-HVRDSServer,Connect-HVEvent,Disconnect-HVEvent,Get-HVPoolSpec,Get-HVInternalName, Get-HVEvent,Get-HVFarm,Get-HVFarmSummary,Get-HVPool,Get-HVPoolSummary,Get-HVMachine,Get-HVMachineSummary,Get-HVQueryResult,Get-HVQueryFilter,New-HVFarm,New-HVPool,Remove-HVFarm,Remove-HVPool,Set-HVFarm,Set-HVPool,Start-HVFarm,Start-HVPool,New-HVEntitlement,Get-HVEntitlement,Remove-HVEntitlement, Set-HVMachine, New-HVGlobalEntitlement, Remove-HVGlobalEntitlement, Get-HVGlobalEntitlement, Set-HVApplicationIcon, Remove-HVApplicationIcon, Get-HVGlobalSettings, Set-HVGlobalSettings, Set-HVGlobalEntitlement, Get-HVResourceStructure, Get-hvlocalsession, Get-HVGlobalSession, Reset-HVMachine, Remove-HVMachine From f4ba11fe7558fb4ba2f95cb580cad81549342c8a Mon Sep 17 00:00:00 2001 From: jrodsguitar Date: Sun, 29 Apr 2018 12:27:58 -0700 Subject: [PATCH 6/6] Added Remove-HVMachine to Export-ModuleMember --- Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 index 9d84561..5d20bb6 100644 --- a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 +++ b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 @@ -10887,4 +10887,4 @@ function remove-hvsite { [System.gc]::collect() } -Export-ModuleMember Add-HVDesktop,Add-HVRDSServer,Connect-HVEvent,Disconnect-HVEvent,Get-HVPoolSpec,Get-HVInternalName, Get-HVEvent,Get-HVFarm,Get-HVFarmSummary,Get-HVPool,Get-HVPoolSummary,Get-HVMachine,Get-HVMachineSummary,Get-HVQueryResult,Get-HVQueryFilter,New-HVFarm,New-HVPool,Remove-HVFarm,Remove-HVPool,Set-HVFarm,Set-HVPool,Start-HVFarm,Start-HVPool,New-HVEntitlement,Get-HVEntitlement,Remove-HVEntitlement, Set-HVMachine, New-HVGlobalEntitlement, Remove-HVGlobalEntitlement, Get-HVGlobalEntitlement, Set-HVApplicationIcon, Remove-HVApplicationIcon, Get-HVGlobalSettings, Set-HVGlobalSettings, Set-HVGlobalEntitlement, Get-HVResourceStructure, Get-hvlocalsession, Get-HVGlobalSession, Reset-HVMachine, Get-HVHealth, new-hvpodfederation, remove-hvpodfederation, get-hvpodfederation, register-hvpod, unregister-hvpod, set-hvpodfederation,get-hvsite,new-hvsite,set-hvsite,remove-hvsite +Export-ModuleMember Add-HVDesktop,Add-HVRDSServer,Connect-HVEvent,Disconnect-HVEvent,Get-HVPoolSpec,Get-HVInternalName, Get-HVEvent,Get-HVFarm,Get-HVFarmSummary,Get-HVPool,Get-HVPoolSummary,Get-HVMachine,Get-HVMachineSummary,Get-HVQueryResult,Get-HVQueryFilter,New-HVFarm,New-HVPool,Remove-HVFarm,Remove-HVPool,Set-HVFarm,Set-HVPool,Start-HVFarm,Start-HVPool,New-HVEntitlement,Get-HVEntitlement,Remove-HVEntitlement, Set-HVMachine, New-HVGlobalEntitlement, Remove-HVGlobalEntitlement, Get-HVGlobalEntitlement, Set-HVApplicationIcon, Remove-HVApplicationIcon, Get-HVGlobalSettings, Set-HVGlobalSettings, Set-HVGlobalEntitlement, Get-HVResourceStructure, Get-hvlocalsession, Get-HVGlobalSession, Reset-HVMachine, Remove-HVMachine, Get-HVHealth, new-hvpodfederation, remove-hvpodfederation, get-hvpodfederation, register-hvpod, unregister-hvpod, set-hvpodfederation,get-hvsite,new-hvsite,set-hvsite,remove-hvsite