Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Here is a VBScript which can be used to get the following information from a W2K, W2K3, W2K8 or W2K8R2 server via WMI:
- is Remote Desktop enabled?
- is Terminal Services / Remote Desktop Services configured for Application Server or Remote Administration?
- what TS/RDS license servers have been defined?
- what TS license servers have been discovered? (no longer applies after W2K8)
Please forgive the appearance if the blog layout wraps the lines, and hopefully HTML encoding won’t make a mess of the code – the script has only had basic testing so let me know if there’s any mistakes in it.
The reasons for the complexity of the script:
- the registry location of the information changes between versions of Windows
- settings can be defined locally or via group policy, the latter taking precedence
- LS checks are done only if the server is in Application Server mode
- “discovered” LS servers are only sought if the NT version is 5.0, 5.2 or 6.0
It has been designed to query just one server at a time and output a readable summary of what it finds – it would be trivial to call the script repeatedly with a different server name to build an inventory and pipe the information where you desire.
'-------------------------------------------------------------------------------
' THIS SCRIPT IS PROVIDED "AS-IS" AND DOES NOT COME WITH SUPPORT FROM MICROSOFT
'
' CheckTS.vbs
'
' Syntax:
' CSCRIPT /NoLogo CheckTS.vbs [/S:servername]
'
' Example:
' CSCRIPT /NoLogo CheckTS.vbs /S:FOO > FOO.TXT
' (Reports on remote server "FOO" and pipe the output to FOO.TXT)
'
' If no server name is specified, localhost is used
'-------------------------------------------------------------------------------
Option Explicit
Const HKEY_LOCAL_MACHINE = &H80000002
Dim strComputer, strKey, strValue, strOutput
Dim objReg
If WScript.Arguments.Named.Exists("S") Then
strComputer=UCase(WScript.Arguments.Named.Item("S"))
Else
strComputer = "localhost"
End If
On Error Resume Next
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
strComputer & "\root\default:StdRegProv")
If Err.Number <> 0 Then
' Gracefully handle a failure to connect to the remote machine
WScript.Echo "There was a problem connecting to " & strComputer & vbCrLf &_
"Error " & Err.Number & " " & Err.Description
WScript.Quit
End If
On Error Goto 0
strOutput = "Checking server: " & strComputer & vbCrLf
'-------------------------------------------------------------------------------
' Retrieve the Windows version from the remote machine,
' as we need to know which registry keys we are to check
'-------------------------------------------------------
Dim strWindowsVersion
strValue = "CurrentVersion"
strKey = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
objReg.GetSTRINGValue HKEY_LOCAL_MACHINE,strKey,strValue,strWindowsVersion
strOutput = strOutput & "OS Version: " & strWindowsVersion
If strWindowsVersion = "5.0" Then
strOutput = strOutput & " (Windows 2000)"
End If
If strWindowsVersion = "5.2" Then
strOutput = strOutput & " (Windows Server 2003)"
End If
If strWindowsVersion = "6.0" Then
strOutput = strOutput & " (Windows Server 2008)"
End If
If strWindowsVersion = "6.1" Then
strOutput = strOutput & " (Windows Server 2008R2)"
End If
strOutput = strOutput & vbCrLf
'-------------------------------------------------------------------------------
' Is the server accepting Remote Desktop Connections?
' (fDenyTSConnections = 0)
'----------------------------------------------------
Dim iRDDisabledLOCAL, iRDDisabledPOLICY
strValue = "fDenyTSConnections"
strKey = "SYSTEM\CurrentControlSet\Control\Terminal Server"
iRDDisabledLOCAL = 1
If ExistsDWORD Then
objReg.GetDWORDValue HKEY_LOCAL_MACHINE,strKey,strValue,iRDDisabledLOCAL
End If
strKey = "SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services"
iRdDisabledPOLICY = -1
If ExistsDWORD Then
objReg.GetDWORDValue HKEY_LOCAL_MACHINE,strKey,strValue,iRDDisabledPOLICY
End If
If iRDDisabledPOLICY <> -1 Then
' Setting is defined in a policy
If iRDDisabledPOLICY = 1 Then
strOutput = strOutput & "Remote Desktop is DISABLED (via policy)" & vbCrLf
Else
strOutput = strOutput & "Remote Desktop is ENABLED (via policy)" & vbCrLf
End If
Else
' Setting is not defined in a policy (so local or default setting applies)
If iRDDisabledLOCAL = 1 Then
strOutput = strOutput & "Remote Desktop is DISABLED (locally)" & vbCrLf
Else
strOutput = strOutput & "Remote Desktop is ENABLED (locally)" & vbCrLf
End If
End If
'-------------------------------------------------------------------------------
' Is the server running in Application Server mode?
' (TSAppCompat = 1)
'--------------------------------------------------
Dim iTSAppCompat
strValue = "TSAppCompat"
strKey = "SYSTEM\CurrentControlSet\Control\Terminal Server"
iTSAppCompat = -1
If ExistsDWORD Then
objReg.GetDWORDValue HKEY_LOCAL_MACHINE,strKey,strValue,iTSAppCompat
End If
If iTSAppCompat = 1 Then
strOutput = strOutput & "Terminal Services is in APPLICATION SERVER mode" & vbCrLf
Else
strOutput = strOutput & "Terminal Services is in REMOTE ADMINISTRATION mode" & vbCrLf
End If
'-------------------------------------------------------------------------------
' If the server is running in Application Server mode, check the licensing mode
' (LicensingMode = 2 for per-device, 4 for per-user)
'------------------------------------------------------------------------------
Dim iLicensingModeLOCAL, iLicensingModePOLICY
If iTSAppCompat = 1 Then
strValue = "LicensingMode"
strKey = "SYSTEM\CurrentControlSet\Control\Terminal Server"
If (strWindowsVersion = "6.0" Or strWindowsVersion = "6.1") Then
strKey = "SYSTEM\CurrentControlSet\Control\Terminal Server\RCM\Licensing Core"
End If
If ExistsDWORD Then
objReg.GetDWORDValue HKEY_LOCAL_MACHINE,strKey,strValue,iLicensingModeLOCAL
End If
strKey = "SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services"
iLicensingModePOLICY = -1
If ExistsDWORD Then
objReg.GetDWORDValue HKEY_LOCAL_MACHINE,strKey,strValue,iLicensingModePOLICY
End If
If iLicensingModePOLICY <> -1 Then
' Setting is defined in a policy
If iLicensingModePOLICY = 2 Then
strOutput = strOutput & "Licensing Mode is configured as PER DEVICE (via policy)" & vbCrLf
ElseIf iLicensingModePOLICY = 4 Then
strOutput = strOutput & "Licensing Mode is configured as PER USER (via policy)" & vbCrLf
Else
strOutput = strOutput & "Licensing Mode is NOT RECOGNIZED (via policy) : " & iLicensingModePOLICY & vbCrLf
End If
Else
' Setting is not defined in a policy (so local or default setting applies)
If iLicensingModeLOCAL = 2 Then
strOutput = strOutput & "Licensing Mode is configured as PER DEVICE (locally)" & vbCrLf
ElseIf iLicensingModeLOCAL = 4 Then
strOutput = strOutput & "Licensing Mode is configured as PER USER (locally)" & vbCrLf
Else
strOutput = strOutput & "Licensing Mode is NOT RECOGNIZED (locally) : " & iLicensingModeLOCAL & vbCrLf
End If
End If
End If
'-------------------------------------------------------------------------------
' If the server is running in Application Server mode, check the LS list
' (LicenseServers = a comma-separated list of license servers)
'-----------------------------------------------------------------------
Dim strLicenseServers
If iTSAppCompat = 1 Then
strValue = "LicenseServers"
strKey = "SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services"
If ExistsSTRING Then
objReg.GetSTRINGValue HKEY_LOCAL_MACHINE,strKey,strValue,strLicenseServers
strOutput = strOutput & "License servers defined by policy: " & strLicenseServers & vbCrLf
End If
Dim arrLSKeys
strKey = "SYSTEM\CurrentControlSet\Services\TermService\Parameters\LicenseServers"
If objReg.EnumKey(HKEY_LOCAL_MACHINE,strKey,arrLSKeys) = 0 Then
' Key does not exist by default, so if we failed to open it then we skip this
If IsArray(arrLSKeys) Then
Dim i, strName
strOutput = strOutput & "License servers defined locally: "
i = 0
For Each strName In arrLSKeys
If i > 0 Then
strOutput = strOutput & ","
End If
strOutput = strOutput & strName
i = i + 1
Next
strOutput = strOutput & " (" & i & ")" & vbCrLf
End If
End If
If strWindowsVersion = "5.0" Or strWindowsVersion = "5.2" Or strWindowsVersion = "6.0" Then
' Discovery of License Servers is only available before W2K8R2
strKey = "SOFTWARE\Microsoft\MSLicensing\Parameters"
If strWindowsVersion = "6.0" Then
strKey = "SYSTEM\CurrentControlSet\Control\Terminal Server\RCM"
End If
strValue = "DomainLicenseServerMulti"
If ExistsMULTISTRING Then
Dim arrLSNames, strList
objReg.GetMULTISTRINGValue HKEY_LOCAL_MACHINE,strKey,strValue,arrLSNames
i = 0
For Each strName In arrLSNames
' Build the list of names separated with commas, ignoring null strings
If strName <> "" Then
If i > 0 Then
strList = strList & ","
End If
strList = strList & strName
i = i + 1
End If
Next
If i > 0 Then
strOutput = strOutput & "License servers discovered in DOMAIN/WORKGROUP role: " &_
strList & " (" & i & ")" & vbCrLf
End If
End If
strValue = "EnterpriseServerMulti"
If ExistsMULTISTRING Then
objReg.GetMULTISTRINGValue HKEY_LOCAL_MACHINE,strKey,strValue,arrLSNames
i = 0
strList = ""
For Each strName In arrLSNames
' Build the list of names separated with commas, ignoring null strings
If strName <> "" Then
If i > 0 Then
strList = strList & ","
End If
strList = strList & strName
i = i + 1
End If
Next
If i > 0 Then
strOutput = strOutput & "License servers discovered in ENTERPRISE role: " &_
strList & " (" & i & ")" & vbCrLf
End If
End If
End If
End If
'-------------------------------------------------------------------------------
' Output the results to STDOUT (can be piped to a file)
'------------------------------------------------------
WScript.Echo strOutput
WScript.Quit
'===============================================================================
' FUNCTIONS
' As some registry values/keys are optional, these functions allow us to only
' bother trying to read their contents if we have verified they exist...
'===============================================================================
Function ExistsDWORD
Dim DUMMY
If objReg.GetDWORDValue(HKEY_LOCAL_MACHINE,strKey,strValue,DUMMY) <> 0 Then
ExistsDWORD = FALSE
Else
ExistsDWORD = TRUE
End If
End Function
Function ExistsSTRING
Dim DUMMY
If objReg.GetSTRINGValue(HKEY_LOCAL_MACHINE,strKey,strValue,DUMMY) <> 0 Then
ExistsSTRING = FALSE
Else
ExistsSTRING = TRUE
End If
End Function
Function ExistsMULTISTRING
Dim DUMMY
If objReg.GetMULTISTRINGValue(HKEY_LOCAL_MACHINE,strKey,strValue,DUMMY) <> 0 Then
ExistsMULTISTRING = FALSE
Else
ExistsMULTISTRING = TRUE
End If
End Function