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:
- isTerminalServer
- 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
