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

Independent Consultant | Contractor | Microsoft & Citrix Specialist | Desktop Virtualization Specialist at J House Consulting
Jeremy is a highly respected, IT Professional, with over 30 years’ experience in the industry. He is an independent IT consultant providing expertise to enterprise, corporate, higher education and government clients. His skill set, high ethical standards, integrity, morals and attention to detail, coupled with his friendly nature and exceptional design and problem solving skills, makes him one of the most highly respected and sought after Microsoft and Citrix technical resources in Australia. His alignment with industry and vendor best practices puts him amongst the leaders of his field.
Jeremy Saunders
Jeremy Saunders
Jeremy Saunders
  • Pingback: WMI Filter examples | ?????? ? IT()

  • Mike

    Could you put in this script feature to connect to remote computer ?

  • Chris King

    Wow, old post. But, at least for our 2008 servers, LicenseType is usually 4 regardless of whether it is in remote admin or application mode. I test for that AND TerminalServerMode = 1.
    #get a list of computer names however you like
    $computers | foreach{
    $servername = $_
    $obj = Get-WmiObject -query “Select * from Win32_TerminalServiceSetting” `
    -namespace “rootcimv2TerminalServices” -computername $servername
    $licType = $obj.LicensingType
    # 0 = admin mode 1 = application mode
    $appMode = $obj.TerminalServerMode
    if($appMode -eq 1)
    {
    “$servername`t$appMode`t$licType”
    }
    }

    • Hi Chris, Yeah, I used to use this function in my automated build process before switching over to MDT in 2010. I had developed my own “task sequence”, where app install decisions were based on whether or not it’s a Terminal/Citrix server. Thanks for your input. Cheers, Jeremy

Previous post:

Next post: