diff --git a/Horizon Tools/KISHorizon.psm1 b/Horizon Tools/KISHorizon.psm1 index 5115219..b7e5579 100644 --- a/Horizon Tools/KISHorizon.psm1 +++ b/Horizon Tools/KISHorizon.psm1 @@ -124,12 +124,16 @@ function Get-HorizonMachine { ) $token = $Horizon.access_token $server = $Horizon.server_name - + $request_header = $global:request_header $request_header += @{"authorization"="Bearer $token"} $machineUri = "https://$server/rest/inventory/v5/machines?sort_by=name&order_by=ASC" + if ($global:kishorizondebug) { + Write-Host $MyInvocation.MyCommand.Name Starting + } + try { $machines = Invoke-RestMethod -Method Get -Uri $machineUri -Headers $request_header -SkipCertificateCheck } catch { @@ -406,18 +410,23 @@ function Get-HorizonDesktopPool { $pools | Add-Member -MemberType NoteProperty -Name cluster -Value "" $pools | Add-Member -MemberType NoteProperty -Name GpuEnabled -Value 0 $pools | Add-Member -MemberType NoteProperty -Name Entitlements -Value @() - $pools.provisioning_settings | Add-Member -MemberType NoteProperty -Name base_vm_name -Value "" - $pools.provisioning_settings | Add-Member -MemberType NoteProperty -Name snapshot_path -Value "" - $pools.provisioning_settings | Add-Member -MemberType NoteProperty -Name datacenter_name -Value "" - $pools.provisioning_settings | Add-Member -MemberType NoteProperty -Name resource_pool_name -Value "" - $pools.provisioning_settings | Add-Member -MemberType NoteProperty -Name base_folder_path -Value "" - $pools.storage_settings.datastores | Add-Member -MemberType NoteProperty -Name name -Value "" $machines = $Horizon | Get-HorizonMachine $sessions = $Horizon | Get-HorizonSession $counter = 1 foreach ($pool in $pools) { + if ($null -ne $pool.provisioing_settings) { + $pool.provisioning_settings | Add-Member -MemberType NoteProperty -Name base_vm_name -Value "" + $pool.provisioning_settings | Add-Member -MemberType NoteProperty -Name snapshot_path -Value "" + $pool.provisioning_settings | Add-Member -MemberType NoteProperty -Name datacenter_name -Value "" + $pool.provisioning_settings | Add-Member -MemberType NoteProperty -Name resource_pool_name -Value "" + $pool.provisioning_settings | Add-Member -MemberType NoteProperty -Name base_folder_path -Value "" + } + if ($null -ne $pool.storage_settings.datastores) { + $pool.storage_settings.datastores | Add-Member -MemberType NoteProperty -Name name -Value "" + } + Write-Progress -Activity "Processing Pools" -Status "Processing $counter of $($pools.length) - $($pool.name)" -PercentComplete (($counter / $pools.length) *100) -Id 1 $mymachines = $machines | where {$_.desktop_pool_id -eq $pool.id} $pool.machines += $mymachines @@ -429,52 +438,54 @@ function Get-HorizonDesktopPool { $session | Add-Member -MemberType NoteProperty -Name machine_name -Value $machineName $session | Add-Member -MemberType NoteProperty -Name machine_dns_name -Value $machineDNSName } - $pool.vCenter = ($hzconn | Get-HorizonVcenter | where-object {$_.id -eq $pool.vcenter_id}).server_name + $pool.vCenter = (Get-HorizonVcenter -Horizon $Horizon | where-object {$_.id -eq $pool.vcenter_id}).server_name if (-not ($global:DefaultVIServer.Name -contains $pool.vCenter)) { throw "Not Connected to vCenter $($pool.vCenter)" } $pool.cluster = (Get-Cluster | where {$_.id -eq "ClusterComputeResource-$($pool.provisioning_settings.host_or_cluster_id)"}).name - $pool.provisioning_settings.base_vm_name = (Get-View -Id "VirtualMachine-$($pool.provisioning_settings.parent_vm_id)").Name - $snappath = "" - $goldVM = Get-VM $pool.provisioning_settings.base_vm_name - $thissnap = $goldVM | Get-Snapshot | Where-Object {$_.Id -eq "VirtualMachineSnapshot-$($pool.provisioning_settings.base_snapshot_id)"} - while ($thissnap.parentsnapshotid.length -gt 0) { + if ($null -ne $pool.provisioning_settings.base_vm_name) { + $pool.provisioning_settings.base_vm_name = (Get-View -Id "VirtualMachine-$($pool.provisioning_settings.parent_vm_id)").Name + $snappath = "" + $goldVM = Get-VM $pool.provisioning_settings.base_vm_name + $thissnap = $goldVM | Get-Snapshot | Where-Object {$_.Id -eq "VirtualMachineSnapshot-$($pool.provisioning_settings.base_snapshot_id)"} + while ($thissnap.parentsnapshotid.length -gt 0) { + if ($snappath -eq "") { + $snappath = $thissnap.Name + } else { + $snappath = $thissnap.Name + "\" + $snappath + } + $thissnap = Get-VM $pool.provisioning_settings.base_vm_name | Get-Snapshot | Where-Object {$_.Id -eq $thissnap.ParentSnapshotId} + } if ($snappath -eq "") { $snappath = $thissnap.Name } else { $snappath = $thissnap.Name + "\" + $snappath } - $thissnap = Get-VM $pool.provisioning_settings.base_vm_name | Get-Snapshot | Where-Object {$_.Id -eq $thissnap.ParentSnapshotId} - } - if ($snappath -eq "") { - $snappath = $thissnap.Name - } else { - $snappath = $thissnap.Name + "\" + $snappath - } - $pool.provisioning_settings.snapshot_path = $snappath - $pool.provisioning_settings.resource_pool_name = $goldVM.ResourcePool - $pool.provisioning_settings.datacenter_name = (Get-View "Datacenter-$($pool.provisioning_settings.datacenter_id)").Name - $basefolderpath = "" - $thisfolder = Get-View "Folder-$($pool.provisioning_settings.vm_folder_id)" - while ($thisfolder.parentsnapshotid.length -gt 0) { + $pool.provisioning_settings.snapshot_path = $snappath + $pool.provisioning_settings.resource_pool_name = $goldVM.ResourcePool + $pool.provisioning_settings.datacenter_name = (Get-View "Datacenter-$($pool.provisioning_settings.datacenter_id)").Name + $basefolderpath = "" + $thisfolder = Get-View "Folder-$($pool.provisioning_settings.vm_folder_id)" + while ($thisfolder.parentsnapshotid.length -gt 0) { + if ($basefolderpath -eq "") { + $basefolderpath = $thisfolder.Name + } else { + $basefolderpath = $thisfolder.Name + "\" + $basefolderpath + } + $thisfolder = Get-View "Folder-$($thisfolder.Parent)" + } if ($basefolderpath -eq "") { $basefolderpath = $thisfolder.Name } else { $basefolderpath = $thisfolder.Name + "\" + $basefolderpath } - $thisfolder = Get-View "Folder-$($thisfolder.Parent)" - } - if ($basefolderpath -eq "") { - $basefolderpath = $thisfolder.Name - } else { - $basefolderpath = $thisfolder.Name + "\" + $basefolderpath - } - $pool.provisioning_settings.base_folder_path = $basefolderpath - $datastores = @() - foreach ($datastore in $pool.storage_settings.datastores) { - $thisds = Get-View -Id "Datastore-$($datastore.datastore_id)" - $datastore.name = $thisds.Name - $datastores += $thisds.Name + $pool.provisioning_settings.base_folder_path = $basefolderpath + $datastores = @() + foreach ($datastore in $pool.storage_settings.datastores) { + $thisds = Get-View -Id "Datastore-$($datastore.datastore_id)" + $datastore.name = $thisds.Name + $datastores += $thisds.Name + } } $pool.GpuEnabled = ($pool.display_protocol_settings.vgpu_grid_profile.Length -gt 0); @@ -554,7 +565,7 @@ Function Get-HorizonADUser { if ($Name -ne "") { $extension = "?group_only=false&filter={`"type`":`"Equals`",`"name`":`"user_principal_name`",`"value`":`"$Name`"}" } - + $userlookupURI += $extension if ($global:kishorizondebug) { @@ -562,7 +573,14 @@ Function Get-HorizonADUser { } try { + if ($global:kishorizondebug) { + Write-Host URI: $userlookupURI + Write-Host body: $body + } $users = Invoke-RestMethod -Method Get -Uri $userlookupURI -Headers $request_header -SkipCertificateCheck + if ($global:kishorizondebug) { + Write-Host $users + } } catch { throw "ERROR accessing $userlookupURI`nStatusCode: $($_.Exception.Response.StatusCode.value__)`nStatusDescription: $($_.Exception.Response.StatusDescription)" } @@ -570,58 +588,6 @@ Function Get-HorizonADUser { return $users } -<# Function Get-HorizonADGroup { - param ( - [parameter(Mandatory = $true, ValueFromPipeline = $true)] $Horizon, - [string]$Domain = "", - [string]$Id = "", - [string]$Name = "", - [int]$Page = 0, - [int]$PageSize = 0 - ) - $token = $Horizon.access_token - $server = $Horizon.server_name - - $request_header = $global:request_header - $request_header += @{"authorization"="Bearer $token"} - - $grouplookupURI = "https://$server/rest/external/v1/ad-users-or-groups" - - $extension = ""; - - if ($domain -ne "") { - $extension = "?group_only=true&filter={`"type`":`"Equals`",`"name`":`"domain`",`"value`":`"$domain`"}" - if ($Page -ne 0) { - $extension += "&page=$Page" - if ($PageSize -ne 0) { - $extension += "&size=$PageSize" - } - } - } - - if ($Id -ne "") { - $extension = "/$($Id)?group_only=true" - } - - if ($Name -ne "") { - $extension = "?group_only=true&filter={`"type`":`"Equals`",`"name`":`"name`",`"value`":`"$Name`"}" - } - - $grouplookupURI += $extension - - if ($global:kishorizondebug) { - Write-Host $MyInvocation.MyCommand.Name Starting - } - - try { - $users = Invoke-RestMethod -Method Get -Uri $grouplookupURI -Headers $request_header -SkipCertificateCheck - } catch { - throw "ERROR accessing $grouplookupURI`nStatusCode: $($_.Exception.Response.StatusCode.value__)`nStatusDescription: $($_.Exception.Response.StatusDescription)" - } - - return $users -} #> - function Invoke-SSHCommand { param ( [Parameter(Mandatory)] @@ -671,6 +637,133 @@ function Get-HorizonSessionConnectedLength { return $retval; } +function Add-HorizonMachineToPool { + param ( + [parameter(Mandatory = $true, ValueFromPipeline = $true)] $Horizon, + [parameter(Mandatory = $true)][string[]] $MachineName, + [parameter(Mandatory = $true)] $PoolName + ) + $token = $Horizon.access_token + $server = $Horizon.server_name + + $request_header = $global:request_header + $request_header += @{"authorization"="Bearer $token"} + + $PoolID = (Get-HorizonDesktopPool -Horizon $Horizon -PoolName $PoolName).id + + $machineAddURI = "https://$server/rest/inventory/v1/desktop-pools/$PoolID/action/add-machines-by-name" + + if ($global:kishorizondebug) { + Write-Host $MyInvocation.MyCommand.Name Starting + } + + $body = @{ + machine_names = $MachineName + } | ConvertTo-Json + + try { + $result = Invoke-RestMethod -Method Post -Uri $machineAddURI -body $body -Headers $request_header -SkipCertificateCheck + } catch { + throw "ERROR accessing $machineAddURI`nStatusCode: $($_.Exception.Response.StatusCode.value__)`nStatusDescription: $($_.Exception.Response.StatusDescription)" + } + + return $result +} + +function Grant-HorizonDesktop { + param ( + [parameter(Mandatory = $true, ValueFromPipeline = $true)] $Horizon, + [parameter(Mandatory = $true)] $MachineName, + [parameter(Mandatory = $true)] $UserUPN + ) + $token = $Horizon.access_token + $server = $Horizon.server_name + + $request_header = $global:request_header + $request_header += @{"authorization"="Bearer $token"} + + if ($global:kishorizondebug) { + Write-Host $MyInvocation.MyCommand.Name Starting + } + + $MachineID = (Get-HorizonMachine -Horizon $Horizon | where {$_.name -eq $MachineName}).id + if ($global:kishorizondebug) { + Write-Host MachineID: $MachineID + } + if ($MachineID -eq $null) { + return [PSCustomObject]@{ + Success = $false + Message = Machine $MachneName does not exist in any desktop pool. + } + } + $UserID = (Get-HorizonAdUser -Horizon $Horizon -Name $UserUPN).id + if ($global:kishorizondebug) { + Write-Host UserID: $UserID + } + if ($UserID -eq $null) { + return [PSCustomObject]@{ + Success = $false + Message = User $UserUPN cannot be found. + } + } + + $desktopAssignURI = "https://$server/rest/inventory/v1/machines/$MachineID/action/assign-users" + + $body = "[ ""$UserID"" ]" + if ($global:kishorizondebug) { + Write-Host body: $body + } + + try { + $result = Invoke-RestMethod -Method Post -Uri $desktopAssignURI -body $body -Headers $request_header -SkipCertificateCheck + } catch { + throw "ERROR accessing $desktopAssignURI`nStatusCode: $($_.Exception.Response.StatusCode.value__)`nStatusDescription: $($_.Exception.Response.StatusDescription)" + } + + return $result +} + +function Revoke-HorizonDesktop { + param ( + [parameter(Mandatory = $true, ValueFromPipeline = $true)] $Horizon, + [parameter(Mandatory = $true)] $MachineName + ) + $token = $Horizon.access_token + $server = $Horizon.server_name + + $request_header = $global:request_header + $request_header += @{"authorization"="Bearer $token"} + + if ($global:kishorizondebug) { + Write-Host $MyInvocation.MyCommand.Name Starting + } + + $MachineID = (Get-HorizonMachine -Horizon $Horizon | where {$_.name -eq $MachineName}).id + if ($global:kishorizondebug) { + Write-Host MachineID: $MachineID + } + if ($MachineID -eq $null) { + return [PSCustomObject]@{ + Success = $false + Message = Machine $MachneName does not exist in any desktop pool. + } + } + + $desktopRevokeURI = "https://$server/rest/inventory/v1/machines/$MachineID/action/assign-users" + + $body = "[ ""$UserID"" ]" + if ($global:kishorizondebug) { + Write-Host body: $body + } + + try { + $result = Invoke-RestMethod -Method Post -Uri $desktopAssignURI -body $body -Headers $request_header -SkipCertificateCheck + } catch { + throw "ERROR accessing $desktopAssignURI`nStatusCode: $($_.Exception.Response.StatusCode.value__)`nStatusDescription: $($_.Exception.Response.StatusDescription)" + } + + return $result +} Export-ModuleMember -Function Connect-HorizonServer Export-ModuleMember -Function Get-HorizonVcenter @@ -685,4 +778,6 @@ Export-ModuleMember -Function Get-HorizonSessionLength Export-ModuleMember -Function Get-HorizonKeyAgreement Export-ModuleMember -Function Get-HorizonEntitlements Export-ModuleMember -Function Get-HorizonEntitlementDetail +Export-ModuleMember -Function Add-HorizonMachineToPool +Export-ModuleMember -Function Grant-HorizonDesktop