2026-06-05 · 14 min read · Cloud Migration

Mastering Azure Virtual Desktop: A Comprehensive Setup Guide for SMBs

Abstract illustration of cloud computing with connected devices, symbolizing an Azure Virtual Desktop setup.

In today's dynamic business landscape, enabling secure, flexible remote work is no longer a luxury but a necessity for Small and Medium-sized Businesses (SMBs). Traditional on-premises desktop infrastructure often struggles with scalability, security, and cost-efficiency. This is where Azure Virtual Desktop (AVD) shines. As your trusted Montreal-based IT consultants at SkyCore Solutions, we've crafted this comprehensive Azure Virtual Desktop setup guide to empower your SMB to deploy a robust, secure, and scalable virtual desktop infrastructure on Azure.

By the end of this guide, you will have a fully functional Azure Virtual Desktop environment, enabling your team to access their Windows 11 multi-session desktops and applications from anywhere, on any device, significantly reducing IT overhead and enhancing productivity.

Prerequisites

Step 1: Prepare Azure Subscription and Resource Group

Before deploying any resources, ensure your Azure subscription is ready for Azure Virtual Desktop and create a dedicated resource group to logically organize your AVD components. This makes management and cost tracking much easier.

az provider register --namespace Microsoft.DesktopVirtualization
az group create --name "avd-rg-skycore-prod" --location "canadacentral"

Portal alternative:

Run this to verify:

az provider show --namespace Microsoft.DesktopVirtualization --query registrationState
az group show --name "avd-rg-skycore-prod" --query name

Step 2: Set Up Azure Virtual Network (VNet)

Your Azure Virtual Desktop session hosts require a virtual network to communicate with each other, your users, and any on-premises resources (if applicable). This VNet will host your session host VMs and typically connects to your identity provider.

az network vnet create \
  --name "avd-vnet-skycore" \
  --resource-group "avd-rg-skycore-prod" \
  --location "canadacentral" \
  --address-prefixes "10.0.0.0/16"

az network vnet subnet create \
  --name "avd-subnet" \
  --vnet-name "avd-vnet-skycore" \
  --resource-group "avd-rg-skycore-prod" \
  --address-prefixes "10.0.1.0/24"

Portal alternative:

Run this to verify:

az network vnet show --name "avd-vnet-skycore" --resource-group "avd-rg-skycore-prod" --query subnets[].name
Pro tip: Optimized OS Image
For maximum efficiency and the best user experience, always choose an Azure Gallery image optimized for Azure Virtual Desktop. For SMBs, Windows 11 Enterprise multi-session + Microsoft 365 Apps (or a similar optimized Windows 10 image) is highly recommended. This allows multiple users to share a single VM while still getting a full desktop experience, significantly reducing VM count and costs.

Step 3: Create an Azure Virtual Desktop Host Pool

The host pool defines the collection of Azure virtual machines (session hosts) that provide desktops and applications to your users. For SMBs, we highly recommend a Pooled host pool with Breadth-first load balancing for optimal resource utilization and cost savings. We'll utilize the streamlined "Session host configuration" (currently in preview) for simplified VM lifecycle management directly within the host pool.

az desktopvirtualization hostpool create \
  --name "avd-hostpool-prod" \
  --resource-group "avd-rg-skycore-prod" \
  --location "canadacentral" \
  --host-pool-type "Pooled" \
  --load-balancer-type "BreadthFirst" \
  --preferred-app-group-type "Desktop" \
  --managed-identity "SystemAssigned" \
  --initial-session-hosts 2 \
  --vm-size "Standard_D2s_v5" \
  --os-disk-type "StandardSSD_LRS" \
  --image-publisher "MicrosoftWindowsDesktop" \
  --image-offer "Windows-11" \
  --image-sku "win11-22h2-avd" \
  --vnet-name "avd-vnet-skycore" \
  --subnet-name "avd-subnet" \
  --domain-join-user-principal-name "AVDJOURNAL@skycore.onmicrosoft.com" \
  --domain-join-password "YourSecurePassword!"

Portal alternative:

Run this to verify:

az desktopvirtualization hostpool show --name "avd-hostpool-prod" --resource-group "avd-rg-skycore-prod" --query "{name:name, hostPoolType:hostPoolType, loadBalancerType:loadBalancerType}"
az vm list --resource-group "avd-rg-skycore-prod" --query "[].name"
Common pitfall: Licensing Confusion
Azure Virtual Desktop licensing can be complex. Ensure every user accessing AVD has a qualifying Microsoft 365 or Windows Enterprise license. Failing to do so can lead to compliance issues and unexpected costs. Consult with a licensing specialist if unsure.

Step 4: Create and Link an Azure Virtual Desktop Workspace

A workspace logically groups your host pools and application groups. Users subscribe to a workspace to see all their assigned desktops and applications. Your host pool needs to be registered with a workspace.

az desktopvirtualization workspace create \
  --name "avd-workspace-skycore" \
  --resource-group "avd-rg-skycore-prod" \
  --location "canadacentral"

az desktopvirtualization workspace update \
  --name "avd-workspace-skycore" \
  --resource-group "avd-rg-skycore-prod" \
  --host-pool "avd-hostpool-prod"

Portal alternative:

Run this to verify:

az desktopvirtualization workspace show --name "avd-workspace-skycore" --resource-group "avd-rg-skycore-prod" --query name

Step 5: Assign Users to Application Groups

To grant users access to the virtual desktops or applications, you need to assign them to an application group. When you created the host pool, a default desktop application group (-DAG suffix) was automatically created. We'll assign an Azure AD group to this default desktop application group.

# First, get the object ID of your Azure AD group (e.g., 'AVD Users Group')
az ad group show --group "AVD Users Group" --query id --output tsv

# Replace  with the ID obtained above
az role assignment create \
  --assignee-object-id "" \
  --role "Desktop Virtualization User" \
  --resource-group "avd-rg-skycore-prod" \
  --scope "/subscriptions//resourceGroups/avd-rg-skycore-prod/providers/Microsoft.DesktopVirtualization/applicationGroups/avd-hostpool-prod-DAG"

Portal alternative:

Run this to verify:

az desktopvirtualization applicationgroup show --name "avd-hostpool-prod-DAG" --resource-group "avd-rg-skycore-prod" --query name

# (No direct CLI command to list user assignments easily, portal is best for verification here)

Step 6: Configure Diagnostics and Monitoring

Enabling diagnostics for your AVD components is crucial for troubleshooting user connection issues, session host performance, and general service health. We'll send logs to a Log Analytics Workspace.

# Create a Log Analytics Workspace if you don't have one
az monitor log-analytics workspace create \
  --resource-group "avd-rg-skycore-prod" \
  --workspace-name "avd-loganalytics-skycore" \
  --location "canadacentral"

# Get the Log Analytics Workspace ID
LOG_ANALYTICS_WORKSPACE_ID=$(az monitor log-analytics workspace show \
  --resource-group "avd-rg-skycore-prod" \
  --workspace-name "avd-loganalytics-skycore" \
  --query id --output tsv)

# Configure diagnostic settings for the Host Pool
az monitor diagnostic-settings create \
  --name "avd-hostpool-diag" \
  --resource-group "avd-rg-skycore-prod" \
  --resource "/subscriptions//resourceGroups/avd-rg-skycore-prod/providers/Microsoft.DesktopVirtualization/hostPools/avd-hostpool-prod" \
  --workspace "$LOG_ANALYTICS_WORKSPACE_ID" \
  --logs '[{"categoryGroup": "allLogs", "enabled": true}]' \
  --metrics '[{"category": "AllMetrics", "enabled": true}]'

# Configure diagnostic settings for the Workspace
az monitor diagnostic-settings create \
  --name "avd-workspace-diag" \
  --resource-group "avd-rg-skycore-prod" \
  --resource "/subscriptions//resourceGroups/avd-rg-skycore-prod/providers/Microsoft.DesktopVirtualization/workspaces/avd-workspace-skycore" \
  --workspace "$LOG_ANALYTICS_WORKSPACE_ID" \
  --logs '[{"categoryGroup": "allLogs", "enabled": true}]' \
  --metrics '[{"category": "AllMetrics", "enabled": true}]'

Portal alternative:

Run this to verify:

az monitor diagnostic-settings list --resource-group "avd-rg-skycore-prod" --query "[?contains(name, 'avd')].name"

Step 7: Implement Core Security Best Practices

Security is paramount for any cloud deployment. Azure Virtual Desktop leverages Azure's robust security features. Implementing these best practices will significantly harden your environment.

# Create Network Security Group (NSG) for session hosts
az network nsg create \
  --name "avd-nsg-sessionhosts" \
  --resource-group "avd-rg-skycore-prod" \
  --location "canadacentral"

# Associate NSG with the subnet (replace  with your VNet's resource ID)
# To get VNET_ID: az network vnet show --name "avd-vnet-skycore" --resource-group "avd-rg-skycore-prod" --query id --output tsv
az network vnet subnet update \
  --name "avd-subnet" \
  --vnet-name "avd-vnet-skycore" \
  --resource-group "avd-rg-skycore-prod" \
  --network-security-group "avd-nsg-sessionhosts"

# Add an NSG rule to allow outbound internet access (for updates/browsing)
az network nsg rule create \
  --name "AllowOutboundInternet" \
  --nsg-name "avd-nsg-sessionhosts" \
  --resource-group "avd-rg-skycore-prod" \
  --priority 100 \
  --source-address-prefixes "VirtualNetwork" \
  --destination-address-prefixes "Internet" \
  --destination-port-ranges "*" \
  --direction "Outbound" \
  --access "Allow" \
  --protocol "*" \
  --description "Allow outbound internet access for session hosts"

# AVD uses reverse connect, so no inbound ports are needed for client connections.
# However, if you need RDP for admin access from specific IPs, add a rule:
az network nsg rule create \
  --name "AllowRDPFromAdminIP" \
  --nsg-name "avd-nsg-sessionhosts" \
  --resource-group "avd-rg-skycore-prod" \
  --priority 200 \
  --source-address-prefixes "YOUR_ADMIN_PUBLIC_IP_RANGE" \
  --destination-address-prefixes "*" \
  --destination-port-ranges "3389" \
  --direction "Inbound" \
  --access "Allow" \
  --protocol "Tcp" \
  --description "Allow RDP for administrators from specific IPs"

Portal alternative:

Run this to verify:

az network nsg rule list --nsg-name "avd-nsg-sessionhosts" --resource-group "avd-rg-skycore-prod" --query "[].name"

Step 8: Test User Connectivity and Experience

With your Azure Virtual Desktop environment deployed and users assigned, the final step is to verify that users can successfully connect to their virtual desktops and applications. This confirms your setup is complete and functional.

Instruct your users to:

  1. Download the Remote Desktop Client: The recommended client is the Windows App (formerly Remote Desktop Client) for Windows, macOS, iOS, or Android. For Linux, use a compatible RDP client.
  2. Subscribe to the Workspace:
    • Open the Windows App.
    • Click "Add" and choose "Workspace".
    • Enter the subscription URL: https://rdweb.wvd.microsoft.com/api/arm/feeddiscovery
    • Sign in with their Azure AD credentials (the user must be part of the group assigned in Step 5).
  3. Launch Desktop/Application: Once subscribed, the published desktop (e.g., "SessionDesktop") will appear. Users can click on it to launch their virtual desktop.
  4. Web Client Alternative: Users can also access AVD via a web browser by navigating to https://client.wvd.microsoft.com/, signing in with their Azure AD credentials, and launching their resources.

Run this to verify: (User-side verification)

When to bring in a consultant

While this Azure Virtual Desktop setup guide covers the essential steps for a functional deployment, complex scenarios often benefit from expert guidance. Consider engaging SkyCore Solutions if you face:

Our team of senior Azure architects specializes in tailoring cloud solutions for SMBs, ensuring your Azure Virtual Desktop deployment is not just functional, but perfectly aligned with your business goals and security posture.

Book a free consultation

References