Using WMI to detect if running on a Windows 2003 or 2008 Terminal Server

by Jeremy Saunders on December 3, 2008

How can I detect if a Windows 2003/2008 server is configured for Remote Administration or running the Terminal Server role/service?

You can check the mode of the Windows Server 2003/2008 server using the TS WMI Provider’s Win32_TerminalServiceSetting LicensingType property:

0 = Personal Terminal Server – For Windows XP only

1 = Remote Desktop for Administration

2 = Per Device. Valid for application servers (true Terminal Servers)

4 = Per User. Valid for application servers (true Terminal Servers)

5 = Not configured yet. Valid for application servers (true Terminal Servers)

Alternatively, but not recommended moving forward, on a Windows 2003 server you can check the contents of the following registry DWORD value:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\TSAppCompat

0 = Remote Administration

1 = Application Server mode

Note that this key only will let you see what mode the server is in. To determine the Licensing Type, you would also need to query the following regitry DWORD value:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Licensing Core\PolicyAcOn

2 = Per Device configuration

4 = Per User configuration

To demontrate this I have created two functions:

  1. isTerminalServer
  2. isTerminalServerAlternate
Option Explicit

Dim strOS

strOS = GetOSFamily()

If isTerminalServer(strOS) Then
  wscript.echo "This is a Terminal Server"
Else
  wscript.echo "This is not a Terminal Server"
End If

If ucase(strOS) = "W2K3" Then
  If isTerminalServerAlternate Then
    wscript.echo "This is a Terminal Server"
  Else
    wscript.echo "This is not a Terminal Server"
  End If
End If

WScript.Quit(0)

Function GetOSFamily()
  Dim strComputer, oWMIService, colOSInfo, oOSProperty, strCaption, strOSFamily
  strComputer = "."
  Set oWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
  Set colOSInfo = oWMIService.ExecQuery("Select * from Win32_OperatingSystem")
  For Each oOSProperty in colOSInfo
    strCaption = oOSProperty.Caption
  Next
  If InStr(1,strCaption, "2008", vbTextCompare) Then strOSFamily = "W2K8"
  If InStr(1,strCaption, "2003", vbTextCompare) Then strOSFamily = "W2K3"
  GetOSFamily = strOSFamily
  Set oWMIService = Nothing
  Set colOSInfo = Nothing
End Function

Function isTerminalServer(strOS)
  Dim strComputer, strNameSpace, objWMIService, colItems, objItem   
  strComputer = "."
  If ucase(strOS) = "W2K3" Then
    strNameSpace = "\root\cimv2"
  Else
    strNameSpace = "\root\cimv2\TerminalServices"
  End If
  Set objWMIService = GetObject("winmgmts:" _   
    & "{impersonationLevel=impersonate}!\\" & strComputer & strNameSpace)  
  Set colItems = objWMIService.ExecQuery _  
    ("Select * from Win32_TerminalServiceSetting")  
  For Each objItem in colItems  
    Select Case objItem.LicensingType  
      Case "1" ' Remote Administration
        isTerminalServer = False
      Case "2" ' Per Device
        isTerminalServer = True
      Case "4" ' Per User
        isTerminalServer = True
      Case "5" ' Not configured yet
        isTerminalServer = True
      Case Else
        isTerminalServer = False  
    End Select
  Next  
  Set objWMIService = Nothing  
  Set colItems = Nothing  
End Function

Function isTerminalServerAlternate
  Dim objShell, strValue, strValueData
  strValue = "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\TSAppCompat"
  Set objShell = CreateObject("WScript.Shell")
  strValueData = objShell.RegRead(strValue)
  If strValueData = "1" Then
    isTerminalServerAlternate = True
  Else
    isTerminalServerAlternate = False
  End If
  Set objShell = Nothing
End Function
Jeremy Saunders

Jeremy Saunders

Technical Architect | DevOps Evangelist | Software Developer | Microsoft, NVIDIA, Citrix and Desktop Virtualisation (VDI) Specialist/Expert | Rapper | Improvisor | Comedian | Property Investor | Kayaking enthusiast at J House Consulting
Jeremy Saunders is the Problem Terminator. He is a highly respected IT Professional with over 35 years’ experience in the industry. Using his exceptional design and problem solving skills with precise methodologies applied at both technical and business levels he is always focused on achieving the best business outcomes. He worked as an independent consultant until September 2017, when he took up a full time role at BHP, one of the largest and most innovative global mining companies. With a diverse skill set, high ethical standards, and attention to detail, coupled with a friendly nature and great sense of humour, Jeremy aligns to industry and vendor best practices, which puts him amongst the leaders of his field. He is intensely passionate about solving technology problems for his organisation, their customers and the tech community, to improve the user experience, reliability and operational support. Views and IP shared on this site belong to Jeremy.
Jeremy Saunders
Jeremy Saunders

Previous post:

Next post: