Update KISHorizon.psm1

This commit is contained in:
ackitsme committed 2026-09-11 15:34:49 -07:00
1 parent a3badc4f9e
commit 8ca2a1bd4b
1 file changed
+185 -90
+185 -90
View File
@@ -130,6 +130,10 @@ function Get-HorizonMachine {
$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);
@@ -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