KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q251066: HOWTO: Determine If a Computer Is a Microsoft Terminal Server

Article: Q251066
Product(s): Microsoft FoxPro
Version(s): WINDOWS:3.0,3.0b,5.0,5.0a,6.0
Operating System(s): 
Keyword(s): kbAPI kbvfp kbvfp300 kbvfp300b kbvfp500 kbvfp500a kbvfp600 kbGrpDSFox kbDSupport kbCode
Last Modified: 06-APR-2000

-------------------------------------------------------------------------------
The information in this article applies to:

- Microsoft Visual FoxPro for Windows, versions 3.0, 3.0b, 5.0, 5.0a, 6.0 
-------------------------------------------------------------------------------

SUMMARY
=======

This article shows how to determine if a computer is a Microsoft Windows NT or
Windows 2000 Terminal Server.

MORE INFORMATION
================

1. In Visual FoxPro, create a program file using the following code:

  *Start of Code
  LOCAL lTerminalServer

  lTerminalServer = IsTerminalServer()

  IF (lTerminalServer) THEN
     =MESSAGEBOX ("This Computer is a Terminal Server")
  ELSE
     =MESSAGEBOX("This Computer is not a Terminal Server")
  ENDIF

  FUNCTION IsTerminalServer
     * This function will determine if the machine is a Terminal Server.
     * It will return .T. if it is and .F. if not.

     * Constants that are needed for Registry functions
     #DEFINE HKEY_LOCAL_MACHINE -2147483646  && BITSET(0,31)+2
     #DEFINE REG_DWORD 4	                   && A 32-bit number.

     * WIN 32 API functions that are used
     DECLARE Integer RegOpenKey IN Win32API ;
        Integer nHKey, String @cSubKey, Integer @nResult
     DECLARE Integer RegQueryValueEx IN Win32API ;
        Integer nHKey, String lpszValueName, Integer dwReserved,;
        Integer @lpdwType, String @lpbData, Integer @lpcbData
     DECLARE Integer RegCloseKey IN Win32API ;
        Integer nHKey
     DECLARE GetVersionEx IN win32api STRING @OSVERSIONINFO

     * Local variables used
     LOCAL nErrCode	   && Error Code returned from Registry functions
     LOCAL nKeyHandle	   && Handle to Key that is opened in the Registry
     LOCAL lpdwValueType	   && Type of Value that we are looking for
     LOCAL lpbValue	   && The data stored in the value
     LOCAL lpcbValueSize	   && Size of the variable
     LOCAL lpdwReserved	   && Reserved Must be 0
     LOCAL cKey		   && Key we need to open
     LOCAL cValueToGet	   && Value to get
     LOCAL lTerminalServer   && True if it is a Terminal Server
     LOCAL nTSEnabled	   && Numeric value of TSEnabled
     LOCAL OSVersion	   && OS Version
     LOCAL cMajorVersion	   && Just the Version number i.e. 4 or 5
  	
     * Initialize the variables
     cKey = "System\CurrentControlSet\Control\Terminal Server"
     cValueToGet = "TSEnabled"
     nKeyHandle = 0				
     lpdwReserved = 0	       && Must be 0
     lpdwValueType = REG_DWORD
     lpcbValueSize = 4	      && DWORD is 4 bytes
     lTerminalServer = .F.      && Assume it isn't a Terminal Server
     lpbValue = SPACE(4)

     nErrCode = RegOpenKey(HKEY_LOCAL_MACHINE, cKey, @nKeyHandle)
     * If the error code isn't 0, then the key doesn't exist or can't be opened.
     IF (nErrCode # 0) THEN
        RETURN .F.
     ENDIF

     * We need to check and see what version we are running NT 4 and Windows 2000 are different
     OSVersion = LongToStr(148) + REPLICATE(CHR(0), 144)
     =GetVersionEx(@OSVersion)
     nMajorVersion = StrToLong(SUBSTR(OSVersion, 5, 4))
     cMajorVersion = ALLTRIM(STR(nMajorVersion))

     * If it is NT 4 and we made it this far the machine is a Terminal Server
     IF (cMajorVersion = "4") THEN
        * Close the key when done.
        =RegCloseKey(nKeyHandle)
        RETURN .T.
     ENDIF

     * Get the value of TSEnabled. 1 is a Terminal  Server 0 isn't 
     nErrCode=RegQueryValueEx(nKeyHandle, cValueToGet, lpdwReserved, @lpdwValueType, @lpbValue, @lpcbValueSize)

     * Close the key when done.
     =RegCloseKey(nKeyHandle)

     IF (nErrCode # 0) THEN
        RETURN .F.
     ELSE
        nTSEnabled = StrToLong(lpbValue)
     ENDIF
  	
     * Check to see if it is a Terminal Server	
     IF (nTSEnabled = 1) THEN
         RETURN .T.
     ELSE
        RETURN .F.		
     ENDIF
  ENDFUNC	

  FUNCTION StrToLong
  * This function converts a String to a Long
     PARAMETERS cLongStr

     LOCAL nLoopVar, nRetval

     nRetval = 0
     FOR nLoopVar = 0 TO 24 STEP 8
        nRetval = nRetval + (ASC(cLongStr) * (2^nLoopVar))
        cLongStr = RIGHT(cLongStr, LEN(cLongStr) - 1)
     NEXT
  RETURN nRetval

  FUNCTION LongToStr
  * This function converts a long to a string
     PARAMETERS nLongVal

     LOCAL nLoopVar, strReturn

     strReturn = ""
     FOR nLoopVar = 24 TO 0 STEP -8
        strReturn = CHR(INT(nLongVal/(2^nLoopVar))) + strReturn
        nLongVal = MOD(nLongVal, (2^nLoopVar))
     NEXT
  RETURN strReturn
  *End of Code

2. Run the program created in step 1. The result appears in a message box as:

  This computer is a Terminal Server.

  -or-

  This computer is not a Terminal Server.

Additional query words:

======================================================================
Keywords          : kbAPI kbvfp kbvfp300 kbvfp300b kbvfp500 kbvfp500a kbvfp600 kbGrpDSFox kbDSupport kbCodeSnippet 
Technology        : kbVFPsearch kbAudDeveloper kbVFP300 kbVFP300b kbVFP500 kbVFP600 kbVFP500a
Version           : WINDOWS:3.0,3.0b,5.0,5.0a,6.0
Issue type        : kbhowto

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.