Pages

Saturday, May 28, 2016

Reset Terminal Server (RDS) Grace Period using PowerShell


Reset Terminal Services Licensing Grace Period to 120 Days
We often need to deploy Terminal Server (Remote Desktop Session Host in 2012/2016/2019) for testing purposes in development environments allowing more than 2 concurrent Remote Desktop Sessions on it. When it is installed, by default it is in default Grace licensing period which is 120 days and it works fine without specifying any TS Licensing server and Licensing Mode.

Once Grace period expires, the server does not allow even a single Remote Desktop session via RDP and all we can do is logon to the Console of machine using Physical/Virtual console depending on Physical or Virtual machines or try to get in using mstsc /admin or mstsc /console, then remove the role completely and restart the terminal server and then it starts accepting default two RDP sessions.

We sometimes find ourselves in situation when server is nearing to the end of grace period and we don’t have a TS Licensing server in place and we need the default grace period to be reset/extended to next 120 days.

I have created a Script which can be used to query the remaining days of grace period and extend/reset it to next 120 days in case needed.
 
Updated on Aug 21st 2021: 
  • Applied a Validation check if the PowerShell Console has been Launched as Administrator.
  • Updated remaining Grace Period query from  Get-WmiObject to Get-CIMInstance since Get-WmiObject no longer there in PowerShell 7
 
Updated earlier: 
  • The script has been updated with a -Force switch, If -Force switch parameter is used, It will not ask for Y/N prompt while doing the reset.
Here is how to use this script without any prompt now: 
 
.\Reset-TSGracePeriod.ps1 -Force
 
Alternatively I have also uploaded this code on My Github Repository which show the changes between old and new script.

https://github.com/Prakash82x/PowerShell/blob/master/TerminalService/Reset-TSGracePeriod.ps1


OR
 
Here goes the code.
 
 

# This Script is intended to be used for Querying remaining time and resetting Terminal Server (RDS) Grace Licensing Period to Default 120 Days.

## Developed by Prakash Kumar (prakash82x@gmail.com) May 28th 2016

## www.adminthing.blogspot.com

## Disclaimer: Please test this script in your test environment before executing on any production server.

## Author will not be responsible for any misuse/damage caused by using it.

Param(

        [Parameter(Mandatory=$false)] [Switch]$Force

     )

 

Clear-Host

$ErrorActionPreference = "SilentlyContinue"

 

## Check if PowerShell Console has been launched As Administrator

if (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {

 

## Display current Status of remaining days from Grace period.

$GracePeriod = (Invoke-CimMethod -InputObject (Get-CimInstance -Namespace root/CIMV2/TerminalServices -ClassName Win32_TerminalServiceSetting) -MethodName GetGracePeriodDays).DaysLeft

Write-Host -fore Green ======================================================

Write-Host -fore Green 'Terminal Server (RDS) grace period Days remaining are' : $GracePeriod

Write-Host -fore Green ====================================================== 

Write-Host

 

## Check if -Force Parameter has been used, If so, It will not prompt for Y/N while executing the script and will simply reset the Grace Period.

If (-not $Force)

{

$Response = Read-Host "Do you want to reset Terminal Server (RDS) Grace period to Default 120 Days ? (Y/N)"

}

 

if ($Response -eq "Y" -or $Force) {

## Reset Terminal Services Grace period to 120 Days

 

$definition = @"

using System;

using System.Runtime.InteropServices;

namespace Win32Api

{

       public class NtDll

       {

             [DllImport("ntdll.dll", EntryPoint="RtlAdjustPrivilege")]

             public static extern int RtlAdjustPrivilege(ulong Privilege, bool Enable, bool CurrentThread, ref bool Enabled);

       }

}

"@

 

Add-Type -TypeDefinition $definition -PassThru

 

$bEnabled = $false

 

## Enable SeTakeOwnershipPrivilege

$res = [Win32Api.NtDll]::RtlAdjustPrivilege(9, $true, $false, [ref]$bEnabled)

 

## Take Ownership on the Key

$key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Control\Terminal Server\RCM\GracePeriod", [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::takeownership)

$acl = $key.GetAccessControl()

$acl.SetOwner([System.Security.Principal.NTAccount]"Administrators")

$key.SetAccessControl($acl)

 

## Assign Full Controll permissions to Administrators on the key.

$rule = New-Object System.Security.AccessControl.RegistryAccessRule ("Administrators","FullControl","Allow")

$acl.SetAccessRule($rule)

$key.SetAccessControl($acl)

 

## Finally Delete the key which resets the Grace Period counter to 120 Days.

Remove-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\RCM\GracePeriod'

 

write-host

Write-host -ForegroundColor Red 'Resetting, Please Wait....'

Start-Sleep -Seconds 10

 

}

 

Else

    {

Write-Host

Write-Host -ForegroundColor Yellow '**You Chose not to reset Grace period of Terminal Server (RDS) Licensing'

  }

 

## Display Remaining Days again as final status

tlsbln.exe

$GracePost = (Invoke-CimMethod -InputObject (Get-CimInstance -Namespace root/CIMV2/TerminalServices -ClassName Win32_TerminalServiceSetting) -MethodName GetGracePeriodDays).DaysLeft

Write-Host

Write-Host -fore Yellow =====================================================

Write-Host -fore Yellow 'Terminal Server (RDS) grace period Days remaining are' : $GracePost

Write-Host -fore Yellow =====================================================

 

if ($Response -eq "Y" -or $Force)

        {

            Write-Host -Fore Cyan `n"IMPORTANT: Please make sure you restart following services manually to bring this reset in effect:`n`n* Remote Desktop Configuration Properties `n* Remote Desktop Services"

        }

}

Else

{

    Write-Host -fore RED =====================================================

    Write-host -ForegroundColor RED *`0`0`0`0 Please Launch PowerShell as Administrator `0`0`0`0*

    Write-Host -fore RED =====================================================

}

## Cleanup of Variables

Remove-Variable * -ErrorAction SilentlyContinue

 



##End of Code##

Note: You will have to restart following services for the reset to come into effect.

  • Remote Desktop Configuration Properties
  • Remote Desktop Services
 
As soon as these services are restarted all the active sessions will be disconnected (Not logged off), Wait for a minute and reconnect again.

Please post in comments below if you think it can be improved.