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

by Jeremy 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

Related posts:

  1. Tuning and Tweaking Tips for Terminal/Citrix Server Environments
  2. Microsoft Windows 2003 Post-SP2 Hotfixes
  3. Place a XenApp Server in and out of service the easy way

Leave a Comment

 

Previous post:

Next post: