Logging off and removing WVD user sessions in bulk

Like other Microsoft services, Windows Virtual Desktop ships with required PowerShell modules to interact with WVD resources. Microsoft Azure Portal provides a limited set of functionalities through which you can manage some aspects of the Windows Virtual Desktop environment, but you are still required to use PowerShell modules to perform certain tasks. For example, you cannot remove or disconnect user sessions in bulk using the Azure Portal. This is where this article comes handy. In this article, we explain the difference between logging off and remove actions and what PowerShell modules to use to log off and removing WVD user sessions for all or selected host pools. Please note this article explains modules used for Windows Virtual Desktop Spring Update. Before you start to use PowerShell commands or scripts explained in this article, please ensure you install WVD PowerShell modules.

Understanding the difference between logging off and removing user sessions

Before you start to use the PowerShell commands and scripts explained in this article, let us understand the differences between logging off and removing user sessions. When you log off a user session from a WVD tenant, the process actually disconnects the session and keeps the session alive with the “disconnected” state on the session host. On the other hand, when you remove a user session, the process actually removes the session from the session host and also removes session entry from the WVD database.

Tip: The removal of the session always frees up system resources on the session host, whereas logging off a session keeps the session alive, which, in turn, uses the system resources. So, if any of the session hosts run out of system resources because a particular user is causing system resources to be utilized by the applications running by the user, you can use the removal method to remove the user session from the session host.

Installing Az.DesktopVirtualization PowerShell module

For WVD 2.0, you are required to use the Az.DesktopVirtualization PowerShell module. To install Az.DesktopVirtualization PowerShell modules, you need to execute this command:
Install-Module -Name Az.DesktopVirtualization
After executing the above command, you should have Az.DesktopVirtualization PowerShell modules installed on your computer. To confirm that you have Az.DesktopVirtualization PowerShell modules installed, open PowerShell ISE, and then check for Get-AzWVDUserSession or similar PowerShell cmdlets.

Connecting to Azure Windows Virtual Desktop 2.0 environment

Once you have installed the PowerShell modules, you will be required to use the Connect-AzConnect PowerShell module to connect to the WVD 2.0 environment. You can either connect using an Azure username and password or use a Service Principal.

Logging off or removing a single user session

To log off or remove a single user session from WVD, you can always use the Disconnect-AzWVDUserSession or Remove-AzWVDUserSession PowerShell cmdlet. Here are a few examples that explain how to log off or remove single user sessions using PowerShell cmdlets. Please make sure to provide inputs to variables as part of the commands before executing.

To log off a user session:

$CurResGroup = "ThisResourceGroup"
$CurPool = "HostPoolName"
$SessHost = "SessionHostName"
$CurSessID = "15"
Disconnect-AzWvdUserSession -ResourceGroupName $CurResGroup -HostPoolName $CurPool -SessionHostName $SessHost -Id $CurSessID

To remove a user session:

$CurResGroup = "ThisResourceGroup"
$CurPool = "HostPoolName"
$SessHost = "SessionHostName"
$CurSessID = "15"
Remove-AzWvdUserSession -ResourceGroupName $CurResGroup -HostPoolName $CurPool -SessionHostName $SessHost -Id $CurSessID

Logging off or removing user sessions in bulk

To start logging off or removing user sessions in bulk, you can use the PowerShell script below. Make sure to modify the scripts to provide inputs for the resource group and host pool. The PowerShell script below, which is collected from Wintellisys WVD Manager management packs, can be utilized only for a single host pool.

Note that the script can be used to perform one action at a time — either remove the user session or log off the user session. By default, it takes “Remove” action. To change the action, modify the “$LogOffOrRemove” variable.

$CurResGroup = "ThisResourceGroup"
$CurPool = "HostPoolName"
$LogOffOrRemove = "Remove"
$UserSessFile = "C:\Temp\AllUserSessions.CSV"
Remove-item$UserSessFile -ErrorActionSilentlyContinue
Get-AzWvdUserSession-ResourceGroupName$CurResGroup -HostPoolName $CurPool | Select-Object* | Export-CSV$UserSessFile
$CSV = Import-CSV$UserSessFile
ForEach ($Item in $CSV)
$SessHost = $Item.SessionHostName
$CurSessID = $Item.SessionID
IF ($LogOffOrRemove -eq "Remove")
Remove-AzWvdUserSession-ResourceGroupName $CurResGroup -HostPoolName $CurPool -SessionHostName $SessHost -Id $CurSessID
IF ($LogOffOrRemove -eq "Logoff")
Disconnect-AzWvdUserSession-ResourceGroupName $CurResGroup -HostPoolName $CurPool -SessionHostName $SessHost -Id $CurSessID
IF ($Error.Count -eq 0)

The PowerShell script connects to a host pool specified in the “$CurPool” variable and then collects all user sessions from that host pool. The user sessions are stored in a CSV file named C:\Temp\AllUserSessions.CSV for processing by the next PowerShell commands. The ForEach loop retrieves required information from the CSV file and then takes an action: remove or log off.

One host pool only

The script can only be targeted to one host pool and you are required to provide the resource group name of the host pool. If you have hundreds of host pools, maintaining PowerShell scripts for all host pools becomes a little challenging, and also you need to make sure you are executing the logoff or remove commands for the correct host pool to avoid any disruption in your business services. It is worth mentioning that there are applications and tools available that you could utilize without causing any downtime to WVD services. Wintellisys WVD Manager Version 2.1 provides user sessions manager component that maintains connections for all host pools in your production environment and helps you log off or remove WVD user sessions for selected host pools as shown in the screenshot below:

The application also maintains logs for actions performed using the Wintellisys WVD Manager. For example, if a user performs log off action and another user performs a remove action, you can easily find who performed what by looking at the operational logs in WVD Manager.

Featured image: Pixabay

Nirmal Sharma

Nirmal Sharma is a MCSEx3, MCITP and was awarded the Microsoft MVP award in Directory Services and Windows Networking. He specializes in Microsoft Azure, Office 365, Directory Services, Failover Clusters, Hyper-V, PowerShell Scripting and System Center products. Nirmal has been involved with Microsoft Technologies since 1994. In his spare time, he likes to help others and share some of his knowledge by writing tips and articles on various sites.

Published by
Nirmal Sharma

Recent Posts

Restoring reputation and customer trust after a data breach

Managing the aftermath of a data breach is ultimately about winning customer trust and restoring…

11 hours ago

Virtualization host maintenance: Defining servicing windows for your VMs

As it is with all IT environments, virtualization hosts maintenance can be disruptive. Using servicing…

16 hours ago

4 startups bringing artificial intelligence to your apps

Artificial intelligence is hot as it moves from high-tech concept to real-world applications. Innovative startups…

1 day ago

Why so many companies are jumping on the Microsoft Teams bandwagon

Microsoft Teams surged as COVID-19 forced companies to switch to a work-from-home model. Here’s why…

2 days ago

How to manage log files in Exchange server: Step-by-step guide

Sponsored by Stellar Data RecoveryExchange Server generates lots of log files — which take up…

2 days ago

Everything you need to know about Virtual Machine Manager

Even as virtualization grows in popularity, some companies have yet to get onboard. Here’s how…

2 days ago