From af6e4e23ced53452790021e288d434c167819b29 Mon Sep 17 00:00:00 2001 From: Jason Masten Date: Wed, 7 Feb 2024 16:18:41 -0500 Subject: [PATCH] Added AVD (#844) --- src/bicep/add-ons/AVD/README.md | 1 - src/bicep/add-ons/azureVirtualDesktop/LICENSE | 21 + .../add-ons/azureVirtualDesktop/README.md | 32 + .../artifacts/Get-Validations.ps1 | 260 + .../Install-AzurePowerShellAzModule.ps1 | 43 + .../artifacts/Set-AutomationRunbook.ps1 | 69 + .../artifacts/Set-AvdDrainMode.ps1 | 87 + .../artifacts/Set-FileShareScaling.ps1 | 73 + .../artifacts/Set-HostPoolScaling.ps1 | 846 ++ .../artifacts/Set-NtfsPermissions.ps1 | 287 + .../Set-SessionHostConfiguration.ps1 | 535 + .../artifacts/Update-AvdDesktop.ps1 | 53 + .../artifacts/Update-AvdWorkspace.ps1 | 59 + .../azureVirtualDesktop/data/locations.json | 396 + .../data/resourceAbbreviations.json | 26 + .../azureVirtualDesktop/docs/design.md | 23 + .../azureVirtualDesktop/docs/design/naming.md | 5 + .../azureVirtualDesktop/docs/features.md | 19 + .../autoIncreasePremiumFileShareQuota.md | 35 + .../docs/features/backups.md | 32 + .../docs/features/drainMode.md | 30 + .../docs/features/fslogix.md | 44 + .../azureVirtualDesktop/docs/features/gpu.md | 32 + .../docs/features/highAvailability.md | 29 + .../docs/features/monitoring.md | 35 + .../docs/features/scalingTool.md | 35 + .../docs/features/serverSideEncryption.md | 34 + .../docs/features/smbMultiChannel.md | 25 + .../docs/features/startVmOnConnect.md | 30 + .../docs/features/trustedLaunch.md | 39 + .../docs/features/validation.md | 31 + .../azureVirtualDesktop/docs/prerequisites.md | 60 + .../docs/troubleshooting.md | 7 + .../images/identifiers.png | Bin 0 -> 85461 bytes .../images/identifiers.vsdx | Bin 0 -> 164462 bytes .../azureVirtualDesktop/images/resources.png | Bin 0 -> 138980 bytes .../azureVirtualDesktop/images/resources.vsdx | Bin 0 -> 187262 bytes .../azureVirtualDesktop/images/stamps.png | Bin 0 -> 202290 bytes .../azureVirtualDesktop/images/stamps.vsdx | Bin 0 -> 165140 bytes .../modules/cleanUp/cleanUp.bicep | 19 + .../cleanUp/removeVirtualMachine.bicep | 59 + .../common/customScriptExtensions.bicep | 38 + .../modules/common/roleAssignment.bicep | 12 + .../controlPlane/applicationGroup.bicep | 59 + .../modules/controlPlane/controlPlane.bicep | 98 + .../modules/controlPlane/hostPool.bicep | 120 + .../modules/controlPlane/workspace.bicep | 114 + .../fslogix/azureFiles/azureFiles.bicep | 270 + .../fslogix/azureFiles/protectedItems.bicep | 19 + .../fslogix/azureFiles/recoveryServices.bicep | 39 + .../modules/fslogix/azureFiles/shares.bicep | 13 + .../modules/fslogix/azureNetAppFiles.bicep | 157 + .../modules/fslogix/fslogix.bicep | 140 + .../azureVirtualDesktop/modules/hub/hub.bicep | 41 + .../modules/hub/virtualNetwork.bicep | 7 + .../modules/hub/workspace.bicep | 52 + .../azureVirtualDesktop/modules/logic.bicep | 93 + .../modules/management/artifacts.bicep | 38 + .../autoIncreasePremiumFileShareQuota.bicep | 75 + .../management/automationAccount.bicep | 121 + .../management/customerManagedKeys.bicep | 171 + .../modules/management/diskAccess.bicep | 37 + .../management/diskEncryptionSet.bicep | 36 + .../modules/management/jobSchedules.bicep | 54 + .../modules/management/management.bicep | 339 + .../modules/management/monitoring.bicep | 536 + .../modules/management/policy.bicep | 71 + .../modules/management/policyAssignment.bicep | 17 + .../management/recoveryServicesVault.bicep | 139 + .../modules/management/scalingTool.bicep | 106 + .../modules/management/schedules.bicep | 37 + .../management/userAssignedIdentity.bicep | 13 + .../modules/management/virtualMachine.bicep | 256 + .../network/networkSecurityGroup.bicep | 26 + .../modules/network/networking.bicep | 123 + .../modules/network/userDefinedRoute.bicep | 26 + .../modules/network/virtualNetwork.bicep | 41 + .../network/virtualNetworkPeering.bicep | 16 + .../modules/resourceGroup.bicep | 11 + .../modules/resourceNames.bicep | 154 + .../sessionHosts/availabilitySets.bicep | 18 + .../modules/sessionHosts/protectedItems.bicep | 22 + .../sessionHosts/recoveryServices.bicep | 37 + .../modules/sessionHosts/sessionHosts.bicep | 228 + .../sessionHosts/virtualMachines.bicep | 447 + .../azureVirtualDesktop/parameters.json | 225 + .../azureVirtualDesktop/solution.bicep | 659 + .../add-ons/azureVirtualDesktop/solution.json | 11543 ++++++++++++++++ .../azureVirtualDesktop/uiDefinition.json | 1612 +++ 89 files changed, 21916 insertions(+), 1 deletion(-) delete mode 100644 src/bicep/add-ons/AVD/README.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/LICENSE create mode 100644 src/bicep/add-ons/azureVirtualDesktop/README.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/artifacts/Get-Validations.ps1 create mode 100644 src/bicep/add-ons/azureVirtualDesktop/artifacts/Install-AzurePowerShellAzModule.ps1 create mode 100644 src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-AutomationRunbook.ps1 create mode 100644 src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-AvdDrainMode.ps1 create mode 100644 src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-FileShareScaling.ps1 create mode 100644 src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-HostPoolScaling.ps1 create mode 100644 src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-NtfsPermissions.ps1 create mode 100644 src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-SessionHostConfiguration.ps1 create mode 100644 src/bicep/add-ons/azureVirtualDesktop/artifacts/Update-AvdDesktop.ps1 create mode 100644 src/bicep/add-ons/azureVirtualDesktop/artifacts/Update-AvdWorkspace.ps1 create mode 100644 src/bicep/add-ons/azureVirtualDesktop/data/locations.json create mode 100644 src/bicep/add-ons/azureVirtualDesktop/data/resourceAbbreviations.json create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/design.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/design/naming.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/autoIncreasePremiumFileShareQuota.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/backups.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/drainMode.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/fslogix.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/gpu.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/highAvailability.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/monitoring.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/scalingTool.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/serverSideEncryption.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/smbMultiChannel.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/startVmOnConnect.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/trustedLaunch.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/features/validation.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/prerequisites.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/docs/troubleshooting.md create mode 100644 src/bicep/add-ons/azureVirtualDesktop/images/identifiers.png create mode 100644 src/bicep/add-ons/azureVirtualDesktop/images/identifiers.vsdx create mode 100644 src/bicep/add-ons/azureVirtualDesktop/images/resources.png create mode 100644 src/bicep/add-ons/azureVirtualDesktop/images/resources.vsdx create mode 100644 src/bicep/add-ons/azureVirtualDesktop/images/stamps.png create mode 100644 src/bicep/add-ons/azureVirtualDesktop/images/stamps.vsdx create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/cleanUp/cleanUp.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/cleanUp/removeVirtualMachine.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/common/customScriptExtensions.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/common/roleAssignment.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/controlPlane/applicationGroup.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/controlPlane/controlPlane.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/controlPlane/hostPool.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/controlPlane/workspace.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/fslogix/azureFiles/azureFiles.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/fslogix/azureFiles/protectedItems.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/fslogix/azureFiles/recoveryServices.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/fslogix/azureFiles/shares.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/fslogix/azureNetAppFiles.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/fslogix/fslogix.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/hub/hub.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/hub/virtualNetwork.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/hub/workspace.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/logic.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/artifacts.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/autoIncreasePremiumFileShareQuota.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/automationAccount.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/customerManagedKeys.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/diskAccess.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/diskEncryptionSet.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/jobSchedules.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/management.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/monitoring.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/policy.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/policyAssignment.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/recoveryServicesVault.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/scalingTool.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/schedules.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/userAssignedIdentity.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/management/virtualMachine.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/network/networkSecurityGroup.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/network/networking.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/network/userDefinedRoute.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/network/virtualNetwork.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/network/virtualNetworkPeering.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/resourceGroup.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/resourceNames.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/sessionHosts/availabilitySets.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/sessionHosts/protectedItems.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/sessionHosts/recoveryServices.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/sessionHosts/sessionHosts.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/modules/sessionHosts/virtualMachines.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/parameters.json create mode 100644 src/bicep/add-ons/azureVirtualDesktop/solution.bicep create mode 100644 src/bicep/add-ons/azureVirtualDesktop/solution.json create mode 100644 src/bicep/add-ons/azureVirtualDesktop/uiDefinition.json diff --git a/src/bicep/add-ons/AVD/README.md b/src/bicep/add-ons/AVD/README.md deleted file mode 100644 index 8b1378917..000000000 --- a/src/bicep/add-ons/AVD/README.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/bicep/add-ons/azureVirtualDesktop/LICENSE b/src/bicep/add-ons/azureVirtualDesktop/LICENSE new file mode 100644 index 000000000..14d34a0bb --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Jason Masten + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/bicep/add-ons/azureVirtualDesktop/README.md b/src/bicep/add-ons/azureVirtualDesktop/README.md new file mode 100644 index 000000000..de3a661ad --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/README.md @@ -0,0 +1,32 @@ +# Azure Virtual Desktop Solution + +[**Home**](./README.md) | [**Features**](./docs/features.md) | [**Design**](./docs/design.md) | [**Prerequisites**](./docs/prerequisites.md) | [**Troubleshooting**](./docs/troubleshooting.md) + +This Azure Virtual Desktop (AVD) solution will deploy a fully operational [stamp](https://learn.microsoft.com/azure/architecture/patterns/deployment-stamp) in an Azure subscription adhereing to the [Zero Trust principles](https://learn.microsoft.com/security/zero-trust/azure-infrastructure-avd). Many of the [common features](./docs/features.md) used with AVD have been automated in this solution for your convenience. Be sure to complete the necessary [prerequisites](./docs/prerequisites.md) and to review the parameter descriptions to the understand the consequences of your selections. + +## Deployment Options + +> [!WARNING] +> Failure to complete the [prerequisites](./docs/prerequisites.md) will result in an unsuccessful deployment. + +### Azure Portal + +[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#blade/Microsoft_Azure_CreateUIDef/CustomDeploymentBlade/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fjamasten%2FAzureVirtualDesktop%2Fmain%2Fsolution.json/uiFormDefinitionUri/https%3A%2F%2Fraw.githubusercontent.com%2Fjamasten%2FAzureVirtualDesktop%2Fmain%2FuiDefinition.json) +[![Deploy to Azure Gov](https://aka.ms/deploytoazuregovbutton)](https://portal.azure.us/#blade/Microsoft_Azure_CreateUIDef/CustomDeploymentBlade/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fjamasten%2FAzureVirtualDesktop%2Fmain%2Fsolution.json/uiFormDefinitionUri/https%3A%2F%2Fraw.githubusercontent.com%2Fjamasten%2FAzureVirtualDesktop%2Fmain%2FuiDefinition.json) + +### PowerShell + +````powershell +New-AzDeployment ` + -Location '' ` + -TemplateFile 'https://raw.githubusercontent.com/jamasten/AzureVirtualDesktop/main/solution.json' ` + -Verbose +```` + +### Azure CLI + +````cli +az deployment sub create \ + --location '' \ + --template-uri 'https://raw.githubusercontent.com/jamasten/AzureVirtualDesktop/main/solution.json' +```` diff --git a/src/bicep/add-ons/azureVirtualDesktop/artifacts/Get-Validations.ps1 b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Get-Validations.ps1 new file mode 100644 index 000000000..5a1457b88 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Get-Validations.ps1 @@ -0,0 +1,260 @@ +[Cmdletbinding()] +Param( + [parameter(Mandatory)] + [string] + $ActiveDirectorySolution, + + [parameter(Mandatory)] + [int] + $CpuCountMax, + + [parameter(Mandatory)] + [int] + $CpuCountMin, + + [parameter(Mandatory)] + [string] + $DomainName, + + [parameter(Mandatory)] + [string] + $Environment, + + [parameter(Mandatory)] + [string] + $ImageDefinitionResourceId, + + [parameter(Mandatory)] + [string] + $Location, + + [parameter(Mandatory)] + [int] + $SessionHostCount, + + [parameter(Mandatory)] + [string] + $StorageService, + + [parameter(Mandatory)] + [string] + $SubscriptionId, + + [parameter(Mandatory)] + [string] + $TenantId, + + [parameter(Mandatory)] + [string] + $UserAssignedIdentityClientId, + + [parameter(Mandatory)] + [string] + $VirtualMachineSize, + + [parameter(Mandatory)] + [string] + $VirtualNetworkName, + + [parameter(Mandatory)] + [string] + $VirtualNetworkResourceGroupName, + + [parameter(Mandatory)] + [string] + $WorkspaceNamePrefix, + + [parameter(Mandatory)] + [string] + $WorkspaceResourceGroupName +) + +function Write-Log +{ + param( + [parameter(Mandatory)] + [string]$Message, + + [parameter(Mandatory)] + [string]$Type + ) + $Path = 'C:\cse.txt' + if(!(Test-Path -Path $Path)) + { + New-Item -Path 'C:\' -Name 'cse.txt' | Out-Null + } + $Timestamp = Get-Date -Format 'MM/dd/yyyy HH:mm:ss.ff' + $Entry = '[' + $Timestamp + '] [' + $Type + '] ' + $Message + $Entry | Out-File -FilePath $Path -Append +} + +$ErrorActionPreference = 'Stop' +$WarningPreference = 'SilentlyContinue' + +try +{ + Connect-AzAccount -Environment $Environment -Tenant $TenantId -Subscription $SubscriptionId -Identity -AccountId $UserAssignedIdentityClientId | Out-Null + $Sku = Get-AzComputeResourceSku -Location $Location | Where-Object {$_.ResourceType -eq "virtualMachines" -and $_.Name -eq $VirtualMachineSize} + + ############################################################## + # Accelerated Networking Validation + ############################################################## + $AcceleratedNetworking = ($Sku.capabilities | Where-Object {$_.name -eq "AcceleratedNetworkingEnabled"}).value + Write-Log -Message "Accelerated Networking Validation Succeeded" -Type 'INFO' + + ############################################################## + # Availability Zone Validation + ############################################################## + $AvailabilityZones = $Sku.locationInfo.zones | Sort-Object + Write-Log -Message "Availability Zone Validation Succeeded" -Type 'INFO' + + ############################################################## + # Azure NetApp Files Validation + ############################################################## + if($StorageService -eq 'AzureNetAppFiles') + { + $Vnet = Get-AzVirtualNetwork -Name $VirtualNetworkName -ResourceGroupName $VirtualNetworkResourceGroupName + $DnsServers = $Vnet.DhcpOptions.DnsServers -join ',' + $SubnetId = ($Vnet.Subnets | Where-Object {$_.Delegations[0].ServiceName -eq "Microsoft.NetApp/volumes"}).Id + if($null -eq $SubnetId -or $SubnetId -eq "") + { + Write-Error -Exception "INVALID AZURE NETAPP FILES CONFIGURATION: A dedicated subnet must be delegated to the ANF resource provider." + } + $DeployAnfAd = "true" + $Accounts = Get-AzResource -ResourceType "Microsoft.NetApp/netAppAccounts" | Where-Object {$_.Location -eq $Location} + if($Accounts.Count -gt 0) + { + $AnfAdCounter = 0 + foreach($Account in $Accounts) + { + $Params = @{ + ResourceGroupName = $Account.ResourceGroupName + ResourceProviderName = 'Microsoft.NetApp' + ResourceType = 'netAppAccounts' + Name = $Account.Name + ApiVersion = '2023-07-01' + Method = 'GET' + } + $AD = ((Invoke-AzRestMethod @Params).Content | ConvertFrom-Json).properties.activeDirectories.activeDirectoryId + if($AD) + { + $AnfAdCounter++ + } + } + if($AnfAdCounter -gt 0) + { + $DeployAnfAd = "false" + } + } + Write-Log -Message "Azure NetApp Files Validation Succeeded" -Type 'INFO' + } + + ############################################################## + # Disk SKU Validation + ############################################################## + if(($Sku.capabilities | Where-Object {$_.name -eq "PremiumIO"}).value -eq $false) + { + Write-Error -Exception "INVALID DISK SKU: The selected VM Size does not support the Premium SKU for managed disks." + } + Write-Log -Message "Disk SKU Validation Succeeded" -Type 'INFO' + + ############################################################## + # Hyper-V Generation Validation + ############################################################## + if(($Sku.capabilities | Where-Object {$_.name -eq "HyperVGenerations"}).value -notlike "*2") + { + Write-Error -Exception "INVALID HYPER-V GENERATION: The selected VM size does not support the selected Image Sku." + } + Write-Log -Message "Hyper-V Generation Validation Succeeded" -Type 'INFO' + + ############################################################## + # Kerberos Encryption Validation + ############################################################## + if($ActiveDirectorySolution -eq 'MicrosoftEntraDomainServices') + { + $KerberosRc4Encryption = (Get-AzResource -Name $DomainName -ExpandProperties).Properties.domainSecuritySettings.kerberosRc4Encryption + if($KerberosRc4Encryption -eq "Enabled") + { + Write-Error -Exception "INVALID KERBEROS ENCRYPTION: The Kerberos Encryption on Azure AD DS does not match your Kerberos Encyrption selection." + } + Write-Log -Message "Kerberos Encryption Validation Succeeded" -Type 'INFO' + } + + ############################################################## + # Trusted Launch Validation + ############################################################## + # Validates the VM Size does not have Trusted Launch disabled and has Hyper-V Generation enabled + # https://learn.microsoft.com/azure/virtual-machines/trusted-launch-faq?tabs=PowerShell#how-can-i-find-vm-sizes-that-support-trusted-launch + $TrustedLaunchDisabled = $Sku.Capabilities | Where-Object {$_.Name -eq "TrustedLaunchDisabled"} | Select-Object -ExpandProperty Value + $HyperVGeneration = $Sku.Capabilities | Where-Object {$_.Name -eq "HyperVGenerations"} | Select-Object -ExpandProperty Value + + if($TrustedLaunchDisabled -or $HyperVGeneration -eq "V1") + { + Write-Error -Exception "INVALID TRUSTED LAUNCH: The selected VM Size does not support Trusted Launch." + } + + # Validates the custom image if applicable + # https://learn.microsoft.com/en-us/azure/virtual-machines/trusted-launch-faq?tabs=PowerShell#how-can-i-validate-if-os-image-supports-trusted-launch + if($ImageDefinitionResourceId -ne 'NotApplicable') + { + $ImageDefinition = Get-AzGalleryImageDefinition -ResourceId $ImageDefinitionResourceId + $SecurityType = ($ImageDefinition.Features | Where-Object {$_.Name -eq 'SecurityType'}).Value + $HyperVGeneration = $ImageDefinition.HyperVGeneration + if($SecurityType -notlike "*TrustedLaunch*" -or $HyperVGeneration -notlike "*V2*") + { + Write-Error -Exception "INVALID TRUSTED LAUNCH: The selected Image Definition does not support Trusted Launch." + } + } + Write-Log -Message "Trusted Launch Validation Succeeded" -Type 'INFO' + + + ############################################################## + # vCPU Count Validation + ############################################################## + # Recommended minimum vCPU is 4 for multisession hosts and 2 for single session hosts. + # Recommended maximum vCPU is 32 for multisession hosts and 128 for single session hosts. + # https://learn.microsoft.com/windows-server/remote/remote-desktop-services/virtual-machine-recs + $vCPUs = [int]($Sku.capabilities | Where-Object {$_.name -eq "vCPUs"}).value + if($vCPUs -lt $CpuCountMin -or $vCPUs -gt $CpuCountMax) + { + Write-Error -Exception "INVALID VCPU COUNT: The selected VM Size does not contain the appropriate amount of vCPUs for Azure Virtual Desktop. https://learn.microsoft.com/windows-server/remote/remote-desktop-services/virtual-machine-recs" + } + Write-Log -Message "vCPU Count Validation Succeeded" -Type 'INFO' + + ############################################################## + # vCPU Quota Validation + ############################################################## + $RequestedCores = $vCPUs * $SessionHostCount + $Family = (Get-AzComputeResourceSku -Location $Location | Where-Object {$_.Name -eq $VirtualMachineSize}).Family + $CpuData = Get-AzVMUsage -Location $Location | Where-Object {$_.Name.Value -eq $Family} + $AvailableCores = $CpuData.Limit - $CpuData.CurrentValue; $RequestedCores = $vCPUs * $SessionHostCount + if($RequestedCores -gt $AvailableCores) + { + Write-Error -Exception "INSUFFICIENT CORE QUOTA: The selected VM size, $VirtualMachineSize, does not have adequate core quota in the selected location." + } + Write-Log -Message "vCPU Quota Validation Succeeded" -Type 'INFO' + + ############################################################## + # AVD Workspace Validation + ############################################################## + $Workspace = Get-AzResource -ResourceGroupName $WorkspaceResourceGroupName -ResourceName $($WorkspaceNamePrefix + '-feed') + Write-Log -Message "Existing Workspace Validation Succeeded" -Type 'INFO' + + Disconnect-AzAccount | Out-Null + + $Output = [pscustomobject][ordered]@{ + acceleratedNetworking = $AcceleratedNetworking.ToLower() + anfDnsServers = if($StorageService -eq "AzureNetAppFiles"){$DnsServers}else{"NotApplicable"} + anfSubnetId = if($StorageService -eq "AzureNetAppFiles"){$SubnetId}else{"NotApplicable"} + anfActiveDirectory = if($StorageService -eq "AzureNetAppFiles"){$DeployAnfAd}else{"false"} + availabilityZones = $AvailabilityZones + existingWorkspace = if($Workspace){"true"}else{"false"} + } + $JsonOutput = $Output | ConvertTo-Json + return $JsonOutput +} +catch +{ + Write-Log -Message $_ -Type 'ERROR' + throw +} \ No newline at end of file diff --git a/src/bicep/add-ons/azureVirtualDesktop/artifacts/Install-AzurePowerShellAzModule.ps1 b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Install-AzurePowerShellAzModule.ps1 new file mode 100644 index 000000000..99cc16517 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Install-AzurePowerShellAzModule.ps1 @@ -0,0 +1,43 @@ +[Cmdletbinding()] +Param( + [parameter(Mandatory)] + [string] + $Installer +) + +function Write-Log +{ + param( + [parameter(Mandatory)] + [string]$Message, + + [parameter(Mandatory)] + [string]$Type + ) + $Path = 'C:\cse.txt' + if(!(Test-Path -Path $Path)) + { + New-Item -Path 'C:\' -Name 'cse.txt' | Out-Null + } + $Timestamp = Get-Date -Format 'MM/dd/yyyy HH:mm:ss.ff' + $Entry = '[' + $Timestamp + '] [' + $Type + '] ' + $Message + $Entry | Out-File -FilePath $Path -Append +} + +$ErrorActionPreference = 'Stop' +$WarningPreference = 'SilentlyContinue' + +try +{ + Start-Process -FilePath 'msiexec.exe' -ArgumentList "/i $Installer /quiet /qn /norestart /passive" -Wait -Passthru | Out-Null + Write-Log -Message 'Installed Azure PowerShell AZ Module' -Type 'INFO' + $Output = [pscustomobject][ordered]@{ + installer = $Installer + } + $Output | ConvertTo-Json +} +catch +{ + Write-Log -Message $_ -Type 'ERROR' + throw +} \ No newline at end of file diff --git a/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-AutomationRunbook.ps1 b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-AutomationRunbook.ps1 new file mode 100644 index 000000000..96dd55dc3 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-AutomationRunbook.ps1 @@ -0,0 +1,69 @@ +[Cmdletbinding()] +Param ( + + [parameter(Mandatory)] + [string] + $AutomationAccountName, + + [parameter(Mandatory)] + [string] + $Environment, + + [parameter(Mandatory)] + [string] + $ResourceGroupName, + + [parameter(Mandatory)] + [string] + $RunbookFileName, + + [parameter(Mandatory)] + [string] + $SubscriptionId, + + [parameter(Mandatory)] + [string] + $TenantId, + + [parameter(Mandatory)] + [string] + $UserAssignedIdentityClientId + +) + +$ErrorActionPreference = 'Stop' +$WarningPreference = 'SilentlyContinue' + +try +{ + Connect-AzAccount ` + -Environment $Environment ` + -Tenant $TenantId ` + -Subscription $SubscriptionId ` + -Identity ` + -AccountId $UserAssignedIdentityClientId | Out-Null + + + Import-AzAutomationRunbook ` + -Name $RunbookFileName.Replace('.ps1','') ` + -Path $RunbookFileName ` + -Type 'PowerShell' ` + -AutomationAccountName $AutomationAccountName ` + -ResourceGroupName $ResourceGroupName ` + -Published ` + -Force | Out-Null + + $Output = [pscustomobject][ordered]@{ + runbook = $RunBookName + } + + Disconnect-AzAccount | Out-Null + + $JsonOutput = $Output | ConvertTo-Json + return $JsonOutput +} +catch +{ + Write-Host $_ | Select-Object * + throw +} diff --git a/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-AvdDrainMode.ps1 b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-AvdDrainMode.ps1 new file mode 100644 index 000000000..d8c1016c9 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-AvdDrainMode.ps1 @@ -0,0 +1,87 @@ +[Cmdletbinding()] +Param( + [parameter(Mandatory)] + [string] + $Environment, + + [parameter(Mandatory)] + [string] + $HostPoolName, + + [parameter(Mandatory)] + [string] + $HostPoolResourceGroupName, + + [parameter(Mandatory)] + [int] + $SessionHostCount, + + [parameter(Mandatory)] + [int] + $SessionHostIndex, + + [parameter(Mandatory)] + [string] + $SubscriptionId, + + [parameter(Mandatory)] + [string] + $TenantId, + + [parameter(Mandatory)] + [string] + $UserAssignedIdentityClientId, + + [parameter(Mandatory)] + [string] + $VirtualMachineNamePrefix +) + +function Write-Log +{ + param( + [parameter(Mandatory)] + [string]$Message, + + [parameter(Mandatory)] + [string]$Type + ) + $Path = 'C:\cse.txt' + if(!(Test-Path -Path $Path)) + { + New-Item -Path 'C:\' -Name 'cse.txt' | Out-Null + } + $Timestamp = Get-Date -Format 'MM/dd/yyyy HH:mm:ss.ff' + $Entry = '[' + $Timestamp + '] [' + $Type + '] ' + $Message + $Entry | Out-File -FilePath $Path -Append +} + +$ErrorActionPreference = 'Stop' +$WarningPreference = 'SilentlyContinue' + +try +{ + Connect-AzAccount -Environment $Environment -Tenant $TenantId -Subscription $SubscriptionId -Identity -AccountId $UserAssignedIdentityClientId | Out-Null + $SessionHosts = (Get-AzWvdSessionHost -ResourceGroupName $HostPoolResourceGroupName -HostPoolName $HostPoolName).Name + for($i = $SessionHostIndex; $i -lt $($SessionHostIndex + $SessionHostCount); $i++) + { + $VmNameFull = $VirtualMachineNamePrefix + $i.ToString().PadLeft(4,'0') + $SessionHostName = ($SessionHosts | Where-Object {$_ -like "*$VmNameFull*"}).Replace("$HostPoolName/", '') + Update-AzWvdSessionHost -ResourceGroupName $HostPoolResourceGroupName -HostPoolName $HostPoolName -Name $SessionHostName -AllowNewSession:$False | Out-Null + Write-Log -Message "Drain Mode set successfully for session host, $SessionHostName" -Type 'INFO' + } + Write-Log -Message 'Drain Mode Succeeded' -Type 'INFO' + $Output = [pscustomobject][ordered]@{ + hostPool = $HostPoolName + } + + Disconnect-AzAccount | Out-Null + + $JsonOutput = $Output | ConvertTo-Json + return $JsonOutput +} +catch +{ + Write-Log -Message $_ -Type 'ERROR' + throw +} \ No newline at end of file diff --git a/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-FileShareScaling.ps1 b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-FileShareScaling.ps1 new file mode 100644 index 000000000..a91e6923e --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-FileShareScaling.ps1 @@ -0,0 +1,73 @@ +[CmdletBinding(SupportsShouldProcess)] +param( + [Parameter(Mandatory)] + [string]$Environment, + + [Parameter(Mandatory)] + [string]$FileShareName, + + [Parameter(Mandatory)] + [string]$ResourceGroupName, + + [Parameter(Mandatory)] + [string]$StorageAccountName, + + [Parameter(Mandatory)] + [string]$SubscriptionId +) + +$ErrorActionPreference = 'Stop' + +# Connect to Azure and Import Az Module +Import-Module -Name 'Az.Accounts' +Import-Module -Name 'Az.Storage' +Connect-AzAccount -Environment $Environment -Subscription $SubscriptionId -Identity | Out-Null + +# Get file share +$PFS = Get-AzRmStorageShare -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName -Name $FileShareName -GetShareUsage + +# Get provisioned capacity and used capacity +$ProvisionedCapacity = $PFS.QuotaGiB +$UsedCapacity = $PFS.ShareUsageBytes +Write-Output "[$StorageAccountName] [$FileShareName] Share Capacity: $($ProvisionedCapacity)GB" +Write-Output "[$StorageAccountName] [$FileShareName] Share Usage: $([math]::Round($UsedCapacity/1GB, 0))GB" + +# Get storage account +$StorageAccount = Get-AzStorageAccount -ResourceGroupName $ResourceGroupName -AccountName $StorageAccountName + +# GB Based Scaling +# No scaling if no usage +if($UsedCapacity -eq 0) +{ + Write-Output "[$StorageAccountName] [$FileShareName] Share Usage is 0GB. No Changes." +} +# Slow scaling up to 500GB +# Increases share quota by 100GB if less than 50GB remains on the share +# This allows time for an AVD Stamp to be rolled out +elseif ($ProvisionedCapacity -lt 500) +{ + if (($ProvisionedCapacity - ($UsedCapacity / ([Math]::Pow(2,30)))) -lt 50) { + Write-Output "[$StorageAccountName] [$FileShareName] Share Usage has surpassed the Share Quota remaining threshold of 50GB. Increasing the file share quota by 100GB." + $Quota = $ProvisionedCapacity + 100 + Update-AzRmStorageShare -StorageAccount $StorageAccount -Name $FileShareName -QuotaGiB $Quota | Out-Null + Write-Output "[$StorageAccountName] [$FileShareName] New Capacity: $($Quota)GB" + } + else { + Write-Output "[$StorageAccountName] [$FileShareName] Share Usage is below Share Quota remaining threshold of 50GB. No Changes." + } +} +# Aggressive scaling +# Increases share quota by 500GB if less than 500GB remains on the share +# This ensures plenty of space is available during mass onboarding +else +{ + if (($ProvisionedCapacity - ($UsedCapacity / ([Math]::Pow(2,30)))) -lt 500) { + Write-Output "[$StorageAccountName] [$FileShareName] Share Usage has surpassed the Share Quota remaining threshold of 500GB. Increasing the file share quota by 500GB." + $Quota = $ProvisionedCapacity + 500 + Update-AzRmStorageShare -StorageAccount $StorageAccount -Name $FileShareName -QuotaGiB $Quota | Out-Null + Write-Output "[$StorageAccountName] [$FileShareName] New Capacity: $($Quota)GB" + } + else { + Write-Output "[$StorageAccountName] [$FileShareName] Share Usage is below Share Quota remaining threshold of 500GB. No Changes." + } +} \ No newline at end of file diff --git a/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-HostPoolScaling.ps1 b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-HostPoolScaling.ps1 new file mode 100644 index 000000000..90298f1cc --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-HostPoolScaling.ps1 @@ -0,0 +1,846 @@ +[CmdletBinding(SupportsShouldProcess)] +param( + [Parameter(Mandatory)] + [string]$BeginPeakTime, + + [Parameter(Mandatory)] + [string]$EndPeakTime, + + [Parameter(Mandatory)] + [string]$EnvironmentName, + + [Parameter(Mandatory)] + [string]$HostPoolName, + + [Parameter(Mandatory)] + [int]$LimitSecondsToForceLogOffUser, + + [Parameter(Mandatory)] + [string]$LogOffMessageBody, + + [Parameter(Mandatory)] + [string]$LogOffMessageTitle, + + [Parameter(Mandatory)] + [string]$MaintenanceTagName, + + [Parameter(Mandatory)] + [int]$MinimumNumberOfRDSH, + + [Parameter(Mandatory)] + [string]$ResourceGroupName, + + [Parameter(Mandatory)] + [double]$SessionThresholdPerCPU, + + [Parameter(Mandatory)] + [string]$SubscriptionId, + + [Parameter(Mandatory)] + [string]$TenantId, + + [Parameter(Mandatory)] + [string]$TimeDifference +) + +try +{ + [int]$StatusCheckTimeOut = (60 * 60) # 1 hr + [string[]]$DesiredRunningStates = @('Available', 'NeedsAssistance') + [string[]]$TimeDiffHrsMin = "$($TimeDifference):0".Split(':') + + + #region helper/common functions, set exec policies, set TLS 1.2 security protocol, log rqt params + # Function to return local time converted from UTC + function Get-LocalDateTime + { + return (Get-Date).ToUniversalTime().AddHours($TimeDiffHrsMin[0]).AddMinutes($TimeDiffHrsMin[1]) + } + + function Write-Log + { + # Note: this is required to support param such as ErrorAction + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true)] + [string]$Message, + + [switch]$Err, + + [switch]$Warn, + + [Parameter(Mandatory = $true)] + [string]$HostPoolName + ) + + [string]$MessageTimeStamp = (Get-LocalDateTime).ToString('yyyy-MM-dd HH:mm:ss') + $Message = "[$($MyInvocation.ScriptLineNumber)] [$($HostPoolName)] $Message" + [string]$WriteMessage = "[$($MessageTimeStamp)] $Message" + + if ($Err) + { + Write-Error $WriteMessage + $Message = "ERROR: $Message" + } + elseif ($Warn) + { + Write-Warning $WriteMessage + $Message = "WARN: $Message" + } + else + { + Write-Output $WriteMessage + } + } + + function Set-nVMsToStartOrStop + { + param ( + [Parameter(Mandatory = $true)] + [int]$nRunningVMs, + + [Parameter(Mandatory = $true)] + [int]$nRunningCores, + + [Parameter(Mandatory = $true)] + [int]$nUserSessions, + + [Parameter(Mandatory = $true)] + [int]$MaxUserSessionsPerVM, + + [switch]$InPeakHours, + + [Parameter(Mandatory = $true)] + [hashtable]$Res + ) + + # check if need to adjust min num of running session hosts required if the number of user sessions is close to the max allowed by the min num of running session hosts required + [double]$MaxUserSessionsThreshold = 0.9 + [int]$MaxUserSessionsThresholdCapacity = [math]::Floor($MinimumNumberOfRDSH * $MaxUserSessionsPerVM * $MaxUserSessionsThreshold) + if ($nUserSessions -gt $MaxUserSessionsThresholdCapacity) + { + $MinimumNumberOfRDSH = [math]::Ceiling($nUserSessions / ($MaxUserSessionsPerVM * $MaxUserSessionsThreshold)) + Write-Log -HostPoolName $HostPoolName -Message "Number of user sessions is more than $($MaxUserSessionsThreshold * 100) % of the max number of sessions allowed with minimum number of running session hosts required ($MaxUserSessionsThresholdCapacity). Adjusted minimum number of running session hosts required to $MinimumNumberOfRDSH" + } + + # Check if minimum number of session hosts are running + if ($nRunningVMs -lt $MinimumNumberOfRDSH) + { + $res.nVMsToStart = $MinimumNumberOfRDSH - $nRunningVMs + Write-Log -HostPoolName $HostPoolName -Message "Number of running session host is less than minimum required. Need to start $($res.nVMsToStart) VMs" + } + + if ($InPeakHours) + { + [double]$nUserSessionsPerCore = $nUserSessions / $nRunningCores + # In peak hours: check if current capacity is meeting the user demands + if ($nUserSessionsPerCore -gt $SessionThresholdPerCPU) + { + $res.nCoresToStart = [math]::Ceiling(($nUserSessions / $SessionThresholdPerCPU) - $nRunningCores) + Write-Log -HostPoolName $HostPoolName -Message "[In peak hours] Number of user sessions per Core is more than the threshold. Need to start $($res.nCoresToStart) cores" + } + + return + } + + if ($nRunningVMs -gt $MinimumNumberOfRDSH) + { + # Calculate the number of session hosts to stop + $res.nVMsToStop = $nRunningVMs - $MinimumNumberOfRDSH + Write-Log -HostPoolName $HostPoolName -Message "[Off peak hours] Number of running session host is greater than minimum required. Need to stop $($res.nVMsToStop) VMs" + } + } + + # Function to wait for background jobs + function Wait-ForJobs + { + param ([array]$Jobs = @()) + + Write-Log -HostPoolName $HostPoolName -Message "Wait for $($Jobs.Count) jobs" + $StartTime = Get-Date + [string]$StatusInfo = '' + while ($true) + { + if ((Get-Date).Subtract($StartTime).TotalSeconds -ge $StatusCheckTimeOut) + { + throw "Jobs status check timed out. Taking more than $StatusCheckTimeOut seconds. $StatusInfo" + } + $StatusInfo = "[Check jobs status] Total: $($Jobs.Count), $(($Jobs | Group-Object State | ForEach-Object { "$($_.Name): $($_.Count)" }) -join ', ')" + Write-Log -HostPoolName $HostPoolName -Message $StatusInfo + if (!($Jobs | Where-Object { $_.State -ieq 'Running' })) + { + break + } + Start-Sleep -Seconds 30 + } + + [array]$IncompleteJobs = @($Jobs | Where-Object { $_.State -ine 'Completed' }) + if ($IncompleteJobs) + { + throw "$($IncompleteJobs.Count)/$($Jobs.Count) jobs did not complete successfully: $($IncompleteJobs | Format-List -Force | Out-String)" + } + } + + function Get-SessionHostName + { + param ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + $SessionHost + ) + + return $SessionHost.Name.Split('/')[-1] + } + + function TryUpdateSessionHostDrainMode + { + [CmdletBinding(SupportsShouldProcess)] + param ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [hashtable]$VM, + + [switch]$AllowNewSession + ) + Begin { } + Process + { + $SessionHost = $VM.SessionHost + if ($SessionHost.AllowNewSession -eq $AllowNewSession) + { + return + } + + [string]$SessionHostName = $VM.SessionHostName + Write-Log -HostPoolName $HostPoolName -Message "Update session host '$SessionHostName' to set allow new sessions to $AllowNewSession" + if ($PSCmdlet.ShouldProcess($SessionHostName, "Update session host to set allow new sessions to $AllowNewSession")) + { + try + { + $SessionHost = $VM.SessionHost = Update-AzWvdSessionHost -ResourceGroupName $ResourceGroupName -Name $SessionHostName -AllowNewSession:$AllowNewSession + + if ($SessionHost.AllowNewSession -ne $AllowNewSession) + { + throw $SessionHost + } + } + catch + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "Failed to update the session host '$SessionHostName' to set allow new sessions to $($AllowNewSession): $($PSItem | Format-List -Force | Out-String)" + } + } + } + End { } + } + + function TryForceLogOffUser + { + [CmdletBinding(SupportsShouldProcess)] + param ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + $Session + ) + Begin { } + Process + { + [string[]]$Toks = $Session.Name.Split('/') + [string]$SessionHostName = $Toks[1] + [string]$SessionID = $Toks[-1] + [string]$User = $Session.ActiveDirectoryUserName + + try + { + Write-Log -HostPoolName $HostPoolName -Message "Force log off user: '$User', session ID: $SessionID" + if ($PSCmdlet.ShouldProcess($SessionID, 'Force log off user with session ID')) + { + # Note: -SessionHostName param is case sensitive, so the command will fail if it's case is modified + Remove-AzWvdUserSession -ResourceGroupName $ResourceGroupName -SessionHostName $SessionHostName -Id $SessionID -Force + } + } + catch + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "Failed to force log off user: '$User', session ID: $SessionID $($PSItem | Format-List -Force | Out-String)" + } + } + End { } + } + + function TryResetSessionHostDrainModeAndUserSessions + { + [CmdletBinding(SupportsShouldProcess)] + param ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [hashtable]$VM + ) + Begin { } + Process + { + TryUpdateSessionHostDrainMode -VM $VM -AllowNewSession:$true + + $SessionHost = $VM.SessionHost + [string]$SessionHostName = $VM.SessionHostName + if (!$SessionHost.Session) + { + return + } + + Write-Log -HostPoolName $HostPoolName -Warn -Message "Session host '$SessionHostName' still has $($SessionHost.Session) sessions left behind in broker DB" + + [array]$UserSessions = @() + Write-Log -HostPoolName $HostPoolName -Message "Get all user sessions from session host '$SessionHostName'" + try + { + $UserSessions = @(Get-AzWvdUserSession -ResourceGroupName $ResourceGroupName -SessionHostName $SessionHostName) + } + catch + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "Failed to retrieve user sessions of session host '$SessionHostName': $($PSItem | Format-List -Force | Out-String)" + return + } + + Write-Log -HostPoolName $HostPoolName -Message "Force log off $($UserSessions.Count) users on session host: '$SessionHostName'" + $UserSessions | TryForceLogOffUser + } + End { } + } + + Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope Process -Force -Confirm:$false + if (!$SkipAuth) + { + # Note: this requires admin priviledges + Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine -Force -Confirm:$false + } + + # Note: https://stackoverflow.com/questions/41674518/powershell-setting-security-protocol-to-tls-1-2 + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + + Write-Log -HostPoolName $HostPoolName -Message "Request params: $($RqtParams | Format-List -Force | Out-String)" + #endregion + + + #region azure auth, ctx + # Azure auth + $AzContext = $null + try + { + $AzAuth = Connect-AzAccount -Environment $EnvironmentName -Tenant $TenantId -Subscription $SubscriptionId -Identity + if (!$AzAuth -or !$AzAuth.Context) { + throw $AzAuth + } + $AzContext = $AzAuth.Context + } + catch + { + throw [System.Exception]::new('Failed to authenticate Azure with application ID, tenant ID, subscription ID', $PSItem.Exception) + } + Write-Log -HostPoolName $HostPoolName -Message "Successfully authenticated with Azure using service principal: $($AzContext | Format-List -Force | Out-String)" + #endregion + + + #region validate host pool, validate / update HostPool load balancer type, ensure there is at least 1 session host, get num of user sessions + # Validate and get HostPool info + $HostPool = $null + try + { + Write-Log -HostPoolName $HostPoolName -Message "Get Hostpool info of '$HostPoolName' in resource group '$ResourceGroupName'" + $HostPool = Get-AzWvdHostPool -ResourceGroupName $ResourceGroupName -Name $HostPoolName + + if (!$HostPool) + { + throw $HostPool + } + } + catch + { + throw [System.Exception]::new("Failed to get Hostpool info of '$HostPoolName' in resource group '$ResourceGroupName'. Ensure that you have entered the correct values", $PSItem.Exception) + } + + # Ensure HostPool load balancer type is not persistent + if ($HostPool.LoadBalancerType -ieq 'Persistent') + { + throw "HostPool '$HostPoolName' is configured with 'Persistent' load balancer type. Scaling tool only supports these load balancer types: BreadthFirst, DepthFirst" + } + + Write-Log -HostPoolName $HostPoolName -Message 'Get all session hosts' + + $SessionHosts = @(Get-AzWvdSessionHost -ResourceGroupName $ResourceGroupName -HostPoolName $HostPoolName) + + if (!$SessionHosts) + { + Write-Log -HostPoolName $HostPoolName -Message "There are no session hosts in the Hostpool '$HostPoolName'. Ensure that hostpool has session hosts" + Write-Log -HostPoolName $HostPoolName -Message 'End' + return + } + + Write-Log -HostPoolName $HostPoolName -Message 'Get number of user sessions in Hostpool' + + [int]$nUserSessions = @(Get-AzWvdUserSession -ResourceGroupName $ResourceGroupName -HostPoolName $HostPoolName).Count + + # Set up breadth 1st load balacing type + # Note: breadth 1st is enforced on AND off peak hours to simplify the things with scaling in the start/end of peak hours + if (!$SkipUpdateLoadBalancerType -and $HostPool.LoadBalancerType -ine 'BreadthFirst') + { + Write-Log -HostPoolName $HostPoolName -Message "Update HostPool with 'BreadthFirst' load balancer type (current: '$($HostPool.LoadBalancerType)')" + if ($PSCmdlet.ShouldProcess($HostPoolName, "Update HostPool with BreadthFirstLoadBalancer type (current: '$($HostPool.LoadBalancerType)')")) + { + $HostPool = Update-AzWvdHostPool -ResourceGroupName $ResourceGroupName -Name $HostPoolName -LoadBalancerType 'BreadthFirst' + } + } + + Write-Log -HostPoolName $HostPoolName -Message "HostPool info: $($HostPool | Format-List -Force | Out-String)" + Write-Log -HostPoolName $HostPoolName -Message "Number of session hosts in the HostPool: $($SessionHosts.Count)" + #endregion + + + #region determine if on/off peak hours + # Convert local time, begin peak time & end peak time from UTC to local time + $CurrentDateTime = Get-LocalDateTime + $BeginPeakDateTime = [datetime]::Parse($CurrentDateTime.ToShortDateString() + ' ' + $BeginPeakTime) + $EndPeakDateTime = [datetime]::Parse($CurrentDateTime.ToShortDateString() + ' ' + $EndPeakTime) + + # Adjust peak times to make sure begin peak time is always before end peak time + if ($EndPeakDateTime -lt $BeginPeakDateTime) + { + if ($CurrentDateTime -lt $EndPeakDateTime) + { + $BeginPeakDateTime = $BeginPeakDateTime.AddDays(-1) + } + else + { + $EndPeakDateTime = $EndPeakDateTime.AddDays(1) + } + } + + Write-Log -HostPoolName $HostPoolName -Message "Using current time: $($CurrentDateTime.ToString('yyyy-MM-dd HH:mm:ss')), begin peak time: $($BeginPeakDateTime.ToString('yyyy-MM-dd HH:mm:ss')), end peak time: $($EndPeakDateTime.ToString('yyyy-MM-dd HH:mm:ss'))" + + [bool]$InPeakHours = ($BeginPeakDateTime -le $CurrentDateTime -and $CurrentDateTime -le $EndPeakDateTime) + if ($InPeakHours) + { + Write-Log -HostPoolName $HostPoolName -Message 'In peak hours' + } + else + { + Write-Log -HostPoolName $HostPoolName -Message 'Off peak hours' + } + #endregion + + + #region get all session hosts, VMs & user sessions info and compute workload + # Note: session host is considered "running" if its running AND is in desired states AND allowing new sessions + # Number of session hosts that are running, are in desired states and allowing new sessions + [int]$nRunningVMs = 0 + # Number of cores that are running, are in desired states and allowing new sessions + [int]$nRunningCores = 0 + # Object that contains all session host objects, VM instance objects except the ones that are under maintenance + $VMs = @{ } + # Object that contains the number of cores for each VM size SKU + $VMSizeCores = @{ } + # Number of user sessions reported by each session host that is running, is in desired state and allowing new sessions + [int]$nUserSessionsFromAllRunningVMs = 0 + + # Populate all session hosts objects + foreach ($SessionHost in $SessionHosts) + { + [string]$SessionHostName = Get-SessionHostName -SessionHost $SessionHost + $VMs.Add($SessionHostName.Split('.')[0].ToLower(), @{ 'SessionHostName' = $SessionHostName; 'SessionHost' = $SessionHost; 'Instance' = $null }) + } + + Write-Log -HostPoolName $HostPoolName -Message 'Get all VMs, check session host status and get usage info' + foreach ($VMInstance in (Get-AzVM -Status)) + { + if (!$VMs.ContainsKey($VMInstance.Name.ToLower())) + { + # This VM is not a WVD session host + continue + } + [string]$VMName = $VMInstance.Name.ToLower() + if ($VMInstance.Tags.Keys -contains $MaintenanceTagName) + { + Write-Log -HostPoolName $HostPoolName -Message "VM '$VMName' is in maintenance and will be ignored" + $VMs.Remove($VMName) + continue + } + + $VM = $VMs[$VMName] + $SessionHost = $VM.SessionHost + if (($SessionHost.VirtualMachineId) -and $VMInstance.VmId -ine $SessionHost.VirtualMachineId) + { + # This VM is not a WVD session host + continue + } + + if ($VM.Instance) + { + throw "More than 1 VM found in Azure with same session host name '$($VM.SessionHostName)' (This is not supported): $($VMInstance | Format-List -Force | Out-String)$($VM.Instance | Format-List -Force | Out-String)" + } + + $VM.Instance = $VMInstance + + Write-Log -HostPoolName $HostPoolName -Message "Session host: '$($VM.SessionHostName)', power state: '$($VMInstance.PowerState)', status: '$($SessionHost.Status)', update state: '$($SessionHost.UpdateState)', sessions: $($SessionHost.Session), allow new session: $($SessionHost.AllowNewSession)" + # Check if we know how many cores are in this VM + if (!$VMSizeCores.ContainsKey($VMInstance.HardwareProfile.VmSize)) + { + Write-Log -HostPoolName $HostPoolName -Message "Get all VM sizes in location: $($VMInstance.Location)" + foreach ($VMSize in (Get-AzVMSize -Location $VMInstance.Location)) + { + if (!$VMSizeCores.ContainsKey($VMSize.Name)) + { + $VMSizeCores.Add($VMSize.Name, $VMSize.NumberOfCores) + } + } + } + + if ($VMInstance.PowerState -ieq 'VM running') + { + if ($SessionHost.Status -notin $DesiredRunningStates) + { + Write-Log -HostPoolName $HostPoolName -Warn -Message 'VM is in running state but session host is not and so it will be ignored (this could be because the VM was just started and has not connected to broker yet)' + } + if (!$SessionHost.AllowNewSession) + { + Write-Log -HostPoolName $HostPoolName -Warn -Message 'VM is in running state but session host is not allowing new sessions and so it will be ignored' + } + + if ($SessionHost.Status -in $DesiredRunningStates -and $SessionHost.AllowNewSession) + { + ++$nRunningVMs + $nRunningCores += $VMSizeCores[$VMInstance.HardwareProfile.VmSize] + $nUserSessionsFromAllRunningVMs += $SessionHost.Session + } + } + else + { + if ($SessionHost.Status -in $DesiredRunningStates) + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "VM is not in running state but session host is (this could be because the VM was just stopped and broker doesn't know that yet)" + } + } + } + + if ($nUserSessionsFromAllRunningVMs -ne $nUserSessions) + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "Sum of user sessions reported by every running session host ($nUserSessionsFromAllRunningVMs) is not equal to the total number of user sessions reported by the host pool ($nUserSessions)" + } + + $nUserSessions = $nUserSessionsFromAllRunningVMs + # Check if we need to override the number of user sessions for simulation / testing purpose + if ($null -ne $OverrideNUserSessions) + { + $nUserSessions = $OverrideNUserSessions + } + + # Make sure VM instance was found in Azure for every session host + [int]$nVMsWithoutInstance = @($VMs.Values | Where-Object { !$_.Instance }).Count + if ($nVMsWithoutInstance) + { + throw "There are $nVMsWithoutInstance/$($VMs.Count) session hosts whose VM instance was not found in Azure" + } + + if (!$nRunningCores) + { + $nRunningCores = 1 + } + + Write-Log -HostPoolName $HostPoolName -Message "Number of running session hosts: $nRunningVMs of total $($VMs.Count)" + Write-Log -HostPoolName $HostPoolName -Message "Number of user sessions: $nUserSessions of total allowed $($nRunningVMs * $HostPool.MaxSessionLimit)" + Write-Log -HostPoolName $HostPoolName -Message "Number of user sessions per Core: $($nUserSessions / $nRunningCores), threshold: $SessionThresholdPerCPU" + Write-Log -HostPoolName $HostPoolName -Message "Minimum number of running session hosts required: $MinimumNumberOfRDSH" + + # Check if minimum num of running session hosts required is higher than max allowed + if ($VMs.Count -le $MinimumNumberOfRDSH) + { + Write-Log -HostPoolName $HostPoolName -Warn -Message 'Minimum number of RDSH is set higher than or equal to total number of session hosts' + } + #endregion + + + #region determine number of session hosts to start/stop if any + # Now that we have all the info about the session hosts & their usage, figure how many session hosts to start/stop depending on in/off peak hours and the demand [Ops = operations to perform] + $Ops = @{ + nVMsToStart = 0 + nCoresToStart = 0 + nVMsToStop = 0 + } + + Set-nVMsToStartOrStop -nRunningVMs $nRunningVMs -nRunningCores $nRunningCores -nUserSessions $nUserSessions -MaxUserSessionsPerVM $HostPool.MaxSessionLimit -InPeakHours:$InPeakHours -Res $Ops + #endregion + + + #region start any session hosts if need to + # Check if we have any session hosts to start + if ($Ops.nVMsToStart -or $Ops.nCoresToStart) + { + if ($nRunningVMs -eq $VMs.Count) + { + Write-Log -HostPoolName $HostPoolName -Message 'All session hosts are running' + Write-Log -HostPoolName $HostPoolName -Message 'End' + return + } + + # Object that contains names of session hosts that will be started + # $StartSessionHostFullNames = @{ } + # Array that contains jobs of starting the session hosts + [array]$StartVMjobs = @() + + Write-Log -HostPoolName $HostPoolName -Message 'Find session hosts that are stopped and allowing new sessions' + foreach ($VM in $VMs.Values) + { + if (!$Ops.nVMsToStart -and !$Ops.nCoresToStart) + { + # Done with starting session hosts that needed to be + break + } + if ($VM.Instance.PowerState -ieq 'VM running') + { + continue + } + if ($VM.SessionHost.UpdateState -ine 'Succeeded') + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "Session host '$($VM.SessionHostName)' may not be healthy" + } + + [string]$SessionHostName = $VM.SessionHostName + + if (!$VM.SessionHost.AllowNewSession) + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "Session host '$SessionHostName' is not allowing new sessions and so it will not be started" + continue + } + + Write-Log -HostPoolName $HostPoolName -Message "Start session host '$SessionHostName' as a background job" + if ($PSCmdlet.ShouldProcess($SessionHostName, 'Start session host as a background job')) + { + # $StartSessionHostFullNames.Add($VM.SessionHost.Name, $null) + $StartVMjobs += ($VM.Instance | Start-AzVM -AsJob) + } + + --$Ops.nVMsToStart + if ($Ops.nVMsToStart -lt 0) + { + $Ops.nVMsToStart = 0 + } + + $Ops.nCoresToStart -= $VMSizeCores[$VM.Instance.HardwareProfile.VmSize] + if ($Ops.nCoresToStart -lt 0) + { + $Ops.nCoresToStart = 0 + } + } + + # Check if there were enough number of session hosts to start + if ($Ops.nVMsToStart -or $Ops.nCoresToStart) + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "Not enough session hosts to start. Still need to start maximum of either $($Ops.nVMsToStart) VMs or $($Ops.nCoresToStart) cores" + } + + # Wait for those jobs to start the session hosts + Wait-ForJobs $StartVMjobs + + Write-Log -HostPoolName $HostPoolName -Message 'All jobs completed' + Write-Log -HostPoolName $HostPoolName -Message 'End' + return + } + #endregion + + + #region stop any session hosts if need to + if (!$Ops.nVMsToStop) + { + Write-Log -HostPoolName $HostPoolName -Message 'No need to start/stop any session hosts' + Write-Log -HostPoolName $HostPoolName -Message 'End' + return + } + + # Object that contains names of session hosts that will be stopped + # $StopSessionHostFullNames = @{ } + # Array that contains jobs of stopping the session hosts + [array]$StopVMjobs = @() + $VMsToStop = @{ } + [array]$VMsToStopAfterLogOffTimeOut = @() + + Write-Log -HostPoolName $HostPoolName -Message 'Find session hosts that are running and allowing new sessions, sort them by number of user sessions' + foreach ($VM in ($VMs.Values | Where-Object { $_.Instance.PowerState -ieq 'VM running' -and $_.SessionHost.AllowNewSession } | Sort-Object { $_.SessionHost.Session })) + { + if (!$Ops.nVMsToStop) + { + # Done with stopping session hosts that needed to be + break + } + $SessionHost = $VM.SessionHost + [string]$SessionHostName = $VM.SessionHostName + + if ($SessionHost.Session -and !$LimitSecondsToForceLogOffUser) + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "Session host '$SessionHostName' has $($SessionHost.Session) sessions but limit seconds to force log off user is set to 0, so will not stop any more session hosts (https://aka.ms/wvdscale#how-the-scaling-tool-works)" + # Note: why break ? Because the list this loop iterates through is sorted by number of sessions, if it hits this, the rest of items in the loop will also hit this + break + } + + TryUpdateSessionHostDrainMode -VM $VM -AllowNewSession:$false + $SessionHost = $VM.SessionHost + + # Note: check if there were new user sessions since session host info was 1st fetched + if ($SessionHost.Session -and !$LimitSecondsToForceLogOffUser) + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "Session host '$SessionHostName' has $($SessionHost.Session) sessions but limit seconds to force log off user is set to 0, so will not stop any more session hosts (https://aka.ms/wvdscale#how-the-scaling-tool-works)" + TryUpdateSessionHostDrainMode -VM $VM -AllowNewSession:$true + $SessionHost = $VM.SessionHost + continue + } + + if ($SessionHost.Session) + { + [array]$VM.UserSessions = @() + Write-Log -HostPoolName $HostPoolName -Message "Get all user sessions from session host '$SessionHostName'" + try + { + # Note: Get-AzWvdUserSession roundtrips the input param SessionHostName and its case, so if lower case is specified, command will return lower case as well + $VM.UserSessions = @(Get-AzWvdUserSession -ResourceGroupName $ResourceGroupName -HostPoolName $HostPoolName -SessionHostName $SessionHostName) + } + catch + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "Failed to retrieve user sessions of session host '$SessionHostName': $($PSItem | Format-List -Force | Out-String)" + } + + Write-Log -HostPoolName $HostPoolName -Message "Send log off message to active user sessions on session host: '$SessionHostName'" + foreach ($Session in $VM.UserSessions) + { + if($Session.SessionState -ine 'Active') + { + continue + } + + [string]$SessionID = $Session.Name.Split('/')[-1] + [string]$User = $Session.ActiveDirectoryUserName + + try + { + Write-Log -HostPoolName $HostPoolName -Message "Send a log off message to user: '$User', session ID: $SessionID" + if ($PSCmdlet.ShouldProcess($SessionID, 'Send a log off message to user with session ID')) + { + # Note: -SessionHostName param is case sensitive, so the command will fail if it's case is modified + Send-AzWvdUserSessionMessage -ResourceGroupName $ResourceGroupName -HostPoolName $HostPoolName -SessionHostName $SessionHostName -UserSessionId $SessionID -MessageTitle $LogOffMessageTitle -MessageBody "$LogOffMessageBody You will be logged off in $LimitSecondsToForceLogOffUser seconds" + } + } + catch + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "Failed to send a log off message to user: '$User', session ID: $SessionID $($PSItem | Format-List -Force | Out-String)" + } + } + $VMsToStopAfterLogOffTimeOut += $VM + } + else + { + Write-Log -HostPoolName $HostPoolName -Message "Stop session host '$SessionHostName' as a background job" + if ($PSCmdlet.ShouldProcess($SessionHostName, 'Stop session host as a background job')) + { + # $StopSessionHostFullNames.Add($SessionHost.Name, $null) + $StopVMjobs += ($VM.StopJob = $VM.Instance | Stop-AzVM -Force -AsJob) + $VMsToStop.Add($SessionHostName, $VM) + } + } + + --$Ops.nVMsToStop + if ($Ops.nVMsToStop -lt 0) { + $Ops.nVMsToStop = 0 + } + } + + if ($VMsToStopAfterLogOffTimeOut) + { + Write-Log -HostPoolName $HostPoolName -Message "Wait $LimitSecondsToForceLogOffUser seconds for users to log off" + if ($PSCmdlet.ShouldProcess("for $LimitSecondsToForceLogOffUser seconds", 'Wait for users to log off')) + { + Start-Sleep -Seconds $LimitSecondsToForceLogOffUser + } + + Write-Log -HostPoolName $HostPoolName -Message "Force log off users and stop remaining $($VMsToStopAfterLogOffTimeOut.Count) session hosts" + foreach ($VM in $VMsToStopAfterLogOffTimeOut) + { + [string]$SessionHostName = $VM.SessionHostName + + Write-Log -HostPoolName $HostPoolName -Message "Force log off $($VM.UserSessions.Count) users on session host: '$SessionHostName'" + $VM.UserSessions | TryForceLogOffUser + + Write-Log -HostPoolName $HostPoolName -Message "Stop session host '$SessionHostName' as a background job" + if ($PSCmdlet.ShouldProcess($SessionHostName, 'Stop session host as a background job')) + { + # $StopSessionHostFullNames.Add($VM.SessionHost.Name, $null) + $StopVMjobs += ($VM.StopJob = $VM.Instance | Stop-AzVM -Force -AsJob) + $VMsToStop.Add($SessionHostName, $VM) + } + } + } + + # Check if there were enough number of session hosts to stop + if ($Ops.nVMsToStop) + { + Write-Log -HostPoolName $HostPoolName -Warn -Message "Not enough session hosts to stop. Still need to stop $($Ops.nVMsToStop) VMs" + } + + # Wait for those jobs to stop the session hosts + Write-Log -HostPoolName $HostPoolName -Message "Wait for $($StopVMjobs.Count) jobs" + $StartTime = Get-Date + while ($true) + { + if ((Get-Date).Subtract($StartTime).TotalSeconds -ge $StatusCheckTimeOut) + { + break + } + if (!($StopVMjobs | Where-Object { $_.State -ieq 'Running' })) + { + break + } + + Write-Log -HostPoolName $HostPoolName -Message "[Check jobs status] Total: $($StopVMjobs.Count), $(($StopVMjobs | Group-Object State | ForEach-Object { "$($_.Name): $($_.Count)" }) -join ', ')" + + $VMstoResetDrainModeAndSessions = @($VMsToStop.Values | Where-Object { $_.StopJob.State -ine 'Running' }) + foreach ($VM in $VMstoResetDrainModeAndSessions) + { + TryResetSessionHostDrainModeAndUserSessions -VM $VM + $VMsToStop.Remove($VM.SessionHostName) + } + if (!$VMstoResetDrainModeAndSessions) + { + Start-Sleep -Seconds 30 + } + } + + [string]$StopVMJobsStatusInfo = "[Check jobs status] Total: $($StopVMjobs.Count), $(($StopVMjobs | Group-Object State | ForEach-Object { "$($_.Name): $($_.Count)" }) -join ', ')" + Write-Log -HostPoolName $HostPoolName -Message $StopVMJobsStatusInfo + + $VMsToStop.Values | TryResetSessionHostDrainModeAndUserSessions + + if ((Get-Date).Subtract($StartTime).TotalSeconds -ge $StatusCheckTimeOut) + { + throw "Jobs status check timed out. Taking more than $StatusCheckTimeOut seconds. $StopVMJobsStatusInfo" + } + + [array]$IncompleteJobs = @($StopVMjobs | Where-Object { $_.State -ine 'Completed' }) + if ($IncompleteJobs) + { + throw "$($IncompleteJobs.Count)/$($StopVMjobs.Count) jobs did not complete successfully: $($IncompleteJobs | Format-List -Force | Out-String)" + } + + Write-Log -HostPoolName $HostPoolName -Message 'All jobs completed' + Write-Log -HostPoolName $HostPoolName -Message 'End' + return + #endregion +} +catch +{ + $ErrContainer = $PSItem + # $ErrContainer = $_ + + [string]$ErrMsg = $ErrContainer | Format-List -Force | Out-String + $ErrMsg += "Version: $Version`n" + + if (Get-Command 'Write-Log' -ErrorAction:SilentlyContinue) + { + Write-Log -HostPoolName $HostPoolName -Err -Message $ErrMsg -ErrorAction:Continue + } + else + { + Write-Error $ErrMsg -ErrorAction:Continue + } + + throw [System.Exception]::new($ErrMsg, $ErrContainer.Exception) +} \ No newline at end of file diff --git a/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-NtfsPermissions.ps1 b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-NtfsPermissions.ps1 new file mode 100644 index 000000000..01c9ba3a5 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-NtfsPermissions.ps1 @@ -0,0 +1,287 @@ +param +( + [Parameter(Mandatory=$false)] + [String]$ActiveDirectorySolution, + + [Parameter(Mandatory=$false)] + [String]$DomainAccountType = "ComputerAccount", + + [Parameter(Mandatory)] + [String]$DomainJoinPassword, + + [Parameter(Mandatory)] + [String]$DomainJoinUserPrincipalName, + + [Parameter(Mandatory=$false)] + [String]$Environment, + + [Parameter(Mandatory)] + [String]$FslogixContainerType, + + [Parameter(Mandatory=$false)] + [String]$Netbios, + + [Parameter(Mandatory=$false)] + [String]$OrganizationalUnitPath, + + [Parameter(Mandatory=$false)] + [String]$ResourceNameSuffix, + + [Parameter(Mandatory)] + [String]$SecurityPrincipalNames, + + [Parameter(Mandatory=$false)] + [String]$SmbServerLocation, + + [Parameter(Mandatory=$false)] + [String]$StorageAccountPrefix, + + [Parameter(Mandatory=$false)] + [String]$StorageAccountResourceGroupName, + + [Parameter(Mandatory=$false)] + [Int]$StorageCount, + + [Parameter(Mandatory=$false)] + [Int]$StorageIndex, + + [Parameter(Mandatory)] + [String]$StorageService, + + [Parameter(Mandatory=$false)] + [String]$StorageSuffix, + + [Parameter(Mandatory=$false)] + [String]$SubscriptionId, + + [Parameter(Mandatory=$false)] + [String]$TenantId, + + [Parameter(Mandatory=$false)] + [String]$UserAssignedIdentityClientId +) + +function Write-Log +{ + param( + [parameter(Mandatory)] + [string]$Message, + + [parameter(Mandatory)] + [string]$Type + ) + $Path = 'C:\cse.txt' + if(!(Test-Path -Path $Path)) + { + New-Item -Path C:\ -Name cse.txt | Out-Null + } + $Timestamp = Get-Date -Format 'MM/dd/yyyy HH:mm:ss.ff' + $Entry = '[' + $Timestamp + '] [' + $Type + '] ' + $Message + $Entry | Out-File -FilePath $Path -Append +} + +$ErrorActionPreference = 'Stop' +$WarningPreference = 'SilentlyContinue' + +try +{ + ############################################################## + # Install Prerequisites + ############################################################## + # Install Active Directory PowerShell module + if($StorageService -eq 'AzureNetAppFiles' -or ($StorageService -eq 'AzureFiles' -and $ActiveDirectorySolution -eq 'ActiveDirectoryDomainServices')) + { + $RsatInstalled = (Get-WindowsFeature -Name 'RSAT-AD-PowerShell').Installed + if(!$RsatInstalled) + { + Install-WindowsFeature -Name 'RSAT-AD-PowerShell' | Out-Null + Write-Log -Message "Installation of the AD module succeeded" -Type 'INFO' + } + else + { + Write-Log -Message "AD module already exists" -Type 'INFO' + } + } + + + ############################################################## + # Variables + ############################################################## + # Convert Security Principal Names from a JSON array to a PowerShell array + [array]$SecurityPrincipalNames = $SecurityPrincipalNames.Replace("'",'"') | ConvertFrom-Json + Write-Log -Message "Security Principal Names:" -Type 'INFO' + $SecurityPrincipalNames | Add-Content -Path 'C:\cse.txt' -Force | Out-Null + + # Selects the appropraite share names based on the FslogixContainerType param from the deployment + $Shares = switch($FslogixContainerType) + { + 'CloudCacheProfileContainer' {@('profile-containers')} + 'CloudCacheProfileOfficeContainer' {@('office-containers','profile-containers')} + 'ProfileContainer' {@('profile-containers')} + 'ProfileOfficeContainer' {@('office-containers','profile-containers')} + } + + if($StorageService -eq 'AzureNetAppFiles' -or ($StorageService -eq 'AzureFiles' -and $ActiveDirectorySolution -eq 'ActiveDirectoryDomainServices')) + { + # Create Domain credential + $DomainUsername = $DomainJoinUserPrincipalName + $DomainPassword = ConvertTo-SecureString -String $DomainJoinPassword -AsPlainText -Force + [pscredential]$DomainCredential = New-Object System.Management.Automation.PSCredential ($DomainUsername, $DomainPassword) + + # Get Domain information + $Domain = Get-ADDomain -Credential $DomainCredential -Current 'LocalComputer' + Write-Log -Message "Domain information collection succeeded" -Type 'INFO' + } + + if($StorageService -eq 'AzureFiles') + { + $FilesSuffix = '.file.' + $StorageSuffix + Write-Log -Message "Azure Files Suffix = $FilesSuffix" -Type 'INFO' + } + + + ############################################################## + # Process Storage Resources + ############################################################## + for($i = 0; $i -lt $StorageCount; $i++) + { + # Determine Principal for assignment + $SecurityPrincipalName = $SecurityPrincipalNames[$i] + $Group = $Netbios + '\' + $SecurityPrincipalName + Write-Log -Message "Group for NTFS Permissions = $Group" -Type 'INFO' + + # Get storage resource details + switch($StorageService) + { + 'AzureNetAppFiles' { + $Credential = $DomainCredential + $SmbServerName = (Get-ADComputer -Filter "Name -like 'anf-$SmbServerLocation*'" -Credential $DomainCredential).Name + $FileServer = '\\' + $SmbServerName + '.' + $Domain.DNSRoot + } + 'AzureFiles' { + $StorageAccountName = $StorageAccountPrefix + ($i + $StorageIndex).ToString().PadLeft(2,'0') + $FileServer = '\\' + $StorageAccountName + $FilesSuffix + + # Connects to Azure using a User Assigned Managed Identity + Connect-AzAccount -Identity -AccountId $UserAssignedIdentityClientId -Environment $Environment -Tenant $TenantId -Subscription $SubscriptionId | Out-Null + Write-Log -Message "Authenticated to Azure" -Type 'INFO' + + # Get the storage account key + $StorageKey = (Get-AzStorageAccountKey -ResourceGroupName $StorageAccountResourceGroupName -Name $StorageAccountName)[0].Value + Write-Log -Message "The GET operation for the Storage Account key on $StorageAccountName succeeded" -Type 'INFO' + + # Create credential for accessing the storage account + $StorageUsername = 'Azure\' + $StorageAccountName + $StoragePassword = ConvertTo-SecureString -String "$($StorageKey)" -AsPlainText -Force + [pscredential]$StorageKeyCredential = New-Object System.Management.Automation.PSCredential ($StorageUsername, $StoragePassword) + $Credential = $StorageKeyCredential + + if($ActiveDirectorySolution -eq 'ActiveDirectoryDomainServices') + { + # Get / create kerberos key for Azure Storage Account + $KerberosKey = (Get-AzStorageAccountKey -ResourceGroupName $StorageAccountResourceGroupName -Name $StorageAccountName -ListKerbKey | Where-Object {$_.Keyname -contains 'kerb1'}).Value + if(!$KerberosKey) + { + New-AzStorageAccountKey -ResourceGroupName $StorageAccountResourceGroupName -Name $StorageAccountName -KeyName kerb1 | Out-Null + $Key = (Get-AzStorageAccountKey -ResourceGroupName $StorageAccountResourceGroupName -Name $StorageAccountName -ListKerbKey | Where-Object {$_.Keyname -contains 'kerb1'}).Value + Write-Log -Message "Kerberos Key creation on Storage Account, $StorageAccountName, succeeded." -Type 'INFO' + } + else + { + $Key = $KerberosKey + Write-Log -Message "Acquired Kerberos Key from Storage Account, $StorageAccountName." -Type 'INFO' + } + + # Creates a password for the Azure Storage Account in AD using the Kerberos key + $ComputerPassword = ConvertTo-SecureString -String $Key.Replace("'","") -AsPlainText -Force + Write-Log -Message "Secure string conversion succeeded" -Type 'INFO' + + # Create the SPN value for the Azure Storage Account; attribute for computer object in AD + $SPN = 'cifs/' + $StorageAccountName + $FilesSuffix + + # Create the Description value for the Azure Storage Account; attribute for computer object in AD + $Description = "Computer account object for Azure storage account $($StorageAccountName)." + + # Create the AD computer object for the Azure Storage Account + $Computer = Get-ADComputer -Credential $DomainCredential -Filter {Name -eq $StorageAccountName} + if($Computer) + { + Remove-ADComputer -Credential $DomainCredential -Identity $StorageAccountName -Confirm:$false + } + $ComputerObject = New-ADComputer -Credential $DomainCredential -Name $StorageAccountName -Path $OrganizationalUnitPath -ServicePrincipalNames $SPN -AccountPassword $ComputerPassword -Description $Description -PassThru + Write-Log -Message "Computer object creation succeeded" -Type 'INFO' + + Set-AzStorageAccount ` + -ResourceGroupName $StorageAccountResourceGroupName ` + -Name $StorageAccountName ` + -EnableActiveDirectoryDomainServicesForFile $true ` + -ActiveDirectoryDomainName $Domain.DNSRoot ` + -ActiveDirectoryNetBiosDomainName $Domain.NetBIOSName ` + -ActiveDirectoryForestName $Domain.Forest ` + -ActiveDirectoryDomainGuid $Domain.ObjectGUID ` + -ActiveDirectoryDomainsid $Domain.DomainSID ` + -ActiveDirectoryAzureStorageSid $ComputerObject.SID.Value ` + -ActiveDirectorySamAccountName $StorageAccountName ` + -ActiveDirectoryAccountType 'Computer' | Out-Null + Write-Log -Message "Storage Account update with domain join info succeeded" -Type 'INFO' + + # Set the Kerberos encryption on the computer object + $DistinguishedName = 'CN=' + $StorageAccountName + ',' + $OrganizationalUnitPath + Set-ADComputer -Credential $DomainCredential -Identity $DistinguishedName -KerberosEncryptionType 'AES256' | Out-Null + Write-Log -Message "Setting Kerberos AES256 Encryption on the computer object succeeded" -Type 'INFO' + + # Reset the Kerberos key on the Storage Account + New-AzStorageAccountKey -ResourceGroupName $StorageAccountResourceGroupName -Name $StorageAccountName -KeyName kerb1 | Out-Null + $Key = (Get-AzStorageAccountKey -ResourceGroupName $StorageAccountResourceGroupName -Name $StorageAccountName -ListKerbKey | Where-Object {$_.Keyname -contains 'kerb1'}).Value + Write-Log -Message "Resetting the Kerberos key on the Storage Account succeeded" -Type 'INFO' + + # Update the password on the computer object with the new Kerberos key on the Storage Account + $NewPassword = ConvertTo-SecureString -String $Key -AsPlainText -Force + Set-ADAccountPassword -Credential $DomainCredential -Identity $DistinguishedName -Reset -NewPassword $NewPassword | Out-Null + Write-Log -Message "Setting the new Kerberos key on the Computer Object succeeded" -Type 'INFO' + } + Disconnect-AzAccount | Out-Null + Write-Log -Message "Disconnection to Azure succeeded" -Type 'INFO' + } + } + + foreach($Share in $Shares) + { + # Mount file share + $FileShare = $FileServer + '\' + $Share + New-PSDrive -Name 'Z' -PSProvider 'FileSystem' -Root $FileShare -Credential $Credential | Out-Null + Write-Log -Message "Mounting the Azure file share, $FileShare, succeeded" -Type 'INFO' + + # Set recommended NTFS permissions on the file share + $ACL = Get-Acl -Path 'Z:' + $CreatorOwner = New-Object System.Security.Principal.Ntaccount ("Creator Owner") + $ACL.PurgeAccessRules($CreatorOwner) + $AuthenticatedUsers = New-Object System.Security.Principal.Ntaccount ("Authenticated Users") + $ACL.PurgeAccessRules($AuthenticatedUsers) + $Users = New-Object System.Security.Principal.Ntaccount ("Users") + $ACL.PurgeAccessRules($Users) + $DomainUsers = New-Object System.Security.AccessControl.FileSystemAccessRule("$Group","Modify","None","None","Allow") + $ACL.SetAccessRule($DomainUsers) + $CreatorOwner = New-Object System.Security.AccessControl.FileSystemAccessRule("Creator Owner","Modify","ContainerInherit,ObjectInherit","InheritOnly","Allow") + $ACL.AddAccessRule($CreatorOwner) + $ACL | Set-Acl -Path 'Z:' | Out-Null + Write-Log -Message "Setting the NTFS permissions on the Azure file share succeeded" -Type 'INFO' + + # Unmount file share + Remove-PSDrive -Name 'Z' -PSProvider 'FileSystem' -Force | Out-Null + Start-Sleep -Seconds 5 | Out-Null + Write-Log -Message "Unmounting the Azure file share, $FileShare, succeeded" -Type 'INFO' + } + } + $Output = [pscustomobject][ordered]@{ + shares = $Shares + } + $JsonOutput = $Output | ConvertTo-Json + return $JsonOutput +} +catch { + Write-Log -Message $_ -Type 'ERROR' + $ErrorData = $_ | Select-Object * + $ErrorData | Out-File -FilePath 'C:\cse.txt' -Append + throw +} \ No newline at end of file diff --git a/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-SessionHostConfiguration.ps1 b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-SessionHostConfiguration.ps1 new file mode 100644 index 000000000..d57c16fe6 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Set-SessionHostConfiguration.ps1 @@ -0,0 +1,535 @@ +[Cmdletbinding()] +Param( + [parameter(Mandatory)] + [string] + $ActiveDirectorySolution, + + [parameter(Mandatory)] + [string] + $AmdVmSize, + + [parameter(Mandatory)] + [string] + $AvdAgentBootLoaderMsiName, + + [parameter(Mandatory)] + [string] + $AvdAgentMsiName, + + [parameter(Mandatory)] + [string] + $Environment, + + [parameter(Mandatory)] + [string] + $Fslogix, + + [parameter(Mandatory)] + [string] + $FslogixContainerType, + + [parameter(Mandatory)] + [string] + $HostPoolName, + + [parameter(Mandatory)] + [string] + $HostPoolRegistrationToken, + + [parameter(Mandatory)] + [string] + $ImageOffer, + + [parameter(Mandatory)] + [string] + $ImagePublisher, + + [parameter(Mandatory)] + [string] + $NetAppFileShares, + + [parameter(Mandatory)] + [string] + $NvidiaVmSize, + + [parameter(Mandatory)] + [string] + $PooledHostPool, + + [parameter(Mandatory)] + [string] + $SecurityMonitoring, + + [parameter(Mandatory)] + [string] + $SecurityWorkspaceId, + + [parameter(Mandatory)] + [string] + $SecurityWorkspaceKey, + + [parameter(Mandatory)] + [string] + $StorageAccountPrefix, + + [parameter(Mandatory)] + [int] + $StorageCount, + + [parameter(Mandatory)] + [int] + $StorageIndex, + + [parameter(Mandatory)] + [string] + $StorageService, + + [parameter(Mandatory)] + [string] + $StorageSuffix +) + + +############################################################## +# Functions +############################################################## +function Write-Log +{ + param( + [parameter(Mandatory)] + [string]$Message, + + [parameter(Mandatory)] + [string]$Type + ) + $Path = 'C:\cse.txt' + if(!(Test-Path -Path $Path)) + { + New-Item -Path 'C:\' -Name 'cse.txt' | Out-Null + } + $Timestamp = Get-Date -Format 'MM/dd/yyyy HH:mm:ss.ff' + $Entry = '[' + $Timestamp + '] [' + $Type + '] ' + $Message + $Entry | Out-File -FilePath $Path -Append +} + +$ErrorActionPreference = 'Stop' +$WarningPreference = 'SilentlyContinue' + +try +{ + # Convert NetAppFiles share names from a JSON array to a PowerShell array + [array]$NetAppFileShares = $NetAppFileShares.Replace("'",'"') | ConvertFrom-Json + Write-Log -Message "Azure NetApp Files, Shares:" -Type 'INFO' + $NetAppFileShares | Add-Content -Path 'C:\cse.txt' -Force + + ############################################################## + # Add Recommended Security Settings + ############################################################## + $Settings = @( + + # Set Kerberos Encryption for STIG compliance + [PSCustomObject]@{ + Name = 'SupportedEncryptionTypes' + Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parameters' + PropertyType = 'DWord' + Value = 2147483640 + } + ) + + ############################################################## + # Add Recommended AVD Settings + ############################################################## + $Settings = @( + + # Disable Automatic Updates: https://learn.microsoft.com/azure/virtual-desktop/set-up-customize-master-image#disable-automatic-updates + [PSCustomObject]@{ + Name = 'NoAutoUpdate' + Path = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' + PropertyType = 'DWord' + Value = 1 + }, + + # Enable Time Zone Redirection: https://learn.microsoft.com/azure/virtual-desktop/set-up-customize-master-image#set-up-time-zone-redirection + [PSCustomObject]@{ + Name = 'fEnableTimeZoneRedirection' + Path = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services' + PropertyType = 'DWord' + Value = 1 + } + ) + + + ############################################################## + # Add GPU Settings + ############################################################## + # This setting applies to the VM Size's recommended for AVD with a GPU + if ($AmdVmSize -eq 'true' -or $NvidiaVmSize -eq 'true') + { + $Settings += @( + + # Configure GPU-accelerated app rendering: https://learn.microsoft.com/azure/virtual-desktop/configure-vm-gpu#configure-gpu-accelerated-app-rendering + [PSCustomObject]@{ + Name = 'bEnumerateHWBeforeSW' + Path = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services' + PropertyType = 'DWord' + Value = 1 + }, + + # Configure fullscreen video encoding: https://learn.microsoft.com/azure/virtual-desktop/configure-vm-gpu#configure-fullscreen-video-encoding + [PSCustomObject]@{ + Name = 'AVC444ModePreferred' + Path = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services' + PropertyType = 'DWord' + Value = 1 + } + ) + } + + # This setting applies only to VM Size's recommended for AVD with a Nvidia GPU + if($NvidiaVmSize -eq 'true') + { + $Settings += @( + + # Configure GPU-accelerated frame encoding: https://learn.microsoft.com/azure/virtual-desktop/configure-vm-gpu#configure-gpu-accelerated-frame-encoding + [PSCustomObject]@{ + Name = 'AVChardwareEncodePreferred' + Path = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services' + PropertyType = 'DWord' + Value = 1 + } + ) + } + + + ############################################################## + # Add Fslogix Settings + ############################################################## + if($Fslogix -eq 'true') + { + $FilesSuffix = '.file.' + $StorageSuffix + $CloudCacheOfficeContainers = @() + $CloudCacheProfileContainers = @() + $OfficeContainers = @() + $ProfileContainers = @() + switch($StorageService) + { + 'AzureFiles' { + for($i = $StorageIndex; $i -lt $($StorageIndex + $StorageCount); $i++) + { + $CloudCacheOfficeContainers += 'type=smb,connectionString=\\' + $StorageAccountPrefix + $i.ToString().PadLeft(2,'0') + $FilesSuffix + '\office-containers;' + $CloudCacheProfileContainers += 'type=smb,connectionString=\\' + $StorageAccountPrefix + $i.ToString().PadLeft(2,'0') + $FilesSuffix + '\profile-containers;' + $OfficeContainers += '\\' + $StorageAccountPrefix + $i.ToString().PadLeft(2,'0') + $FilesSuffix + '\office-containers' + $ProfileContainers += '\\' + $StorageAccountPrefix + $i.ToString().PadLeft(2,'0') + $FilesSuffix + '\profile-containers' + } + } + 'AzureNetAppFiles' { + $CloudCacheOfficeContainers += 'type=smb,connectionString=\\' + $NetAppFileShares[0] + '\office-containers;' + $CloudCacheProfileContainers += 'type=smb,connectionString=\\' + $(if($NetAppFileShares.Length -gt 1){$NetAppFileShares[1]}else{$NetAppFileShares[0]}) + '\profile-containers;' + $OfficeContainers += '\\' + $NetAppFileShares[0] + '\office-containers' + $ProfileContainers += '\\' + $(if($NetAppFileShares.Length -gt 1){$NetAppFileShares[1]}else{$NetAppFileShares[0]}) + '\profile-containers' + } + } + + $Shares = @() + $Shares += $OfficeContainers + $Shares += $ProfileContainers + $SharesOutput = if($Shares.Count -eq 1){$Shares}else{$Shares -join ', '} + Write-Log -Message "File Shares: $SharesOutput" -Type 'INFO' + + $Settings += @( + + # Enables Fslogix profile containers: https://learn.microsoft.com/fslogix/profile-container-configuration-reference#enabled + [PSCustomObject]@{ + Name = 'Enabled' + Path = 'HKLM:\SOFTWARE\Fslogix\Profiles' + PropertyType = 'DWord' + Value = 1 + }, + + # Deletes a local profile if it exists and matches the profile being loaded from VHD: https://learn.microsoft.com/fslogix/profile-container-configuration-reference#deletelocalprofilewhenvhdshouldapply + [PSCustomObject]@{ + Name = 'DeleteLocalProfileWhenVHDShouldApply' + Path = 'HKLM:\SOFTWARE\FSLogix\Profiles' + PropertyType = 'DWord' + Value = 1 + }, + + # The folder created in the Fslogix fileshare will begin with the username instead of the SID: https://learn.microsoft.com/fslogix/profile-container-configuration-reference#flipflopprofiledirectoryname + [PSCustomObject]@{ + Name = 'FlipFlopProfileDirectoryName' + Path = 'HKLM:\SOFTWARE\FSLogix\Profiles' + PropertyType = 'DWord' + Value = 1 + }, + + # Specifies the number of retries attempted when a VHD(x) file is locked: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=profiles#lockedretrycount + [PSCustomObject]@{ + Name = 'LockedRetryCount' + Path = 'HKLM:\SOFTWARE\FSLogix\Profiles' + PropertyType = 'DWord' + Value = 3 + }, + + # Specifies the number of seconds to wait between retries: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=profiles#lockedretryinterval + [PSCustomObject]@{ + Name = 'LockedRetryInterval' + Path = 'HKLM:\SOFTWARE\FSLogix\Profiles' + PropertyType = 'DWord' + Value = 15 + }, + + # Specifies if the profile container can be accessed concurrently: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=profiles#profiletype + [PSCustomObject]@{ + Name = 'ProfileType' + Path = 'HKLM:\SOFTWARE\FSLogix\Profiles' + PropertyType = 'DWord' + Value = 0 + }, + + # Specifies the number of seconds to wait between retries when attempting to reattach the VHD(x) container if it's disconnected unexpectedly: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=profiles#reattachintervalseconds + [PSCustomObject]@{ + Name = 'ReAttachIntervalSeconds' + Path = 'HKLM:\SOFTWARE\FSLogix\Profiles' + PropertyType = 'DWord' + Value = 15 + }, + + # Specifies the number of times the system should attempt to reattach the VHD(x) container if it's disconnected unexpectedly: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=profiles#reattachretrycount + [PSCustomObject]@{ + Name = 'ReAttachRetryCount' + Path = 'HKLM:\SOFTWARE\FSLogix\Profiles' + PropertyType = 'DWord' + Value = 3 + }, + + # Specifies the maximum size of the user's container in megabytes. Newly created VHD(x) containers are of this size: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=profiles#sizeinmbs + [PSCustomObject]@{ + Name = 'SizeInMBs' + Path = 'HKLM:\SOFTWARE\FSLogix\Profiles' + PropertyType = 'DWord' + Value = 30000 + }, + + # Specifies the file extension for the profile containers: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=profiles#volumetype + [PSCustomObject]@{ + Name = 'VolumeType' + Path = 'HKLM:\SOFTWARE\FSLogix\Profiles' + PropertyType = 'String' + Value = 'VHDX' + } + ) + + if($FslogixContainerType -like "CloudCache*") + { + $Settings += @( + # List of file system locations to search for the user's profile VHD(X) file: https://learn.microsoft.com/fslogix/profile-container-configuration-reference#vhdlocations + [PSCustomObject]@{ + Name = 'CCDLocations' + Path = 'HKLM:\SOFTWARE\FSLogix\Profiles' + PropertyType = 'MultiString' + Value = $CloudCacheProfileContainers + } + ) + } + else + { + $Settings += @( + # List of file system locations to search for the user's profile VHD(X) file: https://learn.microsoft.com/fslogix/profile-container-configuration-reference#vhdlocations + [PSCustomObject]@{ + Name = 'VHDLocations' + Path = 'HKLM:\SOFTWARE\FSLogix\Profiles' + PropertyType = 'MultiString' + Value = $ProfileContainers + } + ) + } + + if($FslogixContainerType -like "*OfficeContainer") + { + $Settings += @( + + # Enables Fslogix office containers: https://learn.microsoft.com/fslogix/office-container-configuration-reference#enabled + [PSCustomObject]@{ + Name = 'Enabled' + Path = 'HKLM:\SOFTWARE\Policies\FSLogix\ODFC' + PropertyType = 'DWord' + Value = 1 + }, + + # The folder created in the Fslogix fileshare will begin with the username instead of the SID: https://learn.microsoft.com/fslogix/office-container-configuration-reference#flipflopprofiledirectoryname + [PSCustomObject]@{ + Name = 'FlipFlopProfileDirectoryName' + Path = 'HKLM:\SOFTWARE\Policies\FSLogix\ODFC' + PropertyType = 'DWord' + Value = 1 + }, + + # Teams data is redirected to the container: https://learn.microsoft.com/fslogix/office-container-configuration-reference#includeteams + [PSCustomObject]@{ + Name = 'IncludeTeams' + Path = 'HKLM:\SOFTWARE\Policies\FSLogix\ODFC' + PropertyType = 'DWord' + Value = 1 + }, + + # Specifies the number of retries attempted when a VHD(x) file is locked: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=odfc#lockedretrycount + [PSCustomObject]@{ + Name = 'LockedRetryCount' + Path = 'HKLM:\SOFTWARE\Policies\FSLogix\ODFC' + PropertyType = 'DWord' + Value = 3 + }, + + # Specifies the number of seconds to wait between retries: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=odfc#lockedretryinterval + [PSCustomObject]@{ + Name = 'LockedRetryInterval' + Path = 'HKLM:\SOFTWARE\Policies\FSLogix\ODFC' + PropertyType = 'DWord' + Value = 15 + }, + + # Specifies the number of seconds to wait between retries when attempting to reattach the VHD(x) container if it's disconnected unexpectedly: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=odfc#reattachintervalseconds + [PSCustomObject]@{ + Name = 'ReAttachIntervalSeconds' + Path = 'HKLM:\SOFTWARE\Policies\FSLogix\ODFC' + PropertyType = 'DWord' + Value = 15 + }, + + # Specifies the number of times the system should attempt to reattach the VHD(x) container if it's disconnected unexpectedly: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=odfc#reattachretrycount + [PSCustomObject]@{ + Name = 'ReAttachRetryCount' + Path = 'HKLM:\SOFTWARE\Policies\FSLogix\ODFC' + PropertyType = 'DWord' + Value = 3 + }, + + # Specifies the maximum size of the user's container in megabytes: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=odfc#sizeinmbs + [PSCustomObject]@{ + Name = 'SizeInMBs' + Path = 'HKLM:\SOFTWARE\Policies\FSLogix\ODFC' + PropertyType = 'DWord' + Value = 30000 + }, + + # Specifies the type of container: https://learn.microsoft.com/fslogix/reference-configuration-settings?tabs=odfc#volumetype + [PSCustomObject]@{ + Name = 'VolumeType' + Path = 'HKLM:\SOFTWARE\Policies\FSLogix\ODFC' + PropertyType = 'String' + Value = 'VHDX' + } + ) + + if($FslogixContainerType -like "CloudCache*") + { + $Settings += @( + # List of file system locations to search for the user's profile VHD(X) file: https://learn.microsoft.com/fslogix/profile-container-configuration-reference#vhdlocations + [PSCustomObject]@{ + Name = 'CCDLocations' + Path = 'HKLM:\SOFTWARE\Policies\FSLogix\ODFC' + PropertyType = 'MultiString' + Value = $CloudCacheOfficeContainers + } + ) + } + else + { + $Settings += @( + # List of file system locations to search for the user's profile VHD(X) file: https://learn.microsoft.com/fslogix/office-container-configuration-reference#vhdlocations + [PSCustomObject]@{ + Name = 'VHDLocations' + Path = 'HKLM:\SOFTWARE\Policies\FSLogix\ODFC' + PropertyType = 'MultiString' + Value = $OfficeContainers + } + ) + } + } + } + + + # Set registry settings + foreach($Setting in $Settings) + { + # Create registry key(s) if necessary + if(!(Test-Path -Path $Setting.Path)) + { + New-Item -Path $Setting.Path -Force | Out-Null + } + + # Checks for existing registry setting + $Value = Get-ItemProperty -Path $Setting.Path -Name $Setting.Name -ErrorAction 'SilentlyContinue' + $LogOutputValue = 'Path: ' + $Setting.Path + ', Name: ' + $Setting.Name + ', PropertyType: ' + $Setting.PropertyType + ', Value: ' + $Setting.Value + + # Creates the registry setting when it does not exist + if(!$Value) + { + New-ItemProperty -Path $Setting.Path -Name $Setting.Name -PropertyType $Setting.PropertyType -Value $Setting.Value -Force | Out-Null + Write-Log -Message "Added registry setting: $LogOutputValue" -Type 'INFO' + } + # Updates the registry setting when it already exists + elseif($Value.$($Setting.Name) -ne $Setting.Value) + { + Set-ItemProperty -Path $Setting.Path -Name $Setting.Name -Value $Setting.Value -Force | Out-Null + Write-Log -Message "Updated registry setting: $LogOutputValue" -Type 'INFO' + } + # Writes log output when registry setting has the correct value + else + { + Write-Log -Message "Registry setting exists with correct value: $LogOutputValue" -Type 'INFO' + } + Start-Sleep -Seconds 1 | Out-Null + } + + + ############################################################## + # Install the AVD Agent + ############################################################## + Start-Process -FilePath 'msiexec.exe' -ArgumentList "/i `"$AvdAgentBootLoaderMsiName`" /quiet /qn /norestart /passive" -Wait -Passthru | Out-Null + Write-Log -Message 'Installed AVD Agent Bootloader' -Type 'INFO' + Start-Sleep -Seconds 5 | Out-Null + + Start-Process -FilePath 'msiexec.exe' -ArgumentList "/i `"$AvdAgentMsiName`" /quiet /qn /norestart /passive REGISTRATIONTOKEN=$HostPoolRegistrationToken" -Wait -PassThru | Out-Null + Write-Log -Message 'Installed AVD Agent' -Type 'INFO' + Start-Sleep -Seconds 5 | Out-Null + + + ############################################################## + # Dual-home Microsoft Monitoring Agent for Azure Sentinel or Defender for Cloud + ############################################################## + if($SecurityMonitoring -eq 'true') + { + $AzureEnvironment = switch($Environment) + { + AzureCloud {0} + AzureUSGovernment {1} + AzureChina {2} + USNat {3} + USSec {4} + } + + $mma = New-Object -ComObject 'AgentConfigManager.MgmtSvcCfg' + $mma.AddCloudWorkspace($SecurityWorkspaceId, $SecurityWorkspaceKey, $AzureEnvironment) + $mma.ReloadConfiguration() | Out-Null + } + + ############################################################## + # Restart VM + ############################################################## + if(($ActiveDirectorySolution -eq "MicrosoftEntraId" -or $ActiveDirectorySolution -eq "MicrosoftEntraIdIntuneEnrollment") -and $AmdVmSize -eq 'false' -and $NvidiaVmSize -eq 'false') + { + Start-Process -FilePath 'shutdown' -ArgumentList '/r /t 30' | Out-Null + } + + $Output = [pscustomobject][ordered]@{ + activeDirectorySolution = $ActiveDirectorySolution + } + $JsonOutput = $Output | ConvertTo-Json + return $JsonOutput +} +catch +{ + Write-Log -Message $_ -Type 'ERROR' + throw +} diff --git a/src/bicep/add-ons/azureVirtualDesktop/artifacts/Update-AvdDesktop.ps1 b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Update-AvdDesktop.ps1 new file mode 100644 index 000000000..0a7fcb40f --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Update-AvdDesktop.ps1 @@ -0,0 +1,53 @@ +Param( + [parameter(Mandatory)] + [string]$ApplicationGroupName, + + [parameter(Mandatory)] + [string]$Environment, + + [parameter(Mandatory)] + [string]$FriendlyName, + + [parameter(Mandatory)] + [string]$ResourceGroupName, + + [parameter(Mandatory)] + [string]$SubscriptionId, + + [parameter(Mandatory)] + [string]$TenantId, + + [parameter(Mandatory)] + [string]$UserAssignedIdentityClientId +) + +$ErrorActionPreference = 'Stop' + +try +{ + Connect-AzAccount ` + -Environment $Environment ` + -Tenant $TenantId ` + -Subscription $SubscriptionId ` + -Identity ` + -AccountId $UserAssignedIdentityClientId | Out-Null + + Update-AzWvdDesktop ` + -ApplicationGroupName $ApplicationGroupName ` + -Name 'SessionDesktop' ` + -ResourceGroupName $ResourceGroupName ` + -FriendlyName $FriendlyName.Replace('"', '') | Out-Null + + Disconnect-AzAccount | Out-Null + + $Output = [pscustomobject][ordered]@{ + applicationGroupName = $ApplicationGroupName + } + $JsonOutput = $Output | ConvertTo-Json + return $JsonOutput +} +catch +{ + Write-Host $_ | Select-Object * + throw +} \ No newline at end of file diff --git a/src/bicep/add-ons/azureVirtualDesktop/artifacts/Update-AvdWorkspace.ps1 b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Update-AvdWorkspace.ps1 new file mode 100644 index 000000000..4b0b86e6b --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/artifacts/Update-AvdWorkspace.ps1 @@ -0,0 +1,59 @@ +param( + + [parameter(Mandatory)] + [string]$ApplicationGroupReferences, + + [parameter(Mandatory)] + [string]$Environment, + + [parameter(Mandatory)] + [string]$ResourceGroupName, + + [parameter(Mandatory)] + [string]$SubscriptionId, + + [parameter(Mandatory)] + [string]$TenantId, + + [parameter(Mandatory)] + [string]$UserAssignedIdentityClientId, + + [parameter(Mandatory)] + [string]$WorkspaceName + +) + +$ErrorActionPreference = 'Stop' + +try +{ + Connect-AzAccount ` + -Environment $Environment ` + -Tenant $TenantId ` + -Subscription $SubscriptionId ` + -Identity ` + -AccountId $UserAssignedIdentityClientId | Out-Null + + $OldAppGroupReferences = (Get-AzWvdWorkspace -ResourceGroupName $ResourceGroupName -Name $WorkspaceName).ApplicationGroupReference + [array]$NewAppGroupReferences = $ApplicationGroupReferences.Replace("'",'"') | ConvertFrom-Json + $OldAppGroupReferences = $OldAppGroupReferences -ne $NewAppGroupReferences + $CombinedApplicationGroupReferences = $OldAppGroupReferences + $NewAppGroupReferences + + Update-AzWvdWorkspace ` + -ResourceGroupName $ResourceGroupName ` + -Name $WorkspaceName ` + -ApplicationGroupReference $CombinedApplicationGroupReferences | Out-Null + + Disconnect-AzAccount | Out-Null + + $Output = [pscustomobject][ordered]@{ + workspaceName = $WorkspaceName + } + $JsonOutput = $Output | ConvertTo-Json + return $JsonOutput +} +catch +{ + Write-Host $_ | Select-Object * + throw +} \ No newline at end of file diff --git a/src/bicep/add-ons/azureVirtualDesktop/data/locations.json b/src/bicep/add-ons/azureVirtualDesktop/data/locations.json new file mode 100644 index 000000000..06f20c9e5 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/data/locations.json @@ -0,0 +1,396 @@ +{ + "AzureChina": { + "chinaeast": { + "abbreviation": "cne", + "recoveryServicesGeo": "sha", + "timeDifference": "+8:00", + "timeZone": "China Standard Time" + }, + "chinaeast2": { + "abbreviation": "cne2", + "recoveryServicesGeo": "sha2", + "timeDifference": "+8:00", + "timeZone": "China Standard Time" + }, + "chinanorth": { + "abbreviation": "cnn", + "recoveryServicesGeo": "bjb", + "timeDifference": "+8:00", + "timeZone": "China Standard Time" + }, + "chinanorth2": { + "abbreviation": "cnn2", + "recoveryServicesGeo": "bjb2", + "timeDifference": "+8:00", + "timeZone": "China Standard Time" + }, + "chinanorth3": { + "abbreviation": "cnn3", + "recoveryServicesGeo": "", + "timeDifference": "+8:00", + "timeZone": "China Standard Time" + } + }, + "AzureCloud": { + "australiacentral": { + "abbreviation": "auc", + "recoveryServicesGeo": "acl", + "timeDifference": "+10:00", + "timeZone": "AUS Eastern Standard Time" + }, + "australiacentral2": { + "abbreviation": "auc2", + "recoveryServicesGeo": "acl2", + "timeDifference": "+10:00", + "timeZone": "AUS Eastern Standard Time" + }, + "australiaeast": { + "abbreviation": "aue", + "recoveryServicesGeo": "ae", + "timeDifference": "+10:00", + "timeZone": "AUS Eastern Standard Time" + }, + "australiasoutheast": { + "abbreviation": "ause", + "recoveryServicesGeo": "ase", + "timeDifference": "+10:00", + "timeZone": "AUS Eastern Standard Time" + }, + "brazilsouth": { + "abbreviation": "brs", + "recoveryServicesGeo": "brs", + "timeDifference": "-3:00", + "timeZone": "E. South America Standard Time" + }, + "brazilsoutheast": { + "abbreviation": "brse", + "recoveryServicesGeo": "bse", + "timeDifference": "-3:00", + "timeZone": "E. South America Standard Time" + }, + "canadacentral": { + "abbreviation": "cac", + "recoveryServicesGeo": "cnc", + "timeDifference": "-5:00", + "timeZone": "Eastern Standard Time" + }, + "canadaeast": { + "abbreviation": "cae", + "recoveryServicesGeo": "cne", + "timeDifference": "-5:00", + "timeZone": "Eastern Standard Time" + }, + "centralindia": { + "abbreviation": "inc", + "recoveryServicesGeo": "inc", + "timeDifference": "+5:30", + "timeZone": "India Standard Time" + }, + "centralus": { + "abbreviation": "usc", + "recoveryServicesGeo": "cus", + "timeDifference": "-6:00", + "timeZone": "Central Standard Time" + }, + "eastasia": { + "abbreviation": "ase", + "recoveryServicesGeo": "ea", + "timeDifference": "+8:00", + "timeZone": "China Standard Time" + }, + "eastus": { + "abbreviation": "use", + "recoveryServicesGeo": "eus", + "timeDifference": "-5:00", + "timeZone": "Eastern Standard Time" + }, + "eastus2": { + "abbreviation": "use2", + "recoveryServicesGeo": "eus2", + "timeDifference": "-5:00", + "timeZone": "Eastern Standard Time" + }, + "francecentral": { + "abbreviation": "frc", + "recoveryServicesGeo": "frc", + "timeDifference": "+1:00", + "timeZone": "Central Europe Standard Time" + }, + "francesouth": { + "abbreviation": "frs", + "recoveryServicesGeo": "frs", + "timeDifference": "+1:00", + "timeZone": "Central Europe Standard Time" + }, + "germanynorth": { + "abbreviation": "den", + "recoveryServicesGeo": "gn", + "timeDifference": "+1:00", + "timeZone": "Central Europe Standard Time" + }, + "germanywestcentral": { + "abbreviation": "dewc", + "recoveryServicesGeo": "gwc", + "timeDifference": "+1:00", + "timeZone": "Central Europe Standard Time" + }, + "israelcentral": { + "abbreviation": "ilc", + "recoveryServicesGeo": "ilc", + "timeDifference": "+2:00", + "timeZone": "Israel Standard Time" + }, + "italynorth": { + "abbreviation": "itn", + "recoveryServicesGeo": "itn", + "timeDifference": "+1:00", + "timeZone": "Central Europe Standard Time" + }, + "japaneast": { + "abbreviation": "jpe", + "recoveryServicesGeo": "jpe", + "timeDifference": "+9:00", + "timeZone": "Tokyo Standard Time" + }, + "japanwest": { + "abbreviation": "jpw", + "recoveryServicesGeo": "jpw", + "timeDifference": "+9:00", + "timeZone": "Tokyo Standard Time" + }, + "jioindiacentral": { + "abbreviation": "injc", + "recoveryServicesGeo": "jic", + "timeDifference": "+5:30", + "timeZone": "India Standard Time" + }, + "jioindiawest": { + "abbreviation": "injw", + "recoveryServicesGeo": "jiw", + "timeDifference": "+5:30", + "timeZone": "India Standard Time" + }, + "koreacentral": { + "abbreviation": "krc", + "recoveryServicesGeo": "krc", + "timeDifference": "+9:00", + "timeZone": "Korea Standard Time" + }, + "koreasouth": { + "abbreviation": "krs", + "recoveryServicesGeo": "krs", + "timeDifference": "+9:00", + "timeZone": "Korea Standard Time" + }, + "newzealandnorth": { + "abbreviation": "nzn", + "recoveryServicesGeo": "", + "timeDifference": "+13:00", + "timeZone": "New Zealand Standard Time" + }, + "northcentralus": { + "abbreviation": "usnc", + "recoveryServicesGeo": "ncus", + "timeDifference": "-6:00", + "timeZone": "Central Standard Time" + }, + "northeurope": { + "abbreviation": "eun", + "recoveryServicesGeo": "ne", + "timeDifference": "0:00", + "timeZone": "GMT Standard Time" + }, + "norwayeast": { + "abbreviation": "noe", + "recoveryServicesGeo": "nwe", + "timeDifference": "+1:00", + "timeZone": "Central Europe Standard Time" + }, + "norwaywest": { + "abbreviation": "now", + "recoveryServicesGeo": "nww", + "timeDifference": "+1:00", + "timeZone": "Central Europe Standard Time" + }, + "polandcentral": { + "abbreviation": "plc", + "recoveryServicesGeo": "plc", + "timeDifference": "+1:00", + "timeZone": "Central Europe Standard Time" + }, + "qatarcentral": { + "abbreviation": "qac", + "recoveryServicesGeo": "qac", + "timeDifference": "+3:00", + "timeZone": "Arabian Standard Time" + }, + "southafricanorth": { + "abbreviation": "zan", + "recoveryServicesGeo": "san", + "timeDifference": "+2:00", + "timeZone": "South Africa Standard Time" + }, + "southafricawest": { + "abbreviation": "zaw", + "recoveryServicesGeo": "saw", + "timeDifference": "+2:00", + "timeZone": "South Africa Standard Time" + }, + "southcentralus": { + "abbreviation": "ussc", + "recoveryServicesGeo": "scus", + "timeDifference": "-6:00", + "timeZone": "Central Standard Time" + }, + "southeastasia": { + "abbreviation": "asse", + "recoveryServicesGeo": "sea", + "timeDifference": "+8:00", + "timeZone": "Singapore Standard Time" + }, + "southindia": { + "abbreviation": "ins", + "recoveryServicesGeo": "ins", + "timeDifference": "+5:30", + "timeZone": "India Standard Time" + }, + "swedencentral": { + "abbreviation": "sec", + "recoveryServicesGeo": "sdc", + "timeDifference": "+1:00", + "timeZone": "Central Europe Standard Time" + }, + "switzerlandnorth": { + "abbreviation": "chn", + "recoveryServicesGeo": "szn", + "timeDifference": "+1:00", + "timeZone": "Central Europe Standard Time" + }, + "switzerlandwest": { + "abbreviation": "chw", + "recoveryServicesGeo": "szw", + "timeDifference": "+1:00", + "timeZone": "Central Europe Standard Time" + }, + "uaecentral": { + "abbreviation": "aec", + "recoveryServicesGeo": "uac", + "timeDifference": "+3:00", + "timeZone": "Arabian Standard Time" + }, + "uaenorth": { + "abbreviation": "aen", + "recoveryServicesGeo": "uan", + "timeDifference": "+3:00", + "timeZone": "Arabian Standard Time" + }, + "uksouth": { + "abbreviation": "uks", + "recoveryServicesGeo": "uks", + "timeDifference": "0:00", + "timeZone": "GMT Standard Time" + }, + "ukwest": { + "abbreviation": "ukw", + "recoveryServicesGeo": "ukw", + "timeDifference": "0:00", + "timeZone": "GMT Standard Time" + }, + "westcentralus": { + "abbreviation": "uswc", + "recoveryServicesGeo": "wcus", + "timeDifference": "-7:00", + "timeZone": "Mountain Standard Time" + }, + "westeurope": { + "abbreviation": "euw", + "recoveryServicesGeo": "we", + "timeDifference": "+1:00", + "timeZone": "Central Europe Standard Time" + }, + "westindia": { + "abbreviation": "inw", + "recoveryServicesGeo": "inw", + "timeDifference": "+5:30", + "timeZone": "India Standard Time" + }, + "westus": { + "abbreviation": "usw", + "recoveryServicesGeo": "wus", + "timeDifference": "-8:00", + "timeZone": "Pacific Standard Time" + }, + "westus2": { + "abbreviation": "usw2", + "recoveryServicesGeo": "wus2", + "timeDifference": "-8:00", + "timeZone": "Pacific Standard Time" + }, + "westus3": { + "abbreviation": "usw3", + "recoveryServicesGeo": "wus3", + "timeDifference": "-7:00", + "timeZone": "Mountain Standard Time" + } + }, + "AzureUSGovernment": { + "usdodcentral": { + "abbreviation": "dodc", + "recoveryServicesGeo": "udc", + "timeDifference": "-6:00", + "timeZone": "Central Standard Time" + }, + "usdodeast": { + "abbreviation": "dode", + "recoveryServicesGeo": "ude", + "timeDifference": "-5:00", + "timeZone": "Eastern Standard Time" + }, + "usgovarizona": { + "abbreviation": "az", + "recoveryServicesGeo": "uga", + "timeDifference": "-7:00", + "timeZone": "Mountain Standard Time" + }, + "usgovtexas": { + "abbreviation": "tx", + "recoveryServicesGeo": "ugt", + "timeDifference": "-6:00", + "timeZone": "Central Standard Time" + }, + "usgovvirginia": { + "abbreviation": "va", + "recoveryServicesGeo": "ugv", + "timeDifference": "-5:00", + "timeZone": "Eastern Standard Time" + } + }, + "USNat": { + "usnateast": { + "abbreviation": "east", + "recoveryServicesGeo": "exe", + "timeDifference": "-5:00", + "timeZone": "Eastern Standard Time" + }, + "usnatwest": { + "abbreviation": "west", + "recoveryServicesGeo": "exw", + "timeDifference": "-8:00", + "timeZone": "Pacific Standard Time" + } + }, + "USSec": { + "usseceast": { + "abbreviation": "east", + "recoveryServicesGeo": "rxe", + "timeDifference": "-5:00", + "timeZone": "Eastern Standard Time" + }, + "ussecwest": { + "abbreviation": "west", + "recoveryServicesGeo": "rxw", + "timeDifference": "-8:00", + "timeZone": "Pacific Standard Time" + } + } +} \ No newline at end of file diff --git a/src/bicep/add-ons/azureVirtualDesktop/data/resourceAbbreviations.json b/src/bicep/add-ons/azureVirtualDesktop/data/resourceAbbreviations.json new file mode 100644 index 000000000..c2ebdf046 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/data/resourceAbbreviations.json @@ -0,0 +1,26 @@ +{ + "automationAccounts": "aa", + "availabilitySets": "as", + "dataCollectionRuleAssociations": "dcra", + "dataCollectionRules": "dcr", + "desktopApplicationGroups": "dag", + "diskAccesses": "da", + "remoteApplicationGroups": "rag", + "disks": "disk", + "diskEncryptionSets": "des", + "hostPools": "hp", + "keyVaults": "kv", + "logAnalyticsWorkspaces": "law", + "netAppAccounts": "naa", + "netAppCapacityPools": "nacp", + "networkInterfaces": "nic", + "networkSecurityGroups": "nsg", + "recoveryServicesVaults": "rsv", + "resourceGroups": "rg", + "routeTables": "rt", + "storageAccounts": "sa", + "userAssignedIdentities": "uai", + "virtualMachines": "vm", + "virtualNetworks": "vnet", + "workspaces": "ws" +} \ No newline at end of file diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/design.md b/src/bicep/add-ons/azureVirtualDesktop/docs/design.md new file mode 100644 index 000000000..54eccdda9 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/design.md @@ -0,0 +1,23 @@ +# Azure Virtual Desktop Solution + +[**Home**](../README.md) | [**Features**](./features.md) | [**Design**](./design.md) | [**Prerequisites**](./prerequisites.md) | [**Troubleshooting**](./troubleshooting.md) + +## Design + +This Azure Virtual Desktop (AVD) solution will deploy a fully operational AVD [stamp](https://learn.microsoft.com/azure/architecture/patterns/deployment-stamp) in an Azure subscription. The "StampIndex" parameter in this solution allows each stamp to be identified and scale to the capacity of a single subscription. Either several small stamps or one large stamp could be deployed in one subscription. To uniquely name multiple, unrelated stamps within a subscription, input a unique value for the "Identifier" parameter in each deployment. To name multiple related stamps, use the same value for the "Identifier" but increment the "StampIndex" across your subscriptions. + +![Identifiers](../images/identifiers.png) + +Every AVD deployment within the same subscription will share the AVD global workspace. When the same "Identifier" is used but the "StampIndex" is incremented across the same subscription, the feed workspace is deployed only once per "Identifier". This simplifies the organization of AVD resources within the client. The "Identfier" is meant to represent a business unit or project within an organization. + +![Stamps](../images/stamps.png) + +The code is idempotent, allowing you to scale storage and sessions hosts, but the core management resources will persist and update for any subsequent deployments. Some of those resources are the host pool, application group, and log analytics workspace. + +Both a personal or pooled host pool can be deployed with this solution. Either option will deploy a desktop application group with a role assignment. Selecting a pooled host pool will deploy the required resources and configurations to fully enable FSLogix. This solution also automates many of the features that are usually enabled manually after deploying an AVD host pool. See the [features](./features.md) page for more details. + +With this solution you can scale up to Azure's subscription limitations. This solution has been updated to allow sharding. A shard provides additional capacity to an AVD stamp. See the details below for increasing storage capacity. + +## Sharding to Increase Storage Capacity + +To add storage capacity to an AVD stamp, the "StorageIndex" and "StorageCount" parameters should be modified to your desired capacity. The last two digits in the name for the chosen storage solution will be incremented between each deployment. The "VHDLocations" setting will include all the file shares. The "SecurityPrincipalIds" and "SecurityPrincipalNames" will have an RBAC assignment and NTFS permissions set on one storage shard per stamp. Each user in the stamp should only have access to one file share. When the user accesses a session host, their profile will load from their respective file share. diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/design/naming.md b/src/bicep/add-ons/azureVirtualDesktop/docs/design/naming.md new file mode 100644 index 000000000..ea9803a65 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/design/naming.md @@ -0,0 +1,5 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Naming Convention diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features.md new file mode 100644 index 000000000..e8e997b56 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features.md @@ -0,0 +1,19 @@ +# Azure Virtual Desktop Solution + +[**Home**](../README.md) | [**Features**](./features.md) | [**Design**](./design.md) | [**Prerequisites**](./prerequisites.md) | [**Troubleshooting**](./troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./features/autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./features/backups.md#backups) +- [**Drain Mode**](./features/drainMode.md#drain-mode) +- [**FSLogix**](./features/fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./features/gpu.md#gpu-drivers--settings) +- [**High Availability**](./features/highAvailability.md#high-availability) +- [**Monitoring**](./features/monitoring.md#monitoring) +- [**Scaling Tool**](./features/scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./features/serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./features/smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./features/startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./features/trustedLaunch.md#trusted-launch) +- [**Validation**](./features/validation.md#validation) \ No newline at end of file diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/autoIncreasePremiumFileShareQuota.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/autoIncreasePremiumFileShareQuota.md new file mode 100644 index 000000000..fa613522e --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/autoIncreasePremiumFileShareQuota.md @@ -0,0 +1,35 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### Auto Increase Premium File Share Quota + +When Azure Files Premium is selected for FSLogix Storage, this feature is deployed automatically. This tool helps reduce cost by scaling the file share quota only when needed. To benefit from the cost savings, select 100GB for your initial file share size. For the first 500GB, the share will scale up 100 GB when only 50GB of quota remains. Once the share has reached 500GB, the tool will scale up 500GB if less than 500GB of the quota remains. + +**Reference:** [Azure Samples - GitHub Repository](https://github.com/Azure-Samples/azure-files-samples/tree/master/autogrow-PFS-quota) + +**Deployed Resources:** + +- Automation Account + - Diagnositics Setting (optional) + - Job Schedules + - Runbook + - Schedules + - System Assigned Identity +- Role Assignment diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/backups.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/backups.md new file mode 100644 index 000000000..db7d05855 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/backups.md @@ -0,0 +1,32 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### Backups + +This optional feature enables backups to protect user profile data. When selected, if the host pool is "pooled" and the storage solution is Azure Files, the solution will protect the file share. If the host pool is "personal", the solution will protect the virtual machines. + +**Reference:** [Azure Backup - Microsoft Docs](https://docs.microsoft.com/en-us/azure/backup/backup-overview) + +**Deployed Resources:** + +- Recovery Services Vault +- Backup Policy +- Protection Container (File Share Only) +- Protected Item diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/drainMode.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/drainMode.md new file mode 100644 index 000000000..dcce7240a --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/drainMode.md @@ -0,0 +1,30 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### Drain Mode + +When this optional feature is deployed, the sessions hosts will be put in drain mode to ensure the end users cannot access them until they have been validated. + +**Reference:** [Drain Mode - Microsoft Docs](https://docs.microsoft.com/en-us/azure/virtual-desktop/drain-mode) + +**Deployed Resources:** + +- Virtual Machine + - Custom Script Extension diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/fslogix.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/fslogix.md new file mode 100644 index 000000000..5b878fcbe --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/fslogix.md @@ -0,0 +1,44 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### FSLogix + +If selected, this solution will deploy the required resources and configurations so that FSLogix is fully configured and ready for immediate use post deployment. Only Azure AD DS and AD DS are supported in this solution. Azure AD support is in "Public Preview" and will added after it is "Generally Available". Azure Files and Azure NetApp Files are the only two SMB storage services available in this solution. A management VM is deployed to facilitate the domain join of Azure Files (AD DS only) and configures the NTFS permissions on the share(s). Azure Files can be deployed with either a public endpoint, [service endpoint](https://docs.microsoft.com/en-us/azure/storage/files/storage-files-networking-overview#public-endpoint-firewall-settings), or [private endpoint](https://docs.microsoft.com/en-us/azure/storage/files/storage-files-networking-overview#private-endpoints). With this solution, FSLogix containers can be configured in multiple ways: + +- Cloud Cache Profile Container +- Cloud Cache Profile & Office Container +- Profile Container (Recommended) +- Profile & Office Container + +**Reference:** [FSLogix - Microsoft Docs](https://docs.microsoft.com/en-us/fslogix/overview) + +**Deployed Resources:** + +- Azure Storage Account (Optional) + - File Services + - Share(s) +- Azure NetApp Account (Optional) + - Capacity Pool + - Volume(s) +- Virtual Machine +- Network Interface +- Disk +- Private Endpoint (Optional) +- Private DNS Zone (Optional) diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/gpu.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/gpu.md new file mode 100644 index 000000000..d9ffc8a2a --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/gpu.md @@ -0,0 +1,32 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### GPU Drivers & Settings + +When an appropriate VM size (Nv, Nvv3, Nvv4, or NCasT4_v3 series) is selected, this solution will automatically deploy the appropriate virtual machine extension to install the graphics driver and configure the recommended registry settings. + +**Reference:** [Configure GPU Acceleration - Microsoft Docs](https://docs.microsoft.com/en-us/azure/virtual-desktop/configure-vm-gpu) + +**Deployed Resources:** + +- Virtual Machines Extensions + - AmdGpuDriverWindows + - NvidiaGpuDriverWindows + - CustomScriptExtension diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/highAvailability.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/highAvailability.md new file mode 100644 index 000000000..a359b7380 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/highAvailability.md @@ -0,0 +1,29 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### High Availability + +This optional feature will deploy the selected availability option and only provides high availability for "pooled" host pools since it is a load balanced solution. Virtual machines can be deployed in either Availability Zones or Availability Sets, to provide a higher SLA for your solution. SLA: 99.99% for Availability Zones, 99.95% for Availability Sets. + +**Reference:** [Availability options for Azure Virtual Machines - Microsoft Docs](https://docs.microsoft.com/en-us/azure/virtual-machines/availability) + +**Deployed Resources:** + +- Availability Set(s) (Optional) diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/monitoring.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/monitoring.md new file mode 100644 index 000000000..5e3d33c69 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/monitoring.md @@ -0,0 +1,35 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### Monitoring + +This feature deploys the required resources to enable the Insights workbook in the Azure Virtual Desktop blade in the Azure Portal. + +**Reference:** [Azure Monitor for AVD - Microsoft Docs](https://docs.microsoft.com/en-us/azure/virtual-desktop/azure-monitor) + +**Deployed Resources:** + +- Log Analytics Workspace + - Windows Events + - Performance Counters +- Microsoft Monitoring Agent extension +- Diagnostic Settings + - Host Pool + - Workspace diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/scalingTool.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/scalingTool.md new file mode 100644 index 000000000..505f5401a --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/scalingTool.md @@ -0,0 +1,35 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### Scaling Tool + +This feature is automatically deployed if a "pooled" host pool is selected to help save on cost. Based on the desired configuration, session hosts will scale up during peak hours and shutdown after peak hours. It is recommended to use policies to manage idle and disconnected over using the built-in capability in this tool. In this solution, a managed identity is deployed on the Automation Account to reduce the privileges needed for tool. + +**Reference:** [Scaling Tool - Microsoft Docs](https://docs.microsoft.com/en-us/azure/virtual-desktop/scaling-automation-logic-apps) + +**Deployed Resources:** + +- Automation Account + - Diagnostic Setting (optional) + - Job Schedules + - Runbook + - Schedules + - System Assigned Identity +- Role Assignment diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/serverSideEncryption.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/serverSideEncryption.md new file mode 100644 index 000000000..6bc21e374 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/serverSideEncryption.md @@ -0,0 +1,34 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### Server-Side Encryption with Customer Managed Keys + +This optional feature deploys the required resources & configuration to enable server-side encryption encryption on the session hosts using a customer managed key. The configuration also enables double encryption which uses a platform managed key in combination with the customer managed key. Also, the temp and cache disks are encrypted using the "encryption at host" feature. + +> **NOTE** +> If deploying a "pooled" host pool with FSLogix, the data in the profile and office containers are encrypted using encryption on the storage service, not the virtual machine. + +**Reference:** [Azure Server-Side Encryption - Microsoft Docs](https://learn.microsoft.com/azure/virtual-machines/disk-encryption) + +**Deployed Resources:** + +- Key Vault + - Key Encryption Key +- Disk Encryption Set diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/smbMultiChannel.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/smbMultiChannel.md new file mode 100644 index 000000000..91a5e0db4 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/smbMultiChannel.md @@ -0,0 +1,25 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### SMB Multichannel + +This feature is automatically enabled when Azure Files Premium is selected for FSLogix storage. This feature is only supported with Azure Files Premium and it allows multiple connections to an SMB share from an SMB client. + +**Reference:** [SMB Multichannel Performance - Microsoft Docs](https://docs.microsoft.com/en-us/azure/storage/files/storage-files-smb-multichannel-performance) diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/startVmOnConnect.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/startVmOnConnect.md new file mode 100644 index 000000000..cefb92fd5 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/startVmOnConnect.md @@ -0,0 +1,30 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### Start VM On Connect + +This optional feature allows your end users to turn on a session host when all the session hosts have been stopped / deallocated. This is done automatically when the end user opens the AVD client and attempts to access a resource. Start VM On Connect compliments scaling solutions by ensuring the session hosts can be turned off to reduce cost but made available when needed. + +**Reference:** [Start VM On Connect - Microsoft Docs](https://docs.microsoft.com/en-us/azure/virtual-desktop/start-virtual-machine-connect?tabs=azure-portal) + +**Deployed Resources:** + +- Role Assignment +- Host Pool diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/trustedLaunch.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/trustedLaunch.md new file mode 100644 index 000000000..3c6ff14ec --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/trustedLaunch.md @@ -0,0 +1,39 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### Trusted Launch + +This feature is enabled automatically with the safe boot and vTPM settings when the following conditions are met: + +- a generation 2, "g2", image SKU is selected +- the VM size supports the feature + +It is a security best practice to enable this feature to protect your virtual machines from: + +- boot kits +- rootkits +- kernel-level malware + +**Reference:** [Trusted Launch - Microsoft Docs](https://docs.microsoft.com/en-us/azure/virtual-machines/trusted-launch) + +**Deployed Resources:** + +- Virtual Machines + - Guest Attestation extension diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/features/validation.md b/src/bicep/add-ons/azureVirtualDesktop/docs/features/validation.md new file mode 100644 index 000000000..72a54046c --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/features/validation.md @@ -0,0 +1,31 @@ +# Azure Virtual Desktop Solution + +[**Home**](../../README.md) | [**Features**](../features.md) | [**Design**](../design.md) | [**Prerequisites**](../prerequisites.md) | [**Troubleshooting**](../troubleshooting.md) + +## Features + +- [**Auto Increase Premium File Share Quota**](./autoIncreasePremiumFileShareQuota.md#auto-increase-premium-file-share-quota) +- [**Backups**](./backups.md#backups) +- [**Drain Mode**](./drainMode.md#drain-mode) +- [**FSLogix**](./fslogix.md#fslogix) +- [**GPU Drivers & Settings**](./gpu.md#gpu-drivers--settings) +- [**High Availability**](./highAvailability.md#high-availability) +- [**Monitoring**](./monitoring.md#monitoring) +- [**Scaling Tool**](./scalingTool.md#scaling-tool) +- [**Server-Side Encryption with Customer Managed Keys**](./serverSideEncryption.md#server-side-encryption) +- [**SMB Multichannel**](./smbMultiChannel.md#smb-multichannel) +- [**Start VM On Connect**](./startVmOnConnect.md#start-vm-on-connect) +- [**Trusted Launch**](./trustedLaunch.md#trusted-launch) +- [**Validation**](./validation.md#validation) + +### Validation + +This feature will validate your deployment selections to ensure you are deploying a compliant configuration that follows Microsoft's best practices and collect information needed for the deployment. + +**Deployed Resources:** + +- Virtual Machine + - Custom Script Extension + - Disk + - Network Interface +- Role Assignments diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/prerequisites.md b/src/bicep/add-ons/azureVirtualDesktop/docs/prerequisites.md new file mode 100644 index 000000000..55a8e3beb --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/prerequisites.md @@ -0,0 +1,60 @@ +# Azure Virtual Desktop Solution + +[**Home**](../README.md) | [**Features**](./features.md) | [**Design**](./design.md) | [**Prerequisites**](./prerequisites.md) | [**Troubleshooting**](./troubleshooting.md) + +## Prerequisites + +To successfully deploy this solution, you will need to ensure the following prerequisites have been completed: + +### Required + +- **Licenses:** ensure you have the [required licensing for AVD](https://learn.microsoft.com/en-us/azure/virtual-desktop/overview#requirements). +- **Artifacts:** the deployment of this solution depends on many artifacts that must be hosted in Azure Blobs, ideally in the MLZ operations storage account. + - [AVD Agent](https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RWrmXv) + - [AVD Agent Boot Loader](https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RWrxrH) + - [Azure PowerShell AZ Module](https://github.com/Azure/azure-powershell/releases/download/v10.2.0-August2023/Az-Cmdlets-10.2.0.37547-x64.msi) + - [PowerShell Scripts](https://github.com/jamasten/AzureVirtualDesktop/tree/main/artifacts) +- **Azure Permissions:** ensure the principal deploying the solution has "Owner" and "Key Vault Administrator" roles assigned on the target Azure subscription. This solution contains many role assignments at different scopes so the principal deploying this solution will need to be an Owner at the subscription scope for a successful deployment. It also deploys keys and secrets in a key vault to enhance security. +- **Security Group:** create a security group for your AVD users. + - AD DS: create the group in ADUC and ensure the group has synchronized to Azure AD. + - Azure AD: create the group. + - Azure AD DS: create the group in Azure AD and ensure the group has synchronized to Azure AD DS. +- **Disk Encryption:** the "encryption at host" feature is deployed on the virtual machines to meet Zero Trust compliance. This feature is not enabled in your Azure subscription by default and must be manually enabled. Use the following steps to enable the feature: [Enable Encryption at Host](https://learn.microsoft.com/azure/virtual-machines/disks-enable-host-based-encryption-portal). +- **Enable AVD Private Link** this feature is not enabled on subscriptions by default. Use the following link to enable AVD Private Link on your subscription: [Enable the Feature](https://learn.microsoft.com/azure/virtual-desktop/private-link-setup?tabs=portal%2Cportal-2#enable-the-feature) + +### Optional + +- **Domain Services:** if you plan to domain or hybrid join the session hosts, ensure Active Directory Domain Services or Entra Domain Services is available in your enviroment and that you are synchronizing the required objects. AD Sites & Services should be configured for the address space of your Azure virtual network if you are extending your on premises Active Directory infrastruture into the cloud. +- **DNS:** if you plan to domain or hybrid join the sessions hosts, you must configure your DNS server in the MLZ Identity virtual network with ONE of the following options to support Private Link: + - DNS forwarder points to the [Azure VIP, 168.63.129.16](https://learn.microsoft.com/azure/virtual-network/what-is-ip-address-168-63-129-16). + - Conditional forwarders for the [Azure private DNS zones](https://learn.microsoft.com/azure/private-link/private-endpoint-dns) in the Hub resource group that point to the [Azure VIP, 168.63.129.16](https://learn.microsoft.com/azure/virtual-network/what-is-ip-address-168-63-129-16). +- **Domain Permissions** if using domain services, create a principal to domain join the session hosts and Azure Files, if applicable. + - Active Directory Domain Services: ensure the principal has the following permissions. + - "Join the Domain" on the domain + - "Create Computer" on the parent OU or domain + - "Delete Computer" on the parent OU or domain + - Entra Domain Services: ensure the principal is a member of the "AAD DC Administrators" group in Azure AD. +- **FSLogix with Azure NetApp Files:** the following steps must be completed if you plan to use this service. + - [Register the resource provider](https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-register) + - [Enable the shared AD feature](https://learn.microsoft.com/azure/azure-netapp-files/create-active-directory-connections#shared_ad) - this feature is required if you plan to deploy more than one domain joined NetApp account in the same Azure subscription and region. +- **Marketplace Image:** If you plan to deploy this solution using PowerShell or AzureCLI and use a marketplace image for the virtual machines, use the code below to find the appropriate image: + +```powershell +# Determine the Publisher; input the location for your AVD deployment +$Location = '' +(Get-AzVMImagePublisher -Location $Location).PublisherName + +# Determine the Offer; common publisher is 'MicrosoftWindowsDesktop' for Win 10/11 +$Publisher = '' +(Get-AzVMImageOffer -Location $Location -PublisherName $Publisher).Offer + +# Determine the SKU; common offers are 'Windows-10' for Win 10 and 'office-365' for the Win10/11 multi-session with M365 apps +$Offer = '' +(Get-AzVMImageSku -Location $Location -PublisherName $Publisher -Offer $Offer).Skus + +# Determine the Image Version; common offers are '21h1-evd-o365pp' and 'win11-21h2-avd-m365' +$Sku = '' +Get-AzVMImage -Location $Location -PublisherName $Publisher -Offer $Offer -Skus $Sku | Select-Object * | Format-List + +# Common version is 'latest' +``` diff --git a/src/bicep/add-ons/azureVirtualDesktop/docs/troubleshooting.md b/src/bicep/add-ons/azureVirtualDesktop/docs/troubleshooting.md new file mode 100644 index 000000000..0334c7993 --- /dev/null +++ b/src/bicep/add-ons/azureVirtualDesktop/docs/troubleshooting.md @@ -0,0 +1,7 @@ +# Azure Virtual Desktop Solution + +[**Home**](../README.md) | [**Features**](./features.md) | [**Design**](./design.md) | [**Prerequisites**](./prerequisites.md) | [**Troubleshooting**](./troubleshooting.md) + +## Troubleshooting + +If you need to redeploy this solution due to an error or to add resources, be sure the virtual machines (aka session hosts) are turned on. For "pooled" host pools, you must disable scaling as well. If the virtual machines are shutdown, the deployment will fail since virtual machine extensions cannot be updated when virtual machines are in a shutdown state. diff --git a/src/bicep/add-ons/azureVirtualDesktop/images/identifiers.png b/src/bicep/add-ons/azureVirtualDesktop/images/identifiers.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0209153aa0b5d048dce020385f061d8a4a51a7 GIT binary patch literal 85461 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%0A{_r7C=61UT3AJnU*Tdqds*< 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
5y^(=`kDqKH1&@gDB>0=OYxiHn^|I~{8 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 Bpws{W literal 0 HcmV?d00001 diff --git a/src/bicep/add-ons/azureVirtualDesktop/images/identifiers.vsdx b/src/bicep/add-ons/azureVirtualDesktop/images/identifiers.vsdx new file mode 100644 index 0000000000000000000000000000000000000000..e3f923ac505f8fb52a67446aea84ed11ff37fb5b GIT binary patch literal 164462 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 literal 0 HcmV?d00001 diff --git a/src/bicep/add-ons/azureVirtualDesktop/images/resources.png b/src/bicep/add-ons/azureVirtualDesktop/images/resources.png new file mode 100644 index 0000000000000000000000000000000000000000..94461e3a5b5feb6d13b2fad27e533b9a6ad5d73e GIT binary patch literal 138980 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